一、现实问题

网络办公,要不停的盯着系统网页刷新,出现新工单,要在30分钟内给工程师派出去,否则处罚一次扣工资。时间一长,人就受不了了,出个门手机刷,办公室电脑刷,神经紧张,颈疼。有没有办法实现电脑自动派单,工程师名单自己随时更改维护?

二、解决思路

1.取出地址,判断是不是自己管辖区域。(市级地址是否在(in)地址里)

2.不在,跳过。是,则在电子表格中查找工程师名。电子表格格式如下:

java智能计算派单 java自动派单实现_html

用4列地址作为行标识,用维修类型作为列标识,然后将工程师名依次填入。注意:地址为省、市、区(县)、街道(乡镇)四级地址,每一类地址结束,用“请核实”作容错处理。维修类型在最后用“其他”作容错处理。工程师可根据实情随时调整变更。

查找过程:从工单数据里取出地址和维修类型,首先根据地址,表格作个遍历(先市、区,再街道),依次判断是否与地址相符,相符确定行号。如果找不到,归入到“请核实”一栏。然后根据维修类型判断,确定列号。最后,根据行列号取出工程师姓名。

3.返回结果(工程师名)进行实时派单。实时派单可将刷新查找、判断地址提取工程师名、派单分别定义。

二、代码实现

