Forráskód Böngészése

new working handlers for orders

david.berlinskiy 9 hónapja
szülő
commit
f2b644d0e0

+ 4 - 0
handlers/BotClass.py

@@ -66,3 +66,7 @@ class JabberBot:
             #handler(args)
             handler()
             pass
+    
+    def stop(self):
+        # Disconnect from the Jabber server
+        self.client.disconnect()

+ 24 - 0
handlers/jsonAndRequest.py

@@ -272,6 +272,8 @@ def jsonToOrderTicket(jsonstring) -> OrderTicket:
     u = OrderTicket(**jsonObj)
     return u
 
+
+
 #Функция обращения к апи и получение токена
 def requestGetToken(login, password, url) -> str:
     login = "79999999999"
@@ -351,3 +353,25 @@ def requestGetList(auth_token, url):
                 print(ex)
     print (startlist)
     return startlist
+
+class answer(object):
+    def __init__(self,order_id,provider,answer):
+        self.order_id = order_id
+        self.provider = provider
+        self.answer = answer
+        
+def to_answer(jsonstring):
+    json_answer = json.loads(jsonstring)
+    print(json_answer)
+    u = answer(**json_answer)
+    return u
+
+def change_to_task(localtask,token):
+    headers = {
+        'Authorization': f'Token {token}',
+        'Content-Type': 'application/json'  # Установка заголовка Content-Type
+    }
+    data = json.dumps(localtask.__dict__)
+    print(data)
+    response = requests.patch(config.API_URL+f"/dbsynce/api/orders/{localtask.id}/", headers=headers, data=data)
+    return response

+ 69 - 70
handlers/open_servicerequest_accepted.py

@@ -18,7 +18,7 @@ global tasklist
 
 botname="open_servicerequest_accepted"
 
-operating_status=221
+operating_status='221'
 JID=botname+"@"+config.JSERVER
 PORT=config.PORT
 
@@ -27,10 +27,10 @@ PASSWORD=hashlib.md5((botname+config.PASSWORD).encode('utf-8')).hexdigest()
 print(JID, PASSWORD)
 
 #таким образом хранится список jid, от которых можно получать сообщения этому боту
-listen_to=["test@ej.sharix-app.org", "open_template_bot@ej.sharix-app.org"]
+listen_to=["open_servicerequest_assigned@ej.sharix-app.org"]
 
 #тут хранится список jid, кому бот может отправлять сообщения в результате обработки заявки
-proceed_to=[botname, "open_servicerequest_declined@ej.sharix-app.org", "open_servicerequest_booked@ej.sharix-app.org", "open_servicerequest_assigned@ej.sharix-app.org", "open_servicerequest_forcemajeure@ej.sharix-app.org"]
+proceed_to=[botname,"open_servicerequest_process@ej.sharix-app.org", "open_servicerequest_declined@ej.sharix-app.org", "open_servicerequest_forcemajeure@ej.sharix-app.org"]
 
 #максимальное значение попыток обработать заказ
 idle_value=10
@@ -40,14 +40,9 @@ def message_handler(conn, mess):
     text = mess.getBody()#текст сообщения боту
     user = mess.getFrom()#отправитель сообщения
    
-    print (str(user).split("/")[0])
     if (str(user).split("/")[0]) in listen_to:
-        print(text)
-        print(mess)
-
         if text is not None:
-            orderObj = jsreq.jsonToOrderTicket(text)
-            print (orderObj)
+            orderObj = jsreq.jsonToOrder(text)
             tasklist.append(orderObj)
             bot.bot_log(str(datetime.now())+" Поступивший заказ успешно добавлен в очередь обработки\n")
 
@@ -65,56 +60,59 @@ def open_servicerequest_accepted_wait(period,localtask):
 def open_servicerequest_accepted_process(localtask):
     bot.bot_log(botname + " " + str(datetime.now()) + " " + "Заказ в обработчике\n")
     
