Browse Source

order processing simplyfied and debugged

Dev Server 1 year ago
parent
commit
a7df4f8489
2 changed files with 54 additions and 53 deletions
  1. 4 1
      BotClass.py
  2. 50 52
      open_template_bot.py

+ 4 - 1
BotClass.py

@@ -51,6 +51,7 @@ class JabberBot:
         logfile = open(datetime.now().strftime('%Y-%m-%d') + "-" + self.user + ".log", "a")
         logfile.write(message)
         logfile.close()
+        print (message)
         #cli.send_message(self.user, self.password, "test@ej.sharix-app.org", message)
 
     # recipient - это конкретный jid следующего обработчика заявки, ticket - json с заявкой.
@@ -58,8 +59,10 @@ class JabberBot:
         #тут могут быть различные проверки дополнительные, а так вообще эта функция нужна для передачи заявки на обработку следующему
         #TODO - почему-то тут валится, пока заменено на затычку
         #cli.send_message(self.user, self.password, recipient, ticket)
+        #jsonTicket = json.dumps(ticket.__dict__)
         self.conn.send(xmpp.Message(recipient, ticket))
-        print ("Message sent successfully", recipient, ticket)
+        self.bot_log("Message sent successfully"+" "+recipient+" "+ticket)
+        #print ("Message sent successfully", recipient, ticket)
 
     #сюда можно как параметры передавать переменную для значения Process в вызываемой функции, а также передавать информацию о том, какой из обработчиков ввызывать в бесконечном цикле
     def start(self, handler, *args):

+ 50 - 52
open_template_bot.py

@@ -20,6 +20,7 @@ global process_status
 
 # botname="open_strequest_assigned"
 botname="open_template_bot"
+operating_status=210
 JID=botname+"@"+config.JSERVER
 PORT=config.PORT
 
@@ -29,10 +30,10 @@ PASSWORD=hashlib.md5((botname+config.PASSWORD).encode('utf-8')).hexdigest()
 print(JID, PASSWORD)
 
 #таким образом хранится список jid, от которых можно получать сообщения этому боту
-listen_to=["test@ej.sharix-app.org"]
+listen_to=["test@ej.sharix-app.org", "open_template_bot@ej.sharix-app.org"]
 
 #тут хранится список jid, кому бот может отправлять сообщения в результате обработки заявки
-proceed_to=["test1@ej.sharix-app.org", "open_servicerequest_forcemajeure@ej.sharix-app.org"]
+proceed_to=["open_template_bot@ej.sharix-app.org", "test@ej.sharix-app.org", "test1@ej.sharix-app.org", "open_servicerequest_forcemajeure@ej.sharix-app.org"]
 
 #максимальное значение попыток обработать заказ
 idle_value=10
@@ -53,66 +54,61 @@ def message_handler(conn, mess):
             orderObj = jsreq.jsonToOrderTicket(text)
             print (orderObj)
             tasklist.append(orderObj)
-            process_status.append(0)
+            #process_status.append(0)
             bot.bot_log(str(datetime.now())+" Поступивший заказ успешно добавлен в очередь обработки\n")
 
-def open_bot_template_wait(period, i):
+def open_bot_template_wait(period, i,localtask):
     bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ ожидает\n")
     time.sleep(period)
-    #тут надо искать не по порядковому номеру, а по контенту или передавать указатель на элемент, так как длина списка может измениться по ходу обработки, но надо менять именно в исходном списке
-    tasklist[i].ticket=123
-    process_status[i]=0
+    
+    #ВАЖНО! Надо скорее всего через API редактировать заказ, иначе возможна потеря данных
+    localtask.title=localtask.title+"1"
+
+    #обязательно данный обработчик должен заканчиваться передачей заказа куда-то на обработку дальше - обратно или другому, иначе оно потеряется
+    jsonTicket = json.dumps(localtask.__dict__)
+    bot.proceed_status(proceed_to[0],jsonTicket)
+    bot.bot_log(botname+" "+str(datetime.now())+" "+str(i)+" "+"Заказ подождал и возвращен в очередь\n")
+
+def open_bot_template_process(localtask):
+    bot.bot_log(botname+" "+str(datetime.now())+" "+"Заказ в обработчике\n")
+    
+    #ВАЖНО! Надо через API редактировать заказ, иначе возможна потеря данных
+    #localtask.title +=1
+
+    jsonTicket = json.dumps(localtask.__dict__)
+    bot.proceed_status(proceed_to[1],jsonTicket)
+    bot.bot_log(botname+" "+str(datetime.now())+" "+str(i)+" "+"Заказ успешно обработан\n")
+
 
 def open_bot_template():
     #print("Тут описывается работа со списком задач в данном статусе")
     for i in range(len(tasklist)):
         #проверяем элемент tasklist[i]
         bot.bot_log(botname + " " + datetime.now().strftime('%Y-%m-%d') + " " + str(i) + " " + "Заказ в очереди на обработке\n")
