电脑自动派单的实现

一、现实问题

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

二、解决思路

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

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

用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 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)#打开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_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]#姓名输入框出现
        #/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())))
        return

def 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 b

n=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)
        
        
    
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值