-    order = jsreq.jsonToOrder(localtask)
-
-    if order.time_start_predicted < 100:
-        # Заглушка. Проверка может ли заказ быть переназначен
-        if True:
-            # Заглушка. Сбросить пометку предзаказа
-            # ...
-
-
-            bot.proceed_status(proceed_to[2],localtask)
-            bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ отправлен\n")
-        else:
-            bot.proceed_status(proceed_to[1],localtask)
-            bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ отправлен\n")
-    else:
-        # Заглушка. Обработана заявка на устанавление взаимоотношений?
-        if True:
-            # Заглушка. Взаимоотношения установлены ?
-            if True:
-                # Заглушка. Отобразить в предварительных заказах исполнителям.
-                send_message()
-                # Заглушка. Исполнитель откликнулся на заказ?
-                if True:
-                    # У пользователя стоит ручной выбор из нескольких исполнителей?
-                    if True:
-                        # Заглушка создать дочернюю локальную заявку с информацией от исполнителя
-                        create_ticket()
-                        # Заглушка отобразить в предварительных клиенту
-                        send_message()
-
-                        # Заглушка. Клиент выбрал конкретную заявку?
-                        if True:
-                            # Заглушка. обновление локальной копии. Замена основной
-                            pass
-                        else:
-                            bot.proceed_status(proceed_to[3],localtask)
-                            bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ отправлен\n")
-                    else:
-                        bot.proceed_status(proceed_to[3],localtask)
-                        bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ отправлен\n")
-                else:
-                    #Заглушка. Заказ ждет очередную итерацию обработки списка
-                    open_servicerequest_accepted_process(localtask)
-            else:
-                bot.proceed_status(proceed_to[1],localtask)
-                bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ отправлен\n")
-        else:
-            #Заглушка. Заказ ждет очередную итерацию обработки списка
-            open_servicerequest_accepted_process(localtask)
-            pass
+    # order = jsreq.jsonToOrder(localtask)
+    localtask.status='231'
+    jsreq.change_to_task(localtask,token)
+    bot.proceed_status(proceed_to[1],localtask)
+    bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ отправлен\n")
+    # if order.time_start_predicted < 100:
+    #     # Заглушка. Проверка может ли заказ быть переназначен
+    #     if True:
+    #         # Заглушка. Сбросить пометку предзаказа
+    #         # ...
+
+
+    #         bot.proceed_status(proceed_to[1],localtask)
+    #         bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ отправлен\n")
+    #     else:
+    #         bot.proceed_status(proceed_to[2],localtask)
+    #         bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ отправлен\n")
+    # else:
+    #     # Заглушка. Обработана заявка на устанавление взаимоотношений?
+    #     if True:
+    #         # Заглушка. Взаимоотношения установлены ?
+    #         if True:
+    #             # Заглушка. Отобразить в предварительных заказах исполнителям.
+    #             send_message()
+    #             # Заглушка. Исполнитель откликнулся на заказ?
+    #             if True:
+    #                 # У пользователя стоит ручной выбор из нескольких исполнителей?
+    #                 if True:
+    #                     # Заглушка создать дочернюю локальную заявку с информацией от исполнителя
+    #                     create_ticket()
+    #                     # Заглушка отобразить в предварительных клиенту
+    #                     send_message()
+
+    #                     # Заглушка. Клиент выбрал конкретную заявку?
+    #                     if True:
+    #                         # Заглушка. обновление локальной копии. Замена основной
+    #                         pass
+    #                     else:
+    #                         bot.proceed_status(proceed_to[3],localtask)
+    #                         bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ отправлен\n")
+    #                 else:
+    #                     bot.proceed_status(proceed_to[3],localtask)
+    #                     bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ отправлен\n")
+    #             else:
+    #                 #Заглушка. Заказ ждет очередную итерацию обработки списка
+    #                 open_servicerequest_accepted_process(localtask)
+    #         else:
+    #             bot.proceed_status(proceed_to[1],localtask)
+    #             bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ отправлен\n")
+    #     else:
+    #         #Заглушка. Заказ ждет очередную итерацию обработки списка
+    #         open_servicerequest_accepted_process(localtask)
+    #         pass
     
 
 def send_message():
@@ -130,10 +128,14 @@ def open_servicerequest_accepted():
         print("EACH TASKLIST", tasklist)
 
         if (localtask.status!=operating_status):
+            localtask.status=239
+            jsreq.change_to_task(localtask,token)
             bot.proceed_status(proceed_to[-1],localtask)
             bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ не по адресу, перенаправляем на форсмажор\n")
             continue
-
+        elif True:
+            t1=threading.Thread(target=open_servicerequest_accepted_process, args=([localtask]))
+            t1.start()
         # if (localtask.title!="10"):
         #     t1=threading.Thread(target=open_servicerequest_booked_wait, args=(5,localtask))
         #     t1.start()
@@ -142,13 +144,12 @@ def open_servicerequest_accepted():
         #     t1=threading.Thread(target=open_servicerequest_booked_process, args=(10,localtask))
         #     t1.start()
 
-        t1=threading.Thread(target=open_servicerequest_accepted_process, args=(localtask))
-        t1.start()
+        
 
-        #если никакие обработчики не подошли - отправляем обратно в очередь
-        bot.proceed_status(proceed_to[0],localtask)
-        print("Заказ возвращен в очередь\n")
-        print(tasklist)
+        # #если никакие обработчики не подошли - отправляем обратно в очередь
+        # bot.proceed_status(proceed_to[0],localtask)
+        # print("Заказ возвращен в очередь\n")
+        # print(tasklist)
 
 #Авторизация и запуск бота
 
@@ -156,11 +157,9 @@ def open_servicerequest_accepted():
 tasklist = []
 
 #надо инициализировать tasklist при запуске из API
-token = jsreq.requestGetToken(botname, PASSWORD, config.API_URL+"/auth/token/login/")
-
+token = jsreq.requestGetToken(botname, PASSWORD, config.API_URL+"my/api/v1/auth/token/login/")
 #ВАЖНО! Надо еще фильтровать список по статусу обработки заявки
-tasklist=jsreq.requestGetList(token, config.API_URL+"/tickets/api/tickets/?list_id=10")
-print (len(tasklist))
+tasklist_dbsynce=jsreq.requestGetList(token, config.API_URL+"/dbsynce/api/orders/")
 
 bot = JabberBot(JID, PASSWORD, PORT)
 

+ 62 - 60
handlers/open_servicerequest_assigned.py

@@ -10,6 +10,7 @@ from datetime import datetime
 
 import time
 import threading
+import asyncio
 
 #test
 import jsonAndRequest as jsreq
@@ -18,7 +19,7 @@ global tasklist
 
 botname="open_servicerequest_assigned"
 
