电脑自动派单的实现
一、現(xiàn)實(shí)問(wèn)題
網(wǎng)絡(luò)辦公,要不停的盯著系統(tǒng)網(wǎng)頁(yè)刷新,出現(xiàn)新工單,要在30分鐘內(nèi)給工程師派出去,否則處罰一次扣工資。時(shí)間一長(zhǎng),人就受不了了,出個(gè)門手機(jī)刷,辦公室電腦刷,神經(jīng)緊張,頸疼。有沒(méi)有辦法實(shí)現(xiàn)電腦自動(dòng)派單,工程師名單自己隨時(shí)更改維護(hù)?
二、解決思路
1.取出地址,判斷是不是自己管轄區(qū)域。(市級(jí)地址是否在(in)地址里)
2.不在,跳過(guò)。是,則在電子表格中查找工程師名。電子表格格式如下:
用4列地址作為行標(biāo)識(shí),用維修類型作為列標(biāo)識(shí),然后將工程師名依次填入。注意:地址為省、市、區(qū)(縣)、街道(鄉(xiāng)鎮(zhèn))四級(jí)地址,每一類地址結(jié)束,用“請(qǐng)核實(shí)”作容錯(cuò)處理。維修類型在最后用“其他”作容錯(cuò)處理。工程師可根據(jù)實(shí)情隨時(shí)調(diào)整變更。
查找過(guò)程:從工單數(shù)據(jù)里取出地址和維修類型,首先根據(jù)地址,表格作個(gè)遍歷(先市、區(qū),再街道),依次判斷是否與地址相符,相符確定行號(hào)。如果找不到,歸入到“請(qǐng)核實(shí)”一欄。然后根據(jù)維修類型判斷,確定列號(hào)。最后,根據(jù)行列號(hào)取出工程師姓名。
3.返回結(jié)果(工程師名)進(jìn)行實(shí)時(shí)派單。實(shí)時(shí)派單可將刷新查找、判斷地址提取工程師名、派單分別定義。
二、代碼實(shí)現(xiàn)
# -*- 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 openpyxl
def get_n_k(kind,address):
? ? name=''
? ? en_kind=1
? ? fn=u'D:/xiong/派單/names.xlsx'
? ? xlsx=openpyxl.load_workbook(fn,data_only=True)#打開(kāi)xlsx文件,返回值而不是公式。
? ? sheet1=xlsx.worksheets[0]#打開(kāi)第二個(gè)sheet
? ? ns=sheet1.max_column#取出最大列數(shù),判斷是否為10列
? ? if ns==11:
? ? ? ? #print(sh_n)
? ? ? ? ns=sheet1.max_row#讀取總行數(shù),參數(shù)轉(zhuǎn)為行數(shù)
? ? else:
? ? ? ? ns=0
? ? ? ? print(u'錯(cuò)誤,請(qǐng)核實(shí)第1個(gè)表格的列數(shù)是否為11!')
? ? #print(u'\n師傅名單表格(names.xlsx)處理中......,總行數(shù)為:',ns)
? ? k=0#行數(shù),電子表格第二行開(kāi)始
? ? ii=[]
? ? for i in range(2,ns+1):#序號(hào)從1開(kāi)始喲。
? ? ? ? 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:#如果沒(méi)找到,重找一遍,歸到市轄區(qū)
? ? ? ? for i in range(2,ns+1):#序號(hào)從1開(kāi)始喲。
? ? ? ? ? ? if sheet1.cell(i,2).value in address and sheet1.cell(i,3).value==u'市轄區(qū)':
? ? ? ? ? ? ? ? #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'二級(jí)地址(縣市區(qū))錯(cuò)誤!!')#程序出錯(cuò)
? ? ? ? ? ? return
? ? ? ? else:k=ii[0]
? ? else:
? ? ? ? for i in ii:#遍歷。判斷四級(jí)鄉(xiāng)鎮(zhèn)街辦地址
? ? ? ? ? ? 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'四級(jí)地址(鄉(xiāng)鎮(zhèn)街)沒(méi)找到,請(qǐng)核實(shí)!')
? ? #print(k) ? ? ? ?
? ? #以上k為橫坐標(biāo),即地址;下面j為縱坐標(biāo),即類型
? ? j=0#列數(shù),表格第5到11列
? ? if u'冰洗' in kind:
? ? ? ? j=7
? ? elif u'廚衛(wèi)' in kind:
? ? ? ? j=8
? ? elif u'空調(diào)' 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#通過(guò)行列獲取姓名
? ? print(name)
? ? #下面準(zhǔn)定工程師類別
? ? 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_kind
def 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]#姓名輸入框出現(xiàn)
? ? ? ? #/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,判斷類別,點(diǎn)擊分發(fā)網(wǎng)點(diǎn)
? ? ? ? ? ? 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]#點(diǎn)擊搜索
? ? ? ? ? ? obj.find_element_by_xpath('/html/body/div[11]/div/div/div[2]/form/div[1]/div[2]/div[1]/div/input[2]').click()#點(diǎn)擊搜索
? ? ? ? ? ? #
? ? ? ? ? ? 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()#點(diǎn)擊工程師
? ? ? ? ? ? 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()#點(diǎn)擊搜索
? ? ? ? ? ? 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'========================= 已派單條數(shù):',n,u'條。時(shí)間:',time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())))
? ? ? ? return
def seek_one(page):#每頁(yè)查找
? ? ? ? for i in range(1,page+1):#一條條地址進(jìn)行鑒別/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#派單后頁(yè)面刷新,必須重新開(kāi)始,可能派的人很多
? ? ? ? ? ? else:b=i#判斷一個(gè)頁(yè)面是否鑒別完成
? ? ? ? if b==page:
? ? ? ? ? ? b=1
? ? ? ? return b
n=0
obj = webdriver.Firefox()
url_login='http://xxxx.xxxx.xxxx'#登錄頁(yè)面
obj.get(url_login)
#//*[@id="username"]#賬號(hào)輸入框出現(xiàn)
WebDriverWait(obj,30).until(EC.visibility_of_any_elements_located((By.XPATH,'//*[@id="username"]')))
print(u'網(wǎng)面打開(kāi)完成!')
obj.find_element_by_name('username').send_keys('xxxxx')
obj.find_element_by_id('password').send_keys('******')
print(u'賬號(hào)密碼輸入完成!')
#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]#管理員名字的出現(xiàn)
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#等待網(wǎng)頁(yè)刷新,完單審核數(shù)字提示出現(xiàn)
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')))
#以下分兩塊統(tǒng)計(jì)
print(u'“工單管理"選擇完成!')
#/html/body/div[2]/div[2]/div[1]/ul/li[3]/a#待派單出現(xiàn)/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()#點(diǎn)擊
#/html/body/div[2]/div[2]/form/div[2]/label[7]#辦事處出現(xiàn)
#time.sleep(20)#/html/body/div[2]/div[2]/form/div[3]/a[4]#批量派單出現(xiàn)
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()
? ? ? ? #三個(gè)辦事處依次查找后,派單。
? ? ? ? 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()#點(diǎn)擊
? ? ? ? ? ? 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()#點(diǎn)擊
? ? ? ? ? ? #/html/body/div[2]/div[2]/form/div[2]/div[3]/button/span[1]#辦事處標(biāo)簽出現(xiàn)
? ? ? ? ? ? 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()#點(diǎn)擊
? ? ? ? ? ? time.sleep(2)?? ?
? ? ? ? ? ? #/html/body/div[2]/div[2]/nav/div[1]#每頁(yè)顯示出現(xiàn)#這個(gè)不行列
? ? ? ? ? ? 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:#多條記錄,循環(huán)派單處理完
? ? ? ? ? ? ? ? #/html/body/div[2]/div[2]/nav/ul/div/ul/li[6]/a/span#搜索有結(jié)果條數(shù)
? ? ? ? ? ? ? ? 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()#點(diǎn)擊
? ? ? ? ? ? ? ? ? ? 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()#點(diǎn)擊全部,待派單
? ? ? ? b=0#循環(huán)開(kāi)關(guān)/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 #下一頁(yè)點(diǎn)擊次數(shù)
? ? ? ? while b==0:
? ? ? ? ? ? try:
? ? ? ? ? ? ? ? obj.find_element_by_xpath(' /html/body/div[2]/div[2]/div[1]/ul/li[3]/a').click()#點(diǎn)擊待派,全部,
? ? ? ? ? ? ? ? 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#統(tǒng)計(jì)總條數(shù)出現(xiàn)
? ? ? ? ? ? ? ? tt=obj.find_element_by_xpath('/html/body/div[2]/div[2]/nav/ul/div/ul/li[6]/a/span').text#獲取總條數(shù)文本
? ? ? ? ? ? ? ? total=[int(s) for s in tt.split() if s.isdigit()][0]#提取數(shù)字:條數(shù)
? ? ? ? ? ? ? ? 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#除數(shù)取整,翻頁(yè)一次整數(shù)減一
? ? ? ? ? ? ? ? page=total%10#余數(shù)
? ? ? ? ? ? ? ? if pn==0 and page!=0:#如果不為0,小于10,則取余數(shù)
? ? ? ? ? ? ? ? ? ? b=seek_one(page)
? ? ? ? ? ? ? ? elif pn!=0:#整數(shù)不為0,直接取10,直到為0
? ? ? ? ? ? ? ? ? ? b=seek_one(10)
? ? ? ? ? ? ? ? ? ? if b==1:#/html/body/div[2]/div[2]/nav/ul/div/ul/li[4]/a##下一頁(yè)
? ? ? ? ? ? ? ? ? ? ? ? try:
? ? ? ? ? ? ? ? ? ? ? ? ? ? obj.find_element_by_xpath('/html/body/div[2]/div[2]/nav/ul/div/ul/li[4]/a').click()
? ? ? ? ? ? ? ? ? ? ? ? ? ? c+=1#下一頁(yè)后,整數(shù)頁(yè)碼減一
? ? ? ? ? ? ? ? ? ? ? ? ? ? b=0
? ? ? ? ? ? ? ? ? ? ? ? except:
? ? ? ? ? ? ? ? ? ? ? ? ? ? break
? ? ? ? ? ? ? ? else:#都為0,跳出
? ? ? ? ? ? ? ? ? ? b=1
? ? ? ? ? ? #
? ? ? ? ? ? except:
? ? ? ? ? ? ? ? print('error')
? ? ? ? ? ? ? ? obj.refresh()
? ? ? ? print(u'沒(méi)有工單要派了,休息5分鐘,一會(huì)再瞧瞧........')
? ? ? ? time.sleep(300)
? ? except:
? ? ? ? time.sleep(30)
? ? ? ??
? ? ? ??
? ??
?
?
總結(jié)
- 上一篇: delphi 项目软件架构升级-行业软件
- 下一篇: IMT-2020明确5G频谱需求:高频需