-        print ("EACH TASKLIST", tasklist[i], process_status[i])
+        print ("EACH TASKLIST", tasklist[i])
+        #print ("EACH TASKLIST", tasklist[i], process_status[i])
+        localtask=tasklist.pop(i)
         
-        #если много циклов с процессом ничего не происходит - это неправильно и отдаем заказ на обработку по форсмажору
-        if (process_status[i]>idle_value):
-            bot.proceed_status(proceed_to[1],tasklist[i])
-            del tasklist[i]
-            del process_status[i]
-            bot.bot_log(botname+" "+str(datetime.now())+" "+str(i)+" "+"Заказ передан обработчику форс-мажоров по количеству попыток\n")
+        #если боту почему-то пришла не его заявка - это явно ошибка движения процессов и отдаем в форсмажор - этот обработчик указывать стоит всегда последним
+        if (localtask.status!=operating_status):
+            jsonTicket = json.dumps(localtask.__dict__)
+            bot.proceed_status(proceed_to[-1],jsonTicket)
+            bot.bot_log(botname+" "+str(datetime.now())+" "+str(i)+" "+"Заказ не по адресу, перенаправляем на форсмажор\n")
             continue
 
-        #пропускаем обработку, если процесс еще не готов и инкрементируем счетчик попыток
-        if (process_status[i]>0):
-            process_status[i] +=1
-            bot.bot_log(botname+" "+str(datetime.now())+" "+str(i)+" "+"Заказ оставлен в очереди\n")
-            continue
-        
-        if (process_status[i]==0):
-            print ("Proceeding started", tasklist[i])
-            #example of function that should be run each time process is ready
-            bot.fake_api_call(tasklist[i].status)
-
-            if (tasklist[i].status==210):
-                #function that need to be run as thread 
-                #open_bot_template_wait(5,i)
-                t1=threading.Thread(target=open_bot_template_wait, args=(5,i))
-                t1.start()
-                process_status[i] +=1
-                continue
-
-            if (tasklist[i].status>210):
-                t2=threading.Thread(target=open_bot_template_wait, args=(15,i))
-                t2.start()
-                print("Заказ оставлен в очереди\n")
-                bot.bot_log(botname+" "+str(datetime.now())+" "+str(i)+" "+"Заказ оставлен в очереди\n")
-            
-            #common way to proceed order
-            bot.proceed_status(proceed_to[0],tasklist[i])
-            del tasklist[i]
-            del process_status[i]
-            bot.bot_log(botname+" "+str(datetime.now())+" "+str(i)+" "+"Заказ успешно обработан и удален из очереди\n")
-            print("Заказ успешно обработан и удален из очереди\n")
-            print (tasklist)
-        else:
-            print("Заказ оставлен в очереди\n")
-            bot.bot_log(botname+" "+str(datetime.now())+" "+str(i)+" "+"Заказ оставлен в очереди\n")
+        if (localtask.title!="10"):
+            t1=threading.Thread(target=open_bot_template_wait, args=(5,i,localtask))
+            t1.start()
+
+        if (localtask.title=="101"):
+            t1=threading.Thread(target=open_bot_template_process, args=(10,i,localtask))
+            t1.start()
+
+        #если никакие обработчики не подошли - отправляем обратно в очередь
+        jsonTicket = json.dumps(localtask.__dict__)
+        bot.proceed_status(proceed_to[0],jsonTicket)
+        print("Заказ возвращен в очередь\n")
+        print (tasklist)
 
 #Авторизация и запуск бота
 
@@ -122,6 +118,8 @@ tasklist = []
 #надо инициализировать tasklist при запуске из API
 token = jsreq.requestGetToken(botname, PASSWORD, config.API_URL+"/auth/token/login/")
 #requestGetList(token, API_URL+"/tickets/api/tickets")
+
+#ВАЖНО! Надо еще фильтровать список по статусу обработки заявки
 tasklist=jsreq.requestGetList(token, config.API_URL+"/tickets/api/tickets/?list_id=10")
 #tasklist=jsreq.requestGetList(token, config.API_URL+"/tickets/api/tickets")
 #надо дописать таким образом, чтобы tasklist пополнялся тикетами определенного листа, а не всех
@@ -129,9 +127,9 @@ tasklist=jsreq.requestGetList(token, config.API_URL+"/tickets/api/tickets/?list_
 print (len(tasklist))
 
 #список статусов обработки заказов
-process_status = []
-while len(process_status)<len(tasklist):
-    process_status.append(0)
+#process_status = []
+#while len(process_status)<len(tasklist):
+#    process_status.append(0)
 
 
 bot = JabberBot(JID, PASSWORD, PORT)