-operating_status=212
+operating_status='212'
 JID=botname+"@"+config.JSERVER
 PORT=config.PORT
 
@@ -26,6 +27,7 @@ PASSWORD=hashlib.md5((botname+config.PASSWORD).encode('utf-8')).hexdigest()
 
 print(JID, PASSWORD)
 
+drivers = ["799999999998@ej.sharix-app.org"]
 #таким образом хранится список jid, от которых можно получать сообщения этому боту
 listen_to=["open_servicerequest_booked@ej.sharix-app.org","open_servicerequest_pending@ej.sharix-app.org"]
 
@@ -39,18 +41,15 @@ idle_value=10
 def message_handler(conn, mess):
     text = mess.getBody()#текст сообщения боту
     user = mess.getFrom()#отправитель сообщения
-   
-    print (str(user).split("/")[0])
     if (str(user).split("/")[0]) in listen_to:
-        print(text)
-        print(mess)
+        print('order_handler')
 
         if text is not None:
             orderObj = jsreq.jsonToOrder(text)
-            print (orderObj)
             tasklist.append(orderObj)
             bot.bot_log(str(datetime.now())+" Поступивший заказ успешно добавлен в очередь обработки\n")
-
+        
+            
 def open_servicerequest_assigned_wait(period,localtask):
     bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ ожидает\n")
     time.sleep(period)
@@ -62,66 +61,66 @@ def open_servicerequest_assigned_wait(period,localtask):
     bot.proceed_status(proceed_to[0],localtask)
     bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ подождал и отправлен в очередь\n")
 
+def wait_for_answer(localtask):
+    order = localtask
+    driver = drivers[0]
+    send_message(order,driver)      # Здесь можно реализовать логику выбора водителя
+    while True:
+        if len(answers) > 0:
+            answer = answers.pop(0)
+            if answer.answer == 'Accept':
+                localtask.status='221'
+                jsreq.change_to_task(localtask,token)    
+                bot.proceed_status(proceed_to[1], localtask)
+                bot.bot_log(botname + " " + str(datetime.now()) + f" Заказ отправлен на {proceed_to[1]}\n")
+            else:
+                localtask.status='229'
+                localtask.provider=None
+                jsreq.change_to_task(localtask,token)
+                bot.proceed_status(proceed_to[2], localtask)
+                bot.bot_log(botname + " " + str(datetime.now()) + f" Заказ отправлен на {proceed_to[2]}\n")
+            break
+        else:
+            print("Ожидание ответа...")
+            time.sleep(1)
+
 def open_servicerequest_assigned_process(localtask):
     bot.bot_log(botname + " " + str(datetime.now()) + " " + "Заказ в обработчике\n")
-    
-    order = jsreq.jsonToOrder(localtask)
-
-    if provider!=None:
-        send_message(order)
-        if check_order(order)
-
-
-    # Заглушка проверка бронирования без подтверждения
-    # if True:
-    #     bot.proceed_status(proceed_to[0],localtask)
-    #     bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ отправлен\n")
-    # else:
-    #     if order.asap:
-    #         # Заглушка. Отображение ответственному в приложении показывается заказ
-    #         send_message(order)
-    #         check_order(order)
-    #     else:
-    #         # Заглушка. Отображение в предварительных заказах назначенному исполнителю
-    #         send_message()
-    #         # Заглушка
-    #         if order.time_start_predicted > 100:
-    #             bot.proceed_status(proceed_to[0],localtask)
-    #             bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ подождал и отправлен в очередь\n")
-    #             return
-    #         # Заглушка. Отображение ответственному в приложении показывается заказ
-    #         send_message()
-    #         check_order(order)
-
-def check_order(localtask):
-    # Заглушка. Заказ принят?
-    if localtask:
-        bot.proceed_status(proceed_to[1],localtask)
-        bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ отправлен\n")
-    else:
-        bot.proceed_status(proceed_to[2],localtask)
-        bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ отправлен\n")
-
+    order = localtask
+    if order.provider!=None:
+        wait_thread = threading.Thread(target=wait_for_answer, args=(localtask,))
+        wait_thread.start()
 
 
+def message_answer(conn, mess):       
+    text = mess.getBody()#текст сообщения боту
+    user = mess.getFrom()#отправитель сообщения
+    if (str(user).split("/")[0]) in drivers:
+        print ('answer_handler')
+        if text is not None:
+            answerObj = jsreq.to_answer(text)
+            answers.append(answerObj)
+            bot.bot_log(str(datetime.now())+" Поступивший ответ успешно добавлен в очередь обработки\n")
+            
+    
+def send_message(order,driver):
+    order=json.dumps(order.__dict__)
+    bot.send_notification(driver,order)   
 
 
 def open_servicerequest_assigned():
     while (len(tasklist)):
-        
         localtask=tasklist.pop(0)
-        bot.bot_log(botname + " " + datetime.now().strftime('%Y-%m-%d') + " "+ "Заказ в очереди на обработке\n")
-        print("EACH TASKLIST", tasklist)
-
         if (localtask.status!=operating_status):
+            localtask.status='239'
+            jsreq.change_to_task(localtask,token)
             bot.proceed_status(proceed_to[-1],localtask)
             bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ не по адресу, перенаправляем на форсмажор\n")
             continue
         else:
             bot.bot_log(botname + " " + datetime.now().strftime('%Y-%m-%d') + " "+ "Заказ в очереди на обработке\n")