# -*- coding: UTF-8 -*-
from selenium import webdriver
 from selenium.webdriver.support.ui import WebDriverWait
 from selenium.webdriver.support import expected_conditions as EC
 from selenium.webdriver.common.by import By
 import time,datetime
 import os
 from time import sleep
 import xlrd
 import threading
 import openpyxldef get_n_k(kind,address):
     name=''
     en_kind=1
     fn=u'D:/xiong/派单/names.xlsx'
     xlsx=openpyxl.load_workbook(fn,data_only=True)#打开xlsx文件,返回值而不是公式。
     sheet1=xlsx.worksheets[0]#打开第二个sheet
     ns=sheet1.max_column#取出最大列数,判断是否为10列
     if ns==11:
         #print(sh_n)
         ns=sheet1.max_row#读取总行数,参数转为行数
     else:
         ns=0
         print(u'错误,请核实第1个表格的列数是否为11!')
     #print(u'\n师傅名单表格(names.xlsx)处理中......,总行数为:',ns)
     k=0#行数,电子表格第二行开始
     ii=[]
     for i in range(2,ns+1):#序号从1开始哟。
         if sheet1.cell(i,2).value in address and sheet1.cell(i,3).value in address:
             #print(sheet1.cell(i,2).value,sheet1.cell(i,3).value,sheet1.cell(i,4).value,sheet1.cell(i,5).value)
             ii.append(i)
     if len(ii)==1:
         k=ii[0]
     elif len(ii)==0:#如果没找到,重找一遍,归到市辖区
         for i in range(2,ns+1):#序号从1开始哟。
             if sheet1.cell(i,2).value in address and sheet1.cell(i,3).value==u'市辖区':
                 #print(sheet1.cell(i,2).value,sheet1.cell(i,3).value,sheet1.cell(i,4).value,sheet1.cell(i,5).value)
                 ii.append(i)
                 break
         if len(ii)==0:
             print(u'二级地址(县市区)错误!!')#程序出错
             return
         else:k=ii[0]
     else:
         for i in ii:#遍历。判断四级乡镇街办地址
             if sheet1.cell(i,4).value[0:2] in address:
                 #print(sheet1.cell(i,2).value,sheet1.cell(i,3).value,sheet1.cell(i,4).value,sheet1.cell(i,5).value)
                 k=i
                 break
         if k==0:
             k=ii[-1]
             print(u'四级地址(乡镇街)没找到,请核实!')
     #print(k)        
     #以上k为横坐标,即地址;下面j为纵坐标,即类型
     j=0#列数,表格第5到11列
     if u'冰洗' in kind:
         j=7
     elif u'厨卫' in kind:
         j=8
     elif u'空调' in kind:
         j=9
     elif (u'彩电' or u'投影') in kind :
         if u'安装' in kind:
             j=6
         else:j=5
     elif u'净水器' in kind:
         j=10
     else:j=11
     #print(j)
     name=sheet1.cell(k,j).value#通过行列获取姓名
     print(name)
     #下面准定工程师类别
     engineers=[u'韩11',u'王11',u'刘11',u'张11',u'高11',u'廖11']
     if name in engineers:
         en_kind=2
         print(u'工程师')
     xlsx.close()
     return name,en_kinddef send(kind,address):
         global n
         print(kind[0:2],kind[8:12],address)
         #/html/body/div[11]/div/div/div[2]/form/div[1]/div[1]/div[1]/div[2]/input[1]#姓名输入框出现
         #/html/body/div[2]/div[2]/form/div[2]/div[3]/button#办事处选择框
         WebDriverWait(obj,30).until(EC.visibility_of_element_located((By.XPATH,'/html/body/div[2]/div[2]/form/div[2]/div[3]/button')))
         name,e_k=get_n_k(kind,address)
         if e_k==1:#/html/body/div[11]/div/div/div[2]/form/ul/li[2]/a,判断类别,点击分发网点
             obj.find_element_by_xpath('/html/body/div[11]/div/div/div[2]/form/ul/li[2]/a').click()#
             #/html/body/div[11]/div/div/div[2]/form/div[1]/div[2]/div[1]/div/input[1]#输入框
             obj.find_element_by_xpath('/html/body/div[11]/div/div/div[2]/form/div[1]/div[2]/div[1]/div/input[1]').send_keys(name)
             #/html/body/div[11]/div/div/div[2]/form/div[1]/div[2]/div[1]/div/input[2]#点击搜索
             obj.find_element_by_xpath('/html/body/div[11]/div/div/div[2]/form/div[1]/div[2]/div[1]/div/input[2]').click()#点击搜索
             #
             while 1:
                 time.sleep(2)
                 try:#############################/html/body/div[11]/div/div/div[2]/form/div[1]/div[2]/table/tbody/tr/td[3]
                     tt=obj.find_element_by_xpath('/html/body/div[11]/div/div/div[2]/form/div[1]/div[2]/table/tbody/tr/td[3]').text
                     if tt==name:#/html/body/div[11]/div/div/div[2]/form/div[1]/div[2]/table/tbody/tr/td[3]
                         obj.find_element_by_xpath('/html/body/div[11]/div/div/div[2]/form/div[1]/div[2]/table/tbody/tr/td[1]').click()#选中
                         break
                     else:obj.find_element_by_xpath('/html/body/div[11]/div/div/div[2]/form/div[1]/div[2]/div[1]/div/input[2]').click()
                 except:#/html/body/div[11]/div/div/div[2]/form/div[1]/div[2]/div[1]/div/input[2]
                     obj.find_element_by_xpath('/html/body/div[11]/div/div/div[2]/form/div[1]/div[2]/div[1]/div/input[2]').click()#重新搜索
                     time.sleep(3)#############/html/body/div[11]/div/div/div[2]/form/div[1]/div[2]/div[1]/div/input[2]
         else:
             #/html/body/div[11]/div/div/div[2]/form/ul/li[1]/a
             obj.find_element_by_xpath('/html/body/div[11]/div/div/div[2]/form/ul/li[1]/a').click()#点击工程师
             obj.find_element_by_xpath('/html/body/div[11]/div/div/div[2]/form/div[1]/div[1]/div[1]/div[2]/input[1]').clear()
             obj.find_element_by_xpath('/html/body/div[11]/div/div/div[2]/form/div[1]/div[1]/div[1]/div[2]/input[1]').send_keys(name)
             #/html/body/div[11]/div/div/div[2]/form/div[1]/div[1]/div[1]/div[2]/input[2]
             obj.find_element_by_xpath('/html/body/div[11]/div/div/div[2]/form/div[1]/div[1]/div[1]/div[2]/input[2]').click()#点击搜索
             while 1:
                 time.sleep(2)
                 try:#/html/body/div[11]/div/div/div[2]/form/div[1]/div[1]/table/tbody/tr/td[2]
                     tt=obj.find_element_by_xpath('/html/body/div[11]/div/div/div[2]/form/div[1]/div[1]/table/tbody/tr/td[2]').text
                     if tt==name:#
                         obj.find_element_by_xpath('/html/body/div[11]/div/div/div[2]/form/div[1]/div[1]/table/tbody/tr/td[1]/input').click()#选中
                         break##################/html/body/div[11]/div/div/div[2]/form/div[1]/div[1]/table/tbody/tr/td[1]/input
                     else:obj.find_element_by_xpath('/html/body/div[11]/div/div/div[2]/form/div[1]/div[1]/div[1]/div[2]/input[2]').click()
                 except:#/html/body/div[11]/div/div/div[2]/form/div[1]/div[1]/div[1]/div[2]/input[2]
                     obj.find_element_by_xpath('/html/body/div[11]/div/div/div[2]/form/div[1]/div[1]/div[1]/div[2]/input[2]').click()#重新搜索
                     time.sleep(3)
         #/html/body/div[11]/div/div/div[2]/form/div[2]/label/button#提交
         obj.find_element_by_xpath('/html/body/div[11]/div/div/div[2]/form/div[2]/label/button').click()
         time.sleep(5)
         n+=1
         print(u'========================= 已派单条数:',n,u'条。时间:',time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())))
         returndef seek_one(page):#每页查找
         for i in range(1,page+1):#一条条地址进行鉴别/html/body/div[2]/div[2]/div[2]/table/tbody[1]/tr[1]/td[5]/a[1]
             tt_address=obj.find_element_by_xpath('/html/body/div[2]/div[2]/div[2]/table/tbody[1]/tr['+str(i)+']/td[5]/a[1]').text#取地址
             print(tt_address)
             if u'恩施土家族苗族自治州'  in tt_address or\
                u'xx市'  in tt_address or\
                u'xx市' in tt_address:
                 print(tt_address)
                 kind=obj.find_element_by_xpath('/html/body/div[2]/div[2]/div[2]/table/tbody[1]/tr['+str(i)+']/td[3]').text
                 obj.find_element_by_xpath('/html/body/div[2]/div[2]/div[2]/table/tbody[1]/tr['+str(i)+']/td[7]/a').click()
                 send(kind,tt_address)
                 b=0
                 break#派单后页面刷新,必须重新开始,可能派的人很多
             else:b=i#判断一个页面是否鉴别完成
         if b==page:
             b=1
         return bn=0
 obj = webdriver.Firefox()
 url_login='http://xxxx.xxxx.xxxx'#登录页面
 obj.get(url_login)
 #//*[@id="username"]#账号输入框出现
 WebDriverWait(obj,30).until(EC.visibility_of_any_elements_located((By.XPATH,'//*[@id="username"]')))
 print(u'网面打开完成!')
 obj.find_element_by_name('username').send_keys('xxxxx')
 obj.find_element_by_id('password').send_keys('******')
 print(u'账号密码输入完成!')
 #time.sleep(3)
 obj.find_element_by_id('fm-login-submit').click()
 #/html/body/div[2]/div[2]/div/div[1]/div/div[2]/div/div/ul/li[2]/div[2]#管理员名字的出现
 WebDriverWait(obj,30).until(EC.visibility_of_any_elements_located((By.XPATH,'/html/body/div[2]/div[2]/div/div[1]/div/div[2]/div/div/ul/li[2]/div[2]')))
 #time.sleep(8)
 print(u'登录完成!')
 #选择工单管理:/html/body/div[2]/div[1]/div[2]/ul/li/a[2]/span
 #/html/body/div[2]/div[1]/div[2]/ul/li/a[2]/span
 obj.find_element_by_xpath('/html/body/div[2]/div[1]/div[2]/ul/li/a[2]/span').click()
 #/html/body/div[2]/div[2]/div[1]/ul/li[8]/a/span#等待网页刷新,完单审核数字提示出现
 WebDriverWait(obj,30).until(EC.visibility_of_any_elements_located((By.XPATH,'/html/body/div[2]/div[2]/div[1]/ul/li[8]/a/span')))
 #以下分两块统计
 print(u'“工单管理"选择完成!')
 #/html/body/div[2]/div[2]/div[1]/ul/li[3]/a#待派单出现/html/body/div[2]/div[2]/div[1]/ul/li[3]
 obj.find_element_by_xpath('/html/body/div[2]/div[2]/div[1]/ul/li[3]/a').click()#点击
 #/html/body/div[2]/div[2]/form/div[2]/label[7]#办事处出现
 #time.sleep(20)#/html/body/div[2]/div[2]/form/div[3]/a[4]#批量派单出现
 WebDriverWait(obj,30).until(EC.visibility_of_any_elements_located((By.XPATH,'/html/body/div[2]/div[2]/form/div[3]/a[4]')))
 print(u'“待派单"选择完成!')while 1:
     try:
         obj.refresh()
         #三个办事处依次查找后,派单。
         for i in [8,9,11]:
             #/html/body/div[2]/div[2]/form/div[2]/div[3]/button/span[2]/span#办事处选择窗口
             obj.find_element_by_xpath('/html/body/div[2]/div[2]/form/div[2]/div[3]/button/span[2]/span').click()#点击
             obj.find_element_by_xpath('/html/body/div[2]/div[2]/form/div[2]/div[3]/div/ul/li['+str(i)+']/a/span[1]').click()#点击
             #/html/body/div[2]/div[2]/form/div[2]/div[3]/button/span[1]#办事处标签出现
             WebDriverWait(obj,10).until(EC.visibility_of_any_elements_located((By.XPATH,'/html/body/div[2]/div[2]/form/div[2]/div[3]/button/span[1]')))
             #print(u'“办事处"选择完成!')
             #/html/body/div[2]/div[2]/form/div[3]/input[16]#搜索按键
             obj.find_element_by_xpath('/html/body/div[2]/div[2]/form/div[3]/input[16]').click()#点击
             time.sleep(2)    
             #/html/body/div[2]/div[2]/nav/div[1]#每页显示出现#这个不行列
             WebDriverWait(obj,10).until(EC.visibility_of_any_elements_located((By.XPATH,'/html/body/div[2]/div[2]/nav/div[1]')))
             #print(u'搜索完成!')
             while 1:#多条记录,循环派单处理完
                 #/html/body/div[2]/div[2]/nav/ul/div/ul/li[6]/a/span#搜索有结果条数
                 try:
                     obj.find_element_by_xpath('/html/body/div[2]/div[2]/nav/ul/div/ul/li[6]/a/span')
                 except:
                     have=0
                     break
                 else:
                     have=1
                 if have==1:#如果有取出类型和地址信息
                     kind=obj.find_element_by_xpath('/html/body/div[2]/div[2]/div[2]/table/tbody[1]/tr[1]/td[3]').text
                     address=obj.find_element_by_xpath('/html/body/div[2]/div[2]/div[2]/table/tbody[1]/tr[1]/td[5]/a[1]').text
                     if u'汉川' in address:
                         break
                     #print(kind[0:2],kind[8:12],address)
                     #/html/body/div[2]/div[2]/div[2]/table/tbody[1]/tr[1]/td[7]/a#派单
                     obj.find_element_by_xpath('/html/body/div[2]/div[2]/div[2]/table/tbody[1]/tr[1]/td[7]/a').click()#点击
                     send(kind,address)        #在全部里面查找#/html/body/div[2]/div[2]/div[1]/ul/li[3]/a#
         #obj.find_element_by_xpath(' /html/body/div[2]/div[2]/div[1]/ul/li[3]/a').click()#点击全部,待派单
         b=0#循环开关/html/body/div[2]/div[2]/div[1]/ul/li[1]/a#/html/body/div[2]/div[2]/div[1]/ul/li[3]/a
         c=0 #下一页点击次数
         while b==0:
             try:
                 obj.find_element_by_xpath(' /html/body/div[2]/div[2]/div[1]/ul/li[3]/a').click()#点击待派,全部,
                 WebDriverWait(obj,30).until(EC.visibility_of_any_elements_located((By.XPATH,'/html/body/div[2]/div[2]/nav/ul/div/ul/li[6]/a/span')))
                 time.sleep(1)##############/html/body/div[2]/div[2]/nav/ul/div/ul/li[6]/a/span#统计总条数出现
                 tt=obj.find_element_by_xpath('/html/body/div[2]/div[2]/nav/ul/div/ul/li[6]/a/span').text#获取总条数文本
                 total=[int(s) for s in tt.split() if s.isdigit()][0]#提取数字:条数
                 print(total)#/html/body/div[2]/div[2]/div[2]/table/tbody[1]/tr[1]/td[5]/a[1]
                 ######/html/body/div[2]/div[2]/div[2]/table/tbody[1]/tr[4]/td[5]/a[1]
                 pn=total//10-c#除数取整,翻页一次整数减一
                 page=total%10#余数
                 if pn==0 and page!=0:#如果不为0,小于10,则取余数
                     b=seek_one(page)
                 elif pn!=0:#整数不为0,直接取10,直到为0
                     b=seek_one(10)
                     if b==1:#/html/body/div[2]/div[2]/nav/ul/div/ul/li[4]/a##下一页
                         try:
                             obj.find_element_by_xpath('/html/body/div[2]/div[2]/nav/ul/div/ul/li[4]/a').click()
                             c+=1#下一页后,整数页码减一
                             b=0
                         except:
                             break
                 else:#都为0,跳出
                     b=1
             #
             except:
                 print('error')
                 obj.refresh()
         print(u'没有工单要派了,休息5分钟,一会再瞧瞧........')
         time.sleep(300)
     except:
         time.sleep(30)