-            t1=threading.Thread(target=open_servicerequest_assigned_wait, args=([localtask]))
+            t1=threading.Thread(target=open_servicerequest_assigned_process, args=([localtask]))
             t1.start()
-            continue
         # if (localtask.title!="10"):
         #     t1=threading.Thread(target=open_servicerequest_booked_wait, args=(5,localtask))
         #     t1.start()
@@ -130,27 +129,30 @@ def open_servicerequest_assigned():
         #     t1=threading.Thread(target=open_servicerequest_booked_process, args=(10,localtask))
         #     t1.start()
 
-        t1=threading.Thread(target=open_servicerequest_assigned_process, args=(localtask))
-        t1.start()
+        # t1=threading.Thread(target=open_servicerequest_assigned_process, args=(localtask))
+        # t1.start()
 
         #если никакие обработчики не подошли - отправляем обратно в очередь
-        bot.proceed_status(proceed_to[0],localtask)
-        print("Заказ возвращен в очередь\n")
-        print(tasklist)
+        # bot.proceed_status(proceed_to[0],localtask)
+        # print("Заказ возвращен в очередь\n")
+        # print(tasklist)
 
 #Авторизация и запуск бота
 
+answers = []
 #пустой список заказов
 tasklist = []
 
 #надо инициализировать tasklist при запуске из API
 token = jsreq.requestGetToken(botname, PASSWORD, config.API_URL+"my/api/v1/auth/token/login/")
 #ВАЖНО! Надо еще фильтровать список по статусу обработки заявки
-tasklist_database=jsreq.requestGetList(token, config.API_URL+"/dbsynce/api/orders/")
-# print (len(tasklist))
+tasklist_dbsynce=jsreq.requestGetList(token, config.API_URL+"/dbsynce/api/orders/")
 
-bot = JabberBot(JID, PASSWORD, PORT)
 
+bot = JabberBot(JID, PASSWORD, PORT)
 bot.register_handler('message', message_handler)
-print(tasklist)
+bot.register_handler('message', message_answer)
 bot.start(open_servicerequest_assigned)
+
+
+#Добавить функцию поток для ожидания получения заказа.

+ 25 - 17
handlers/open_servicerequest_booked.py

@@ -85,19 +85,26 @@ def open_servicerequest_booked_process(localtask):
         #     pass
         # price = localtask.real_price
         #Заказ на основного водителя?
+    
     if not localtask.provider:
+        answer,provider = set_provider(localtask.id)
+        print(answer,provider)
         if set_provider(localtask.id):
             print('Водитель успешно установлен')
-        
-        
+        else:
+            print('Ошибка водитель не был установлен')
+        localtask.provider = provider
+    current_time = datetime.now()
+    
+    # if localtask.asap or (current_time - datetime.fromisoformat(localtask.time_start_predicted) < timedelta(hours=3)):
     if localtask.asap:
-        
-        localtask.status = 220
+        localtask.status = '212'
+        jsreq.change_to_task(localtask,token)
         bot.proceed_status(proceed_to[0], localtask)
         bot.bot_log(botname + " " + str(datetime.now()) + " " + "Заказ успешно обработан и отправлен на assigned\n")
     else:
-        
-        localtask.status = 212
+        localtask.status = '220'
+        jsreq.change_to_task(localtask,token)
         bot.proceed_status(proceed_to[1], localtask)
         bot.bot_log(botname + " " + str(datetime.now()) + " " + "Заказ успешно обработан и отправлен на pending\n")
         
@@ -133,20 +140,20 @@ def get_balance(client):
             print(ex)
             
 #set provider?
-def choose_provider(headers,geo):
-    providers=requests.get(config.API_URL+"/dbsynce/api/provider/",headers=headers)
+def choose_provider(auth_token,geo):
+    providers=requests.get(config.API_URL+"/dbsynce/api/provider/",headers=auth_token)
     provider=providers.json()[0]['id']
     return provider
     
 def set_provider(localtask_id):
-    
+    token = jsreq.requestGetToken(botname, PASSWORD, config.API_URL+"my/api/v1/auth/token/login/")
     headers = {'Authorization': f'Token {token}'}
     provider = choose_provider(headers,'geoposition')
-    print(provider)
-    data = {'provider':f'{provider}',}
-    print(str(config.API_URL+f"/dbsynce/api/orders/{localtask_id}/"))
-    response = requests.post(config.API_URL+f"/dbsynce/api/orders/{localtask_id}/", headers=headers, json=data)
-    return response
+    data = {'provider':int(provider)}
+    # print(data)
+    # print(str(config.API_URL+f"/dbsynce/api/orders/{localtask_id}/"))
+    response = requests.patch(config.API_URL+f"/dbsynce/api/orders/{localtask_id}/", headers=headers, json=data)
+    return response ,provider
 
     
     # if not ordertext:
@@ -164,14 +171,15 @@ def open_servicerequest_booked():
         localtask=tasklist.pop(0)
         if (str(localtask.status)!=str(operating_status)):
             # bot.proceed_status(proceed_to[-1],localtask) #временная проверка отправки
+            localtask.status=239
+            jsreq.change_to_task(localtask,token)
             bot.proceed_status(proceed_to[-1],localtask)
             bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ не по адресу, перенаправляем на форсмажор\n")
-            
+            continue
         else:
             bot.bot_log(botname + " " + datetime.now().strftime('%Y-%m-%d') + " "+ "Заказ в очереди на обработке\n")
             t1=threading.Thread(target=open_servicerequest_booked_process, args=([localtask]))
             t1.start()
-            continue
         # elif (localtask.provider==T):
         #     t1=threading.Thread(target=open_servicerequest_booked_wait, args=(5,localtask))
         #     t1.start()
@@ -194,7 +202,7 @@ tasklist = []
 # #надо инициализировать tasklist при запуске из API
 token = jsreq.requestGetToken(botname, PASSWORD, config.API_URL+"my/api/v1/auth/token/login/")
 # #ВАЖНО! Надо еще фильтровать список по статусу обработки заявки
-tasklist=jsreq.requestGetList(token, config.API_URL+"/dbsynce/api/orders/")
+tasklist_dbsynce=jsreq.requestGetList(token, config.API_URL+"/dbsynce/api/orders/") ###Должна быть проверка между двумя
 
 # # print (len(tasklist))
 

+ 118 - 0
handlers/open_servicerequest_closed.py

@@ -0,0 +1,118 @@
+import requests
+import xmpp
+from xmpp import cli
+import config
+from BotClass import JabberBot
+import json
+#раскомментировать, когда перейдем на разные пароли
+import hashlib
+from datetime import datetime
+
+import time
+import threading
+
+#test
+import jsonAndRequest as jsreq
+
+global tasklist
+
+botname="open_servicerequest_closed"
+
+operating_status=239
+JID=botname+"@"+config.JSERVER
+PORT=config.PORT
+
+PASSWORD=hashlib.md5((botname+config.PASSWORD).encode('utf-8')).hexdigest()
+
+print(JID, PASSWORD)
+
+#таким образом хранится список jid, от которых можно получать сообщения этому боту
+listen_to=["799999999990@ej.sharix-app.org"]
+
+#тут хранится список jid, кому бот может отправлять сообщения в результате обработки заявки
+proceed_to=[botname, "open_strequest_new@ej.sharix-app.org", "open_servicerequest_closed@ej.sharix-app.org", "open_servicerequest_forcemajeure@ej.sharix-app.org"]
+
+#максимальное значение попыток обработать заказ
+idle_value=10
+
+
+# обработчик входящих сообщений
+def message_handler(conn, mess):
+    text = mess.getBody()#текст сообщения боту
+    user = mess.getFrom()#отправитель сообщения
+   
+    print (str(user).split("/")[0])
+    if (str(user).split("/")[0]) in listen_to:
+        print(text)
+        print(mess)
+
+        if text is not None:
+            orderObj = jsreq.jsonToOrder(text)
+            print (orderObj)
+            tasklist.append(orderObj)
+            bot.bot_log(str(datetime.now())+" Поступивший заказ успешно добавлен в очередь обработки\n")
+
+def open_servicerequest_closed_wait(period,localtask):
+    bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ ожидает\n")
+    time.sleep(period)
+    
+    #ВАЖНО! Надо скорее всего через API редактировать заказ, иначе возможна потеря данных
+    localtask.title=localtask.title+"1"
+
+    #обязательно данный обработчик должен заканчиваться передачей заказа куда-то на обработку дальше - обратно или другому, иначе оно потеряется
+    bot.proceed_status(proceed_to[0],localtask)
+    bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ подождал и отправлен в очередь\n")
+
+def open_servicerequest_closed_process(localtask):
+    bot.bot_log(botname + " " + str(datetime.now()) + " " + "Заказ в обработчике\n")
+    
+    order = jsreq.jsonToOrder(localtask)
+
+    
+    bot.proceed_status(proceed_to[2],localtask)
+    bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ отправлен\n")
+
+
+
+def open_servicerequest_closed():
+    while (len(tasklist)):
+        localtask=tasklist.pop(0)
+        bot.bot_log(botname + " " + datetime.now().strftime('%Y-%m-%d') + " "+ "Заказ в очереди на обработке\n")
+        print("EACH TASKLIST", tasklist)
+
+        if (localtask.status!=operating_status):
+            bot.proceed_status(proceed_to[-1],localtask)
+            bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ не по адресу, перенаправляем на форсмажор\n")
+            continue
+
+        # if (localtask.title!="10"):
+        #     t1=threading.Thread(target=open_servicerequest_booked_wait, args=(5,localtask))
+        #     t1.start()
+
+        # if (localtask.title=="101"):
+        #     t1=threading.Thread(target=open_servicerequest_booked_process, args=(10,localtask))
+        #     t1.start()
+
+        t1=threading.Thread(target=open_servicerequest_closed_process, args=(localtask))
+        t1.start()
+
+        #если никакие обработчики не подошли - отправляем обратно в очередь
+        bot.proceed_status(proceed_to[0],localtask)
+        print("Заказ возвращен в очередь\n")
+        print(tasklist)
+
+#Авторизация и запуск бота
+
+#пустой список заказов
+tasklist = []
+
+#надо инициализировать tasklist при запуске из API
+token = jsreq.requestGetToken(botname, PASSWORD, config.API_URL+"my/api/v1/auth/token/login/")
+#ВАЖНО! Надо еще фильтровать список по статусу обработки заявки
+tasklist_dbsynce=jsreq.requestGetList(token, config.API_URL+"/dbsynce/api/orders/")
+print (len(tasklist))
+
+bot = JabberBot(JID, PASSWORD, PORT)
+
+bot.register_handler('message', message_handler)
+bot.start(open_servicerequest_closed)

+ 3 - 4
handlers/open_servicerequest_declined.py

@@ -46,7 +46,7 @@ def message_handler(conn, mess):
         print(mess)
 
         if text is not None:
-            orderObj = jsreq.jsonToOrderTicket(text)
+            orderObj = jsreq.jsonToOrder(text)
             print (orderObj)
             tasklist.append(orderObj)
             bot.bot_log(str(datetime.now())+" Поступивший заказ успешно добавлен в очередь обработки\n")
@@ -117,10 +117,9 @@ def open_servicerequest_declined():
 tasklist = []
 
 #надо инициализировать tasklist при запуске из API
-token = jsreq.requestGetToken(botname, PASSWORD, config.API_URL+"/auth/token/login/")
-
+token = jsreq.requestGetToken(botname, PASSWORD, config.API_URL+"my/api/v1/auth/token/login/")
 #ВАЖНО! Надо еще фильтровать список по статусу обработки заявки
-tasklist=jsreq.requestGetList(token, config.API_URL+"/tickets/api/tickets/?list_id=10")
+tasklist_dbsynce=jsreq.requestGetList(token, config.API_URL+"/dbsynce/api/orders/")
 print (len(tasklist))
 
 bot = JabberBot(JID, PASSWORD, PORT)

+ 9 - 6
handlers/open_servicerequest_done.py

@@ -18,7 +18,7 @@ global tasklist
 
 botname="open_servicerequest_done"
 
-operating_status=239
+operating_status='241'
 JID=botname+"@"+config.JSERVER
 PORT=config.PORT
 
@@ -26,8 +26,12 @@ PASSWORD=hashlib.md5((botname+config.PASSWORD).encode('utf-8')).hexdigest()
 
 print(JID, PASSWORD)
 
+users = ["799999999990@ej.sharix-app.org"]
+
+drivers = ["799999999998@ej.sharix-app.org"]
+
 #таким образом хранится список jid, от которых можно получать сообщения этому боту
-listen_to=["test@ej.sharix-app.org", "open_template_bot@ej.sharix-app.org"]
+listen_to=["open_servicerequest_process@ej.sharix-app.org"]
 
 #тут хранится список jid, кому бот может отправлять сообщения в результате обработки заявки
 proceed_to=[botname, "open_strequest_new@ej.sharix-app.org", "open_servicerequest_closed@ej.sharix-app.org", "open_servicerequest_forcemajeure@ej.sharix-app.org"]
@@ -48,7 +52,7 @@ def message_handler(conn, mess):
         print(mess)
 
         if text is not None:
-            orderObj = jsreq.jsonToOrderTicket(text)
+            orderObj = jsreq.jsonToOrder(text)
             print (orderObj)
             tasklist.append(orderObj)
             bot.bot_log(str(datetime.now())+" Поступивший заказ успешно добавлен в очередь обработки\n")
@@ -126,10 +130,9 @@ def open_servicerequest_done():
 tasklist = []
 
 #надо инициализировать tasklist при запуске из API
-token = jsreq.requestGetToken(botname, PASSWORD, config.API_URL+"/auth/token/login/")
-
+token = jsreq.requestGetToken(botname, PASSWORD, config.API_URL+"my/api/v1/auth/token/login/")
 #ВАЖНО! Надо еще фильтровать список по статусу обработки заявки
-tasklist=jsreq.requestGetList(token, config.API_URL+"/tickets/api/tickets/?list_id=10")
+tasklist_dbsynce=jsreq.requestGetList(token, config.API_URL+"/dbsynce/api/orders/")
 print (len(tasklist))
 
 bot = JabberBot(JID, PASSWORD, PORT)

+ 1 - 1
handlers/open_servicerequest_forcemajeure.py

@@ -124,7 +124,7 @@ tasklist = []
 token = jsreq.requestGetToken(botname, PASSWORD, config.API_URL+"/auth/token/login/")
 
 #ВАЖНО! Надо еще фильтровать список по статусу обработки заявки
-tasklist=jsreq.requestGetList(token, config.API_URL+"/tickets/api/tickets/?list_id=10")
+tasklist_dbsynce=jsreq.requestGetList(token, config.API_URL+"/tickets/api/tickets/?list_id=10")
 print (len(tasklist))
 
 bot = JabberBot(JID, PASSWORD, PORT)

+ 21 - 14
handlers/open_servicerequest_pending.py

@@ -18,7 +18,7 @@ global tasklist
 
 botname="open_servicerequest_pending"
 
-operating_status=220
+operating_status='220'
 JID=botname+"@"+config.JSERVER
 PORT=config.PORT
 
@@ -37,6 +37,7 @@ idle_value=10
 
 # обработчик входящих сообщений
 def message_handler(conn, mess):
+    
     text = mess.getBody()#текст сообщения боту
     user = mess.getFrom()#отправитель сообщения
    
@@ -69,22 +70,24 @@ def open_servicerequest_pending_process(localtask):
 
     # Заглушка. Может ли что-то пойти не так
     if True:
-        if order.time_start_predicted < 100:
+        if order.time_start_predicted < time.time():
             bot.proceed_status(proceed_to[0],localtask)
             bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ подождал и отправлен в очередь\n")
             return
         # Заглушка активная ли стадия заказа
-        if order.status == "active":
+        else: order.status == "active":
+            localtask.status=212
+            jsreq.change_to_task(localtask,token)
             bot.proceed_status(proceed_to[1],localtask)
             bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ отправлен\n")
-        else:
-            bot.proceed_status(proceed_to[2],localtask)
-            bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ отправлен\n")
-            # Заглушка на получение ответа
-            pass
-    else:
-        bot.proceed_status(proceed_to[1],localtask)
-        bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ отправлен\n")
+        # else:
+        #     bot.proceed_status(proceed_to[2],localtask)
+        #     bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ отправлен\n")
+        #     # Заглушка на получение ответа
+        #     pass
+    # else:
+    #     bot.proceed_status(proceed_to[1],localtask)
+    #     bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ отправлен\n")
 
 
 def send_message():
@@ -97,6 +100,8 @@ def open_servicerequest_pending():
         # print("EACH TASKLIST", tasklist)
 
         if (localtask.status!=operating_status):
+            localtask.status=239
+            jsreq.change_to_task(localtask,token)
             bot.proceed_status(proceed_to[-1],localtask)
             bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ не по адресу, перенаправляем на форсмажор\n")
             continue
@@ -109,7 +114,7 @@ def open_servicerequest_pending():
         #     t1=threading.Thread(target=open_servicerequest_booked_process, args=(10,localtask))
         #     t1.start()
 
-        t1=threading.Thread(target=open_servicerequest_pending_process, args=(localtask))
+        t1=threading.Thread(target=open_servicerequest_pending_process, args=([localtask]))
         t1.start()
 
         #если никакие обработчики не подошли - отправляем обратно в очередь
@@ -124,10 +129,12 @@ tasklist = []
 
 token = jsreq.requestGetToken(botname, PASSWORD, config.API_URL+"my/api/v1/auth/token/login/")
 #ВАЖНО! Надо еще фильтровать список по статусу обработки заявки
-tasklist_database=jsreq.requestGetList(token, config.API_URL+"/dbsynce/api/orders/")
+tasklist_dbsynce=jsreq.requestGetList(token, config.API_URL+"/dbsynce/api/orders/")
 # print (len(tasklist))
 
 bot = JabberBot(JID, PASSWORD, PORT)
 
 bot.register_handler('message', message_handler)
-bot.start(open_servicerequest_pending)
+bot.start(open_servicerequest_pending)
+
+#Получение сообщения от водителя

+ 71 - 37
handlers/open_servicerequest_process.py

@@ -18,7 +18,7 @@ global tasklist
 
 botname="open_servicerequest_process"
 
-operating_status=231
+operating_status='231'
 JID=botname+"@"+config.JSERVER
 PORT=config.PORT
 
@@ -26,11 +26,14 @@ PASSWORD=hashlib.md5((botname+config.PASSWORD).encode('utf-8')).hexdigest()
 
 print(JID, PASSWORD)
 
+
+drivers = ["799999999998@ej.sharix-app.org"]
+
 #таким образом хранится список jid, от которых можно получать сообщения этому боту
-listen_to=["test@ej.sharix-app.org", "open_template_bot@ej.sharix-app.org"]
+listen_to=["open_servicerequest_accepted@ej.sharix-app.org"]
 
 #тут хранится список jid, кому бот может отправлять сообщения в результате обработки заявки
-proceed_to=[botname, "open_servicerequest_preforcemajeure@ej.sharix-app.org", "open_servicerequest_declined@ej.sharix-app.org", "open_servicerequest_forcemajeure@ej.sharix-app.org"]
+proceed_to=[botname,"open_servicerequest_done@ej.sharix-app.org", "open_servicerequest_preforcemajeure@ej.sharix-app.org", "open_servicerequest_declined@ej.sharix-app.org", "open_servicerequest_forcemajeure@ej.sharix-app.org"]
 
 #максимальное значение попыток обработать заказ
 idle_value=10
@@ -39,18 +42,24 @@ idle_value=10
 def message_handler(conn, mess):
     text = mess.getBody()#текст сообщения боту
     user = mess.getFrom()#отправитель сообщения
-   
-    print (str(user).split("/")[0])
     if (str(user).split("/")[0]) in listen_to:
-        print(text)
-        print(mess)
-
         if text is not None:
-            orderObj = jsreq.jsonToOrderTicket(text)
+            orderObj = jsreq.jsonToOrder(text)
             print (orderObj)
             tasklist.append(orderObj)
             bot.bot_log(str(datetime.now())+" Поступивший заказ успешно добавлен в очередь обработки\n")
 
+
+def message_answer(conn, mess):       
+    text = mess.getBody()#текст сообщения боту
+    user = mess.getFrom()#отправитель сообщения
+    if (str(user).split("/")[0]) in drivers:
+        print ('answer_handler')
+        if text is not None:
+            answerObj = jsreq.to_answer(text)
+            answers.append(answerObj)
+            bot.bot_log(str(datetime.now())+" Поступивший ответ успешно добавлен в очередь обработки\n")
+
 def open_servicerequest_process_wait(period,localtask):
     bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ ожидает\n")
     time.sleep(period)
@@ -62,27 +71,52 @@ def open_servicerequest_process_wait(period,localtask):
     bot.proceed_status(proceed_to[0],localtask)
     bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ подождал и отправлен в очередь\n")
 
+def wait_for_answer(localtask):
+    order = localtask
+    # Здесь можно реализовать логику выбора водителя
+    while True:
+        if len(answers) > 0:
+            answer = answers.pop(0)
+            if answer.answer == 'Complete':
+                localtask.status='241'
+                jsreq.change_to_task(localtask,token)    
+                bot.proceed_status(proceed_to[1], localtask)
+                bot.bot_log(botname + " " + str(datetime.now()) + f" Заказ отправлен на {proceed_to[1]}\n")
+            break
+        else:
+            print("Ожидание ответа...")
+            time.sleep(30)
+
+def open_servicerequest_assigned_process(localtask):
+    bot.bot_log(botname + " " + str(datetime.now()) + " " + "Заказ в обработчике\n")
+    order = localtask
+    if order.provider!=None:
+        wait_thread = threading.Thread(target=wait_for_answer, args=(localtask,))
+        wait_thread.start()
+        
 def open_servicerequest_process_process(localtask):
     bot.bot_log(botname + " " + str(datetime.now()) + " " + "Заказ в обработчике\n")
-    
-    order = jsreq.jsonToOrder(localtask)
+    order = localtask
+    wait_thread = threading.Thread(target=wait_for_answer, args=(localtask,))#ожидание выполнения заказа
+    wait_thread.start()
 
     # Заглушка проверка баланса
-    if check_balance() >= order.real_price:
-        # Заглушка. Расчетное время прибытия на следующую точку превышаетзапланированное на Х
-        if True:
-            bot.proceed_status(proceed_to[1],localtask)
-            bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ отправлен\n")
-        else:
-            bot.proceed_status(proceed_to[0],localtask)
-            bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ подождал и отправлен в очередь\n")
-    else:
-        # Оплата
-
-        bot.proceed_status(proceed_to[1],localtask)
-        bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ отправлен\n")
+    # if check_balance() >= order.real_price:
+    # if True:
+    #     # Заглушка. Расчетное время прибытия на следующую точку превышаетзапланированное на Х
+    #     if True:
+    #         bot.proceed_status(proceed_to[1],localtask)
+    #         bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ отправлен\n")
+    #     else:
+    #         bot.proceed_status(proceed_to[0],localtask)
+    #         bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ подождал и отправлен в очередь\n")
+    # else:
+    #     # Оплата
+
+    #     bot.proceed_status(proceed_to[1],localtask)
+    #     bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ отправлен\n")
         
-        pass
+    #     pass
 
 
 def check_balance():
@@ -92,9 +126,9 @@ def open_servicerequest_process():
     while (len(tasklist)):
         localtask=tasklist.pop(0)
         bot.bot_log(botname + " " + datetime.now().strftime('%Y-%m-%d') + " "+ "Заказ в очереди на обработке\n")
-        print("EACH TASKLIST", tasklist)
-
         if (localtask.status!=operating_status):
+            localtask.status='239'
+            jsreq.change_to_task(localtask,token)
             bot.proceed_status(proceed_to[-1],localtask)
             bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ не по адресу, перенаправляем на форсмажор\n")
             continue
@@ -107,27 +141,27 @@ def open_servicerequest_process():
         #     t1=threading.Thread(target=open_servicerequest_booked_process, args=(10,localtask))
         #     t1.start()
 
-        t1=threading.Thread(target=open_servicerequest_process_process, args=(localtask))
+        t1=threading.Thread(target=open_servicerequest_process_process, args=[localtask])
         t1.start()
 
         #если никакие обработчики не подошли - отправляем обратно в очередь
-        bot.proceed_status(proceed_to[0],localtask)
-        print("Заказ возвращен в очередь\n")
-        print(tasklist)
+        # bot.proceed_status(proceed_to[0],localtask)
+        # print("Заказ возвращен в очередь\n")
+        # print(tasklist)
 
 #Авторизация и запуск бота
 
+answers = []
 #пустой список заказов
 tasklist = []
 
 #надо инициализировать tasklist при запуске из API
-token = jsreq.requestGetToken(botname, PASSWORD, config.API_URL+"/auth/token/login/")
-
+token = jsreq.requestGetToken(botname, PASSWORD, config.API_URL+"my/api/v1/auth/token/login/")
 #ВАЖНО! Надо еще фильтровать список по статусу обработки заявки
-tasklist=jsreq.requestGetList(token, config.API_URL+"/tickets/api/tickets/?list_id=10")
-print (len(tasklist))
+tasklist_dbsynce=jsreq.requestGetList(token, config.API_URL+"/dbsynce/api/orders/")
 
-bot = JabberBot(JID, PASSWORD, PORT)
 
+bot = JabberBot(JID, PASSWORD, PORT)
 bot.register_handler('message', message_handler)
-bot.start(open_servicerequest_process_process)
+bot.register_handler('message', message_answer)
+bot.start(open_servicerequest_process)

+ 3 - 0
handlers/starter.sh

@@ -3,5 +3,8 @@
 python3 open_servicerequest_booked.py
 python3 open_servicerequest_assigned.py
 python3 open_servicerequest_pending.py
+python3 open_servicerequest_accepted.py
+python3 open_servicerequest_process.py
+python3 open_servicerequest_done.py