提交 1b1116ef013bbd2ea57944a9a32beb8f9fd81d04

作者 gaojp
1 个父辈 4690f09e

update

正在显示 40 个修改的文件 包含 1945 行增加0 行删除
不能预览此文件类型
不能预览此文件类型
不能预览此文件类型
不能预览此文件类型
不能预览此文件类型
不能预览此文件类型
  1 +# --------------------------------------------------------
  2 +# Host: 127.0.0.1
  3 +# Server version: 5.5.53
  4 +# Server OS: Win32
  5 +# HeidiSQL version: 6.0.0.3603
  6 +# Date/time: 2018-04-02 16:59:14
  7 +# --------------------------------------------------------
  8 +
  9 +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
  10 +/*!40101 SET NAMES utf8 */;
  11 +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
  12 +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
  13 +
  14 +# Dumping database structure for spcard
  15 +DROP DATABASE IF EXISTS `spcard`;
  16 +CREATE DATABASE IF NOT EXISTS `spcard` /*!40100 DEFAULT CHARACTER SET utf8 */;
  17 +USE `spcard`;
  18 +
  19 +
  20 +# Dumping structure for table spcard.port_info
  21 +DROP TABLE IF EXISTS `port_info`;
  22 +CREATE TABLE IF NOT EXISTS `port_info` (
  23 + `Id` int(11) NOT NULL AUTO_INCREMENT,
  24 + `PortNum` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '端口号',
  25 + `IMSI` varchar(255) NOT NULL DEFAULT '' COMMENT '用户识别码(IMSI)',
  26 + `ICCID` varchar(255) DEFAULT '' COMMENT '卡识别码(ICCID)',
  27 + `PhoNum` varchar(255) DEFAULT NULL COMMENT '手机号',
  28 + PRIMARY KEY (`Id`)
  29 +) ENGINE=MyISAM DEFAULT CHARSET=utf8;
  30 +
  31 +# Data exporting was unselected.
  32 +
  33 +
  34 +# Dumping structure for table spcard.sms_recv
  35 +DROP TABLE IF EXISTS `sms_recv`;
  36 +CREATE TABLE IF NOT EXISTS `sms_recv` (
  37 + `Id` int(11) NOT NULL AUTO_INCREMENT,
  38 + `PortNum` int(11) unsigned DEFAULT '0' COMMENT '接收短信的端口号',
  39 + `PhoNum` varchar(255) DEFAULT '' COMMENT '手机号',
  40 + `IMSI` varchar(255) DEFAULT NULL COMMENT '用户识别码(IMSI)',
  41 + `ICCID` varchar(255) DEFAULT NULL COMMENT '卡识别码(ICCID)',
  42 + `smsDate` varchar(255) NOT NULL DEFAULT '' COMMENT '短信日期,注意是smsDate而不是smsData',
  43 + `smsNumber` varchar(255) NOT NULL DEFAULT '' COMMENT '短信号码',
  44 + `smsContent` varchar(255) NOT NULL DEFAULT '' COMMENT '短信内容',
  45 + PRIMARY KEY (`Id`)
  46 +) ENGINE=MyISAM DEFAULT CHARSET=utf8;
  47 +
  48 +# Data exporting was unselected.
  49 +
  50 +
  51 +# Dumping structure for table spcard.sms_send
  52 +DROP TABLE IF EXISTS `sms_send`;
  53 +CREATE TABLE IF NOT EXISTS `sms_send` (
  54 + `Id` int(11) NOT NULL AUTO_INCREMENT,
  55 + `PortNum` int(11) DEFAULT '-1' COMMENT '大于0表示指定端口号发送',
  56 + `smsNumber` varchar(255) NOT NULL DEFAULT '' COMMENT '接收号码',
  57 + `smsSubject` varchar(255) DEFAULT '' COMMENT '彩信标题,如果发送彩信不能为空',
  58 + `smsContent` varchar(255) NOT NULL DEFAULT '' COMMENT '发送内容',
  59 + `smsType` int(11) unsigned DEFAULT '0' COMMENT '0:短信 1:彩信',
  60 + `PhoNum` varchar(255) DEFAULT NULL COMMENT '手机号',
  61 + `smsState` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '0:未发送 1:已在发送队列 2:发送成功 3:发送失败',
  62 + PRIMARY KEY (`Id`)
  63 +) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
  64 +
  65 +# Data exporting was unselected.
  66 +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
  67 +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
  68 +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
  1 +SOCKET接口使用说明
  2 +
  3 +功能说明:酷网通可以作为服务端,实现SOCKET通讯,实现三大功能:
  4 +
  5 +1> 支持端口信息和新短信主动上报。
  6 +
  7 +2> 客户端可以向酷网通软件发送数据,提交酷网通任务设置里所有格式的任务。
  8 +
  9 +3> 客户端支持发送指令给酷网通软件,操作卡池设备自动换卡。
  10 +
  11 +
  12 +酷网通配置SOCKET功能:
  13 +
  14 +1> 软件默认已开启SOCKET服务功能,端口号为:16908,可在【工具】->【SOCKET服务对接设置】配置,重启软件生效。
  15 +
  16 +2> 目录下有SOCKET测试工具可用于测试SOCKET指令。
  17 +
  18 +
  19 +SOCKET指令使用说明:
  20 +
  21 +1> 端口信息上报,只要client连接上酷网通,端口信息有变会自动往client发送数据,格式为:+DEVICES:端口信息数据长度,端口信息|。
  22 +
  23 + 如:+DEVICES:66,COM12,13800000001,460010000000002,89860000000085125121,350212021210245|
  24 +
  25 +2> 客户端收到新短信格式为:+NEW_SMS:端口号┇手机号┇发送号码┇接收时间┇短信内容。
  26 +
  27 +3> 客户端提交的短信发送成功上报格式为:+NEW_SMS:短信ID┇端口号┇手机号┇发送号码┇接收时间┇短信内容。
  28 +
  29 +4> 客户端提交的短信发送失败上报格式为:+SMS_FAIL:短信ID┇端口号┇手机号┇发送号码┇接收时间┇短信内容。
  30 +
  31 +5> 客户端指定端口发送短信格式为:AP$SENDSMS=数据库ID,端口号,发送号码,发送内容 (注:数据库ID没有可指定一个整数)
  32 +
  33 +6> 客户端提交任务设置任务格式为:AP$TASK=数据长度,端口号,数据 (注:端口号小于或等于0表示该任务发送到所有通道)
  34 +
  35 + 数据格式为json格式: 如:{"taskname":"短信","tasktype":"短信","number":"10001","content":"102","count":1,"waittime":2}
  36 +
  37 + 字段值参照软件任务设置,如果是语音,则tasktype对应的类型是"语音",同理彩信对应的类型是"彩信",以任务设置类型为准。
  38 +
  39 + 数据长度仅计算数据的长度不含端口号。
  40 +
  41 + 如发送短信102到10001,数据长度93(注:中文占两字节)发送到COM66,指令参考:AP$TASK=93,66,{"taskname":"短信","tasktype":"短信","number":"10001","content":"102","count":1,"waittime":2}
  42 +
  43 + 同样刷流量任务(注:流量任务content对应内容中括号不带必须去掉),指令参考:AP$TASK=213,66,{"taskname":"流量任务","tasktype":"刷流量","number":"","content":"2┇2,网址自动轮转┇1.00-1.00┇NokiaN82/1.0 (20.1.062) SymbianOS/9.2 Series60/3.1 Profile/MIDP-2.0 Configuration/CLDC-1.1┇","count":1,"waittime":2}
  44 +
  45 + 其他任务同样参考设置,互打互发除外。
  46 +
  47 +7> 卡池换卡指令:AP$SIM=端口号,序号; (注:如果端口号小于0表示全部通道一起换卡)
  48 +
  49 +8> 卡池指定手机号换卡指令:AP$SIMPHONUM=手机号; (注:必须先保存手机号对应的卡池位置)
  50 +
  51 +9> 获取指令端口信息:AP$PORTREAD=端口号,如:AP$PORTREAD=66,获取COM66端口信息,AP$PORTREAD=-1,获取全部端口信息。
  52 +
  53 +10> 读取新短信指令:AP$SMS=端口号,端口号小于0是表示读取全部端口新短信。
  54 +
  55 +11> 获取端口号信息:AP$DEVICES=端口号,端口号小于0是表示读取全部端口信息。
  56 +
  57 +12> 任务执行结果查询:AP$TASKRESULT?
  58 +
  59 +13> 根据ICCID换卡:AP$SIMICCID=ICCID
  60 +
  61 +
  62 +
  63 +
  64 +
  1 +二次开发说明
  2 +
  3 +功能说明:
  4 +
  5 +1> 从酷网通软件自带ACCESS数据库中读取端口信息和新短信。
  6 +
  7 +2> 可以往酷网通自带的ACCESS数据库中写入需要发送的短信。
  8 +
  9 +3> 数据库的密码为:gd2013
  10 +
  11 +
  12 +具体实现:
  13 +
  14 +1> 需要从数据库读取端口号信息的,可读取数据库OtInfo.mdb中的Devices表,可实时更新端口号信息。
  15 +
  16 +2> 需要从数据库读取新短信的,可读取数据库SMS.mdb中的L_SMS表,保存的是所有接收到的新短信。
  17 +
  18 +3> 如果需要以文本文件的方式读取短信的,可在安装目录下面的【全部短信】和【最新短信】文件夹读取对应的文本文件短信即可。
  19 +
  20 +4> 外部短信发送,可将需要发送的短信写入数据库OtInfo.mdb的SMSOutbox表中,如果要指定端口发送,可设置字段comport的值,
  21 +
  22 + 注(comport的值为整型),字段taskname的值可为空,仅区分短信用。
  23 +
  24 +5> 以文本文件的方式写入发送短信,文件命名为:短信发送.txt,格式为:手机号,内容或端口号(格式如COM1),手机号,内容。
  25 +
  26 + 一行一条信息,多条信息回车换行,将此文件保存到安装目录下面Config文件夹即可。
  27 +
  28 +
  29 +对接总结:
  30 +
  31 +在线手机号码:OtInfo.mdb——Devices表,Comport是端口号,phonum是手机号码
  32 +
  33 +短信接收记录:SMS.mdb——L_SMS表,number是号码, content是短信内容,simnum 是发送的号码字段
  34 +
  35 +提交发送短信:OtInfo.mdb——SMSOutbox表,comport是端口号,number是接收号码,content是短信内容
  36 +
  37 +发送短信结果:SUCCESS.mdb——L_SUCCESS表,pcui是端口号,number是接收号码,content是短信内容
  38 +
  39 +
  40 +
不能预览此文件类型
不能预览此文件类型
不能预览此文件类型
不能预览此文件类型
不能预览此文件类型
  1 +# -*- coding: utf-8 -*-
  2 +import time
  3 +import re
  4 +import os
  5 +import datetime
  6 +from lxml import etree
  7 +import win32api
  8 +from win32.lib import win32con
  9 +from sibot.common import constant
  10 +from sibot.worker.bot.bot import Bot as RootBot
  11 +from selenium.webdriver.support.select import Select
  12 +from sibot.common.bot_log import BotLogger
  13 +from sibot.common import waclient
  14 +from sibot.common.utils import check_id_num
  15 +
  16 +logger = BotLogger(os.path.basename(__file__), logname=2).getLogger()
  17 +
  18 +
  19 +class Bot(RootBot):
  20 + """
  21 + 北京地区社保缴纳机器人
  22 + """
  23 + def __init__(self, job):
  24 + super(Bot, self).__init__(job)
  25 + self.login_url = "http://fuwu.rsj.beijing.gov.cn/csibiz/csirp/login.jsp"
  26 + self.login_url1 = "https://yzt.beijing.gov.cn/am/UI/Login?module=BjzwCert&goto=https%3A%2F%2Fyzt.beijing.gov.cn%2Fam%2Foauth2%2Fauthorize%3Fservice%3DbjzwService%26response_type%3Dcode%26client_id%3D688350606_02%26scope%3Dcn%2Buid%2BidCardNumber%2BextProperties%2BcredenceClass%26redirect_uri%3Dhttp%253A%252F%252Ffuwu.rsj.beijing.gov.cn%252Funitplatform%252FYZTAuth%26encoded%3Dfalse%26encoded%3Dfalse&lackFlag=NA"
  27 + # self.login_url = "https://yzt.beijing.gov.cn/am/UI/Login?module=BjzwCert&lackFlag=NA"
  28 + self.driver.implicitly_wait(30)
  29 +
  30 + def login(self):
  31 + """北京社保网站登录操作"""
  32 + for i in range(5):
  33 + try:
  34 + logger.info('start login beijing ----------')
  35 + self.driver.get(self.login_url1) # 登陆窗口
  36 + self.driver.implicitly_wait(30) # 隐式等待30秒
  37 + time.sleep(3)
  38 + # 旧登录方式抓取登陆错误方法
  39 + # sound_code = self.driver.page_source
  40 + # if '本月系统维护' in sound_code:
  41 + # message = etree.HTML(sound_code).xpath('/html/body/table/tbody/tr[1]/td/text()')
  42 + # message = message[0].replace('\n\t', '') + message[1].replace('\n\t', '').replace(' ', '')
  43 + # logger.error(message)
  44 + # return False
  45 +
  46 + # 判断数字证书是否成功加载
  47 + # if not self.driver.find_elements_by_xpath('//*[@id="UserList"]/option'):
  48 + # logger.errors("证书加载失败")
  49 + # self.driver.refresh()
  50 + # continue
  51 +
  52 + # 输入帐号密码等信息
  53 + # js = 'document.getElementById("wrapper").style.display="none";'
  54 + # self.driver.execute_script(js)
  55 + # js = 'document.getElementsByClassName("pop")[0].style.display="none";'
  56 + # self.driver.execute_script(js)
  57 + # time.sleep(1)
  58 + # self.driver.find_element_by_id('popButton1').click() # 选择北京市统一身份认证平台登录
  59 + # time.sleep(1)
  60 + # self.driver.find_element_by_id('popButton4').click() # 否
  61 + # time.sleep(8)
  62 + #
  63 + # self.driver.switch_to_frame('header') # 进入 frame表单
  64 + # self.driver.find_element_by_xpath('/html/body/div/div[1]/p/a[2]').click() # 点击法人登录
  65 + # self.driver.switch_to_default_content() # 退出 frame表单
  66 + time.sleep(2)
  67 + # current_window = self.driver.current_window_handle # 存储当前窗口的id
  68 + # all_windows = self.driver.window_handles # 获取打开的全部窗口
  69 + # for window in all_windows: # 循环全部窗口 直到有新的窗口
  70 + # if window != current_window:
  71 + # self.driver.switch_to.window(window) # switch_to.window 切换窗口
  72 + self.driver.maximize_window() # 新打开窗口全屏
  73 + time.sleep(2)
  74 + # self.driver.find_element_by_xpath('//*[@id="userId"]/ul/li[1]/a').click() # 点击证书登录
  75 + # time.sleep(4)
  76 +
  77 + self.driver.find_element_by_id('password').send_keys(self.job.usb_cert_pwd) # usb_cert_pwd 证书密码
  78 + self.driver.find_element_by_xpath('//*[@id="cert_div"]/div[6]/input').click() # 点击登陆
  79 + self.driver.find_element_by_xpath('//*[@id="cert_div"]/div[6]/input').click() # 点击登陆
  80 + time.sleep(8)
  81 +
  82 + # 旧登录方式抓取登陆错误方法
  83 + # try:
  84 + # alert_text = self.driver.switch_to_alert().text
  85 + # if '口令错误' in alert_text:
  86 + # logger.error('alert_text: {}'.format(alert_text))
  87 + # self.driver.switch_to_alert().accept()
  88 + # return False
  89 + # if '过期' in alert_text:
  90 + # logger.error('alert_text: {}'.format(alert_text))
  91 + # self.driver.switch_to_alert().accept()
  92 + # except Exception as e:
  93 + # logger.error(str(e))
  94 +
  95 + # try:
  96 + # source_code = self.driver.page_source
  97 + # time.sleep(1)
  98 + # if '认证失败,请检查登录凭证是否正确' in source_code or '点击返回首页' in source_code:
  99 + # logger.error("发现并处理错误页面")
  100 + # return False
  101 + # except Exception as e:
  102 + # logger.error(str(e))
  103 +
  104 + # 新的登陆方式抓取登陆错误方法
  105 +
  106 + # 弹出框
  107 + # alert(一个按钮),confirm(两个按钮),prompt(两个按钮+输入框)
  108 + # driver.switch_to.alert.text # 获取弹出框的文本信息
  109 + # driver.switch_to.alert.accept() # 确认
  110 + # driver.switch_to.alert.dismiss() # 取消
  111 +
  112 + try:
  113 + alert_text = self.driver.switch_to_alert().text # 获取弹出框 的文本
  114 + if '校验证书密码失败' in alert_text:
  115 + logger.error('alert_text: {}'.format(alert_text))
  116 + self.driver.switch_to_alert().accept() # 在弹出框上 点击确认
  117 + return False
  118 + if '输入证书密码' in alert_text:
  119 + logger.error('alert_text: {}'.format(alert_text))
  120 + self.driver.switch_to_alert().accept()
  121 + continue
  122 + if '过期' in alert_text:
  123 + logger.error('alert_text: {}'.format(alert_text))
  124 + self.driver.switch_to_alert().accept()
  125 + time.sleep(2)
  126 + sound_code = self.driver.page_source # 获取页面的数据/源码
  127 + time.sleep(1)
  128 + if '请检查登录凭证是否正确' in sound_code or '点击返回首页' in sound_code:
  129 + logger.error('页面错误,重新加载')
  130 + self.driver.refresh() # 刷新浏览器
  131 + continue
  132 + except Exception as e:
  133 + logger.error(str(e))
  134 + for j in range(1, 100): # 有问题
  135 + declare_xpath = \
  136 + self.driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/ul/li[' + str(j) + ']/a')
  137 + declare_text = declare_xpath.text
  138 + if declare_text == '社会保险网上申报':
  139 + declare_xpath.click()
  140 + time.sleep(5)
  141 + break # 跳出整个循环
  142 +
  143 +
  144 + return True
  145 + except Exception as e:
  146 + logger.error(str(e))
  147 + self.driver.refresh()
  148 + continue # 跳出本次循环
  149 + return False
  150 +
  151 + def __increase(self):
  152 + # 获取增员类型办理任务
  153 + # __get_tasks:获取指定条件的任务函数 constant:常量文件 OP_TYPE_INCREASE:增员 STATUS_INIT:状态初始化
  154 + tasks = self.__get_tasks(constant.OP_TYPE_INCREASE, constant.STATUS_INIT)
  155 + if not tasks:
  156 + return
  157 +
  158 + self.close_notice() # 关闭页面悬浮div弹框
  159 +
  160 + for task in tasks:
  161 + # waclient:请求sass平台文件 get_si_task:更新社保公积金待办任务
  162 + task_detail, err_code = waclient.get_si_task(self.ctx, task['id'])
  163 + if err_code != 200:
  164 + break
  165 +
  166 + # 下载新参保人员证件照
  167 + if 'person_attachments' in task_detail:
  168 + attachs = task['person_attachments'] # 有问题
  169 + if attachs is not None and len(attachs) > 0:
  170 + file_object = attachs[0]
  171 + local_file_path, status_code = waclient.download_file(self.ctx, file_object) # download_file:获取云平台对象文件
  172 + if status_code == 200:
  173 + task_detail['idphoto'] = local_file_path # 有问题
  174 +
  175 + response = self.do_increase(task_detail) # do_increase:北京社保增员操作
  176 + ins = self.get_all_ins(task_detail)
  177 + if not ins:
  178 + ins = ['医疗保险', '生育保险', '养老保险', '失业保险', '工伤保险']
  179 + result = self.return_ins_result(ins=ins, status=constant.STATUS_CONFORMING)
  180 +
  181 + if not self.is_once_submit_increase():
  182 + hhr_type = ''
  183 + comment = response[1]
  184 + if self.is_once_submit():
  185 + return_status = constant.STATUS_SUCCESS
  186 + else:
  187 + return_status = constant.STATUS_CONFORMING
  188 +
  189 + comment_list = response[1].split('#')
  190 + if len(comment_list) >= 2:
  191 + comment = comment_list[0]
  192 + hhr_type = comment_list[1]
  193 + print('---***---')
  194 + print(response)
  195 + print(comment)
  196 + print(return_status)
  197 + print(comment_list)
  198 + print(hhr_type)
  199 + # logger.info('---***---')
  200 + # logger.info(response)
  201 + # logger.info(comment)
  202 + # logger.info(return_status)
  203 + # logger.info(comment_list)
  204 + # logger.info(hhr_type)
  205 + if response[0] != constant.STATUS_INIT:
  206 + if not response[0]:
  207 + return_status = constant.STATUS_FAIL
  208 + result = self.return_ins_result(ins=ins, status=constant.STATUS_FAIL)
  209 + else:
  210 + return_status = constant.STATUS_INIT
  211 + result = self.return_ins_result(ins=ins, status=constant.STATUS_INIT)
  212 + if comment.isdigit():
  213 + return_status = constant.STATUS_SUCCESS
  214 + result = self.return_ins_result(ins=ins, status=constant.STATUS_SUCCESS)
  215 + if '不能进行转入人员增加' in comment:
  216 + return_status = constant.STATUS_SUCCESS
  217 + result = self.return_ins_result(ins=ins, status=constant.STATUS_SUCCESS)
  218 +
  219 + response = waclient.update_si_task(self.ctx, task['id'], return_status, comment, hhr_type=hhr_type, result=result)
  220 + if response[1] != 200:
  221 + logger.error("Task Status Update Fail: " + str(task['id']))
  222 +
  223 + if 'idphoto' in task_detail.keys():
  224 + self.del_batch_file(task_detail['idphoto'])
  225 +
  226 + def do_increase(self, task):
  227 + """北京社保增员操作"""
  228 + if task['handle_type'] == "0":
  229 + return self.new_ginseng(task) # 北京地区社保新参保
  230 + elif task['handle_type'] == "1": # 北京社保转入人员参保
  231 + return self.transfer_staff(task)
  232 +
  233 + def new_ginseng(self, task):
  234 + """北京地区社保新参保"""
  235 + id_num = task['insured_id_num']
  236 + name = task['insured_name']
  237 + # id_type = task['insured_id_type']
  238 + timestamp = task['start_month'] # 获取时间戳
  239 + payers = task['huji_type'] # 缴费人员类别
  240 + tel = task['insured_mobile']
  241 + wage = task['base']
  242 + nation = '汉族'
  243 + photo = ''
  244 + if 'idphoto' in task.keys():
  245 + photo = task['idphoto']
  246 +
  247 + # 判断身份证号码的有效性
  248 + id_num = id_num.upper().replace(' ', '') # upper() 字符串小写转大写
  249 + if not check_id_num(id_num=id_num): # check_id_num:验证身份证号的正确性
  250 + return False, '请输入正确的身份证号: {}'.format(id_num)
  251 + if photo == '':
  252 + return False, '未上传证件照附件'
  253 + # 判断必须字段是否为空
  254 + if not name:
  255 + return False, '姓名为空'
  256 + if not photo:
  257 + return False, '电子照片为空'
  258 + if not timestamp:
  259 + return False, '参保工作日期有误'
  260 + if not payers:
  261 + return False, '缴费人员类别有误'
  262 + if not tel or len(tel) != 11 or not re.findall('^\d*$', tel):
  263 + return False, '手机号有误'
  264 + if not wage:
  265 + return False, '月均工资数据有误'
  266 +
  267 + if payers == '外地农村':
  268 + payers = '外埠农村劳动力'
  269 + elif payers == '外地城镇':
  270 + payers = '外埠场镇职工'
  271 + elif payers == '本地城镇':
  272 + payers = '本地城镇职工'
  273 + elif payers == '本地农村':
  274 + payers = '本地农村劳动力'
  275 +
  276 + time_local = time.localtime(timestamp)
  277 + work_date = time.strftime("%Y-%m-%d", time_local) # 将时间戳转换成格式时间
  278 +
  279 + ext_infos = task['ext_info'] # ext_infos 里面包含了 非被填字段
  280 + per_nation = '工人' # 个人身份
  281 + hukou_address = '' # 户口所在地地址
  282 + hukou_code = '' # 户口所在地邮政编码
  283 + now_address = '' # 居住地联系地址
  284 + now_address_code = '' # 居住地联系邮政编码
  285 + bill_way = '网上查询' # 对账单方式
  286 + education = '大学' # 文化程度
  287 + bank_name = '' # 委托代发银行名称
  288 + bank_num = '' # 委托代发银行账号
  289 + medical1 = '' # 定点医疗机构1
  290 + medical2 = '' # 定点医疗机构2
  291 + medical3 = '' # 定点医疗机构3
  292 + medical4 = '' # 定点医疗机构4
  293 + medical5 = '' # 定点医疗机构5
  294 + four_save_reason = '其它新参统' # 四险个人缴费原因
  295 +
  296 + # 开始对每个扩展字段进行查询和赋值
  297 + staff_type = '' # 员工类型
  298 + uniform_code = '' # 统一社会信用代码
  299 + uniform = '' # 用工单位
  300 + work_post = '' # 岗位
  301 + salary = '' # 合同约定工资薪金
  302 + laborStartDate = '' # 劳动合同开始时间
  303 + laborEndDate = '' # 劳动合同结束时间
  304 + contract_type = '固定期限劳动合同'
  305 + singed_contract = ''
  306 + # 开始对每个扩展字段进行查询和赋值 # 有问题
  307 + for ext_info in ext_infos:
  308 + if ext_info['name'] == '个人身份':
  309 + per_nation = ext_info['value']
  310 + if ext_info['name'] == '户口所在地地址':
  311 + hukou_address = ext_info['value']
  312 + if ext_info['name'] == '户口所在地邮政编码':
  313 + hukou_code = ext_info['value'].replace(' ', '')
  314 + if ext_info['name'] == '居住地(联系)地址':
  315 + now_address = ext_info['value']
  316 + if ext_info['name'] == '居住地(联系)邮政编码':
  317 + now_address_code = ext_info['value']
  318 + if '对账单方式' in ext_info['name']:
  319 + bill_way = ext_info['value']
  320 + if ext_info['name'] == '文化程度':
  321 + education = ext_info['value']
  322 + if ext_info['name'] == '委托代发银行名称':
  323 + bank_name = ext_info['value']
  324 + if bank_name == "北京银行" or bank_name == "农商银行" or bank_name == "广发银行":
  325 + bank_name += "(只限本市)"
  326 + if ext_info['name'] == '委托代发银行账号':
  327 + bank_num = ext_info['value'].replace(' ', '')
  328 + if ext_info['name'] == '定点医疗机构1':
  329 + medical1 = ext_info['value'].replace(' ', '')
  330 + if ext_info['name'] == '定点医疗机构2':
  331 + medical2 = ext_info['value'].replace(' ', '')
  332 + if ext_info['name'] == '定点医疗机构3':
  333 + medical3 = ext_info['value'].replace(' ', '')
  334 + if ext_info['name'] == '定点医疗机构4':
  335 + medical4 = ext_info['value'].replace(' ', '')
  336 + if ext_info['name'] == '定点医疗机构5':
  337 + medical5 = ext_info['value'].replace(' ', '')
  338 + if ext_info['name'] == '民族':
  339 + nation = ext_info['value']
  340 + if '族' not in nation:
  341 + nation += '族'
  342 + if '四险个人缴费原因' in ext_info['name']:
  343 + four_save_reason = ext_info['value'].replace(' ', '')
  344 + if ext_info['name'] == '员工类型':
  345 + staff_type = ext_info['value']
  346 + if ext_info['name'] == '统一社会信用代码':
  347 + uniform_code = ext_info['value']
  348 + if ext_info['name'] == '用工单位':
  349 + uniform = ext_info['value']
  350 + if ext_info['name'] == '岗位':
  351 + work_post = ext_info['value']
  352 + if ext_info['name'] == '劳动合同约定工资':
  353 + salary = ext_info['value']
  354 + if ext_info['name'] == '劳动合同起止时间':
  355 + laborStartDate = ext_info['value']
  356 + if ext_info['name'] == '劳动合同结束时间':
  357 + laborEndDate = ext_info['value']
  358 + if ext_info['name'] == '是否已签订电子劳动合同':
  359 + singed_contract = ext_info['value']
  360 +
  361 + # 判断用户扩展字段的完整性
  362 + if not hukou_address:
  363 + return False, '户口所在地地址为空' # 有问题
  364 + if not hukou_code:
  365 + return False, '户口所在地邮政编码为空'
  366 + if not now_address:
  367 + now_address = hukou_address
  368 + if not now_address_code:
  369 + now_address_code = hukou_code
  370 + if not bank_name:
  371 + return False, '委托代发银行名称为空'
  372 + if not bank_num:
  373 + return False, '委托代发银行账号为空'
  374 + if not medical1:
  375 + return False, '定点医疗机构1为空'
  376 + if not medical2:
  377 + return False, '定点医疗机构2为空'
  378 + if per_nation not in ['工人', '干部']:
  379 + return False, '个人身份数据有误'
  380 + if not task['insurances']:
  381 + return False, '参加险种为空'
  382 + if not contract_type:
  383 + contract_type = '固定期限劳动合同'
  384 + if not education:
  385 + education = '大学'
  386 + if not singed_contract:
  387 + singed_contract = '否'
  388 +
  389 + # 判断区分人力资源账户和单立户
  390 + if self.job.mark == '人力资源':
  391 + if not staff_type:
  392 + staff_type = '本单位员工'
  393 + # return False, '员工类型为空'
  394 + if not uniform_code:
  395 + return False, '统一社会信用代码为空'
  396 + if not work_post:
  397 + return False, '岗位为空'
  398 + if not salary:
  399 + salary = wage
  400 + # return False, '合同约定工资薪金为空'
  401 + if not laborStartDate:
  402 + return False, '劳动合同起止时间'
  403 + if not laborEndDate:
  404 + return False, '劳动合同结束时间为空'
  405 +
  406 + comment = '网络或服务器繁忙,请稍后再试'
  407 + for i in range(3):
  408 + status, comment = self.check_nav_show(div_id='level:1', one_id='link000', two_id='link002') # check_nav_show:检查左侧导航是否显示二级导航
  409 + if not status:
  410 + return constant.STATUS_INIT, comment
  411 + self.driver.switch_to.default_content()
  412 + try:
  413 + self.driver.find_element_by_xpath('/html/body/div[last()]/div[@class="popup_top"]/h2/a').click()
  414 + except Exception as e:
  415 + logger.info('没有提示')
  416 + logger.error(str(e))
  417 + time.sleep(2)
  418 + try:
  419 + self.driver.find_element_by_xpath('/html/body/div[@class="popwrap"]/div/h2/a').click()
  420 + except Exception as e:
  421 + logger.info('没有提示')
  422 + logger.error(str(e))
  423 + self.driver.switch_to.default_content()
  424 + self.driver.switch_to.frame('center')
  425 + self.driver.switch_to.frame('mainFrame')
  426 + try:
  427 + self.driver.find_element_by_id('idcard').send_keys(id_num) # 输入身份证号
  428 + self.driver.find_element_by_id('name').send_keys(name) # 输入姓名
  429 + select = Select(self.driver.find_element_by_id("cardType")) # 证件类型
  430 + select.select_by_visible_text('居民身份证') # select_by_visible_text 下拉框的文本值
  431 + time.sleep(1)
  432 + self.driver.find_element_by_id('reg').click() # 确定
  433 + time.sleep(1)
  434 + # self.driver.switch_to.default_content()
  435 + # self.driver.switch_to.frame('center')
  436 + # try:
  437 + # self.driver.find_element_by_xpath('/html/body/div[@class="popwrap"]/div/h2/a').click()
  438 + # except Exception as e:
  439 + # logger.info('没有提示')
  440 + # logger.error(str(e))
  441 + try: # 有问题
  442 + # '/html/body/table[2]/tbody/tr/td/table[1]/tbody/tr/td/font/ul/li/span').text
  443 + source_text = self.driver.page_source
  444 + # if '系统提示' in source_text:
  445 + # js_ad = "var aa=document.getElementsByClassName('popup_top')[0];aa.parentNode.removeChild(aa)"
  446 + # self.driver.execute_script(js_ad)
  447 + # else:
  448 + # logger.info('没有广告')
  449 + if re.findall('业务系统中已有该身份证号', source_text):
  450 + return False, "业务系统中已有该身份证号"
  451 + elif re.findall('个人信息登记业务中已存在', source_text):
  452 + # 点击【编辑按钮】
  453 + lists = self.driver.find_elements_by_xpath('//*[@id="allform"]/table[1]/tbody/tr')[1:]
  454 + for k in range(len(lists)):
  455 + try:
  456 + count = k + 2
  457 + xpath1 = "//*[@id='allform']/table[1]/tbody/tr[" + str(count) + "]/td[2]/div[1]/input[2]"
  458 + card_num = self.driver.find_element_by_xpath(xpath1).get_attribute('value')
  459 + if id_num in card_num:
  460 + xpath2 = "//*[@id='allform']/table[1]/tbody/tr[" + str(count) + "]/td[9]/div/a"
  461 + self.driver.find_element_by_xpath(xpath2).click()
  462 + break
  463 + except Exception as e:
  464 + logger.error(str(e))
  465 + except Exception as e:
  466 + logger.error(str(e))
  467 +
  468 + time.sleep(2)
  469 + # is_selected
  470 + ylbx_check = self.driver.find_element_by_id('kinds-1')
  471 + if not ylbx_check.is_selected():
  472 + ylbx_check.click()
  473 +
  474 + sybx_check = self.driver.find_element_by_id('kinds-2')
  475 + if not sybx_check.is_selected():
  476 + sybx_check.click()
  477 +
  478 + gsbx_check = self.driver.find_element_by_id('kinds-3')
  479 + if not gsbx_check.is_selected():
  480 + gsbx_check.click()
  481 +
  482 + syubx_check = self.driver.find_element_by_id('kinds-4')
  483 + if not syubx_check.is_selected():
  484 + syubx_check.click()
  485 +
  486 + jbylbx_check = self.driver.find_element_by_id('kinds-5')
  487 + if not jbylbx_check.is_selected():
  488 + jbylbx_check.click()
  489 +
  490 + # self.driver.find_element_by_id('name').clear()
  491 + # self.driver.find_element_by_id('name').send_keys(name) # 姓名
  492 + select = Select(self.driver.find_element_by_id("psnstatus")) # 个人身份
  493 + select.select_by_visible_text(per_nation) #定位 select 下拉框
  494 + self.driver.find_element_by_id('workdate').clear()
  495 + self.driver.find_element_by_id('workdate').send_keys(work_date) # 工作日期
  496 + js = "document.getElementById('photo').setAttribute('onchange',' ')" # 去除弹窗
  497 + self.driver.execute_script(js)
  498 + self.driver.find_element_by_id('photo').send_keys(photo) # 上传照片
  499 + time.sleep(1)
  500 + self.driver.find_element_by_id('photobutton').click() # 上传
  501 + time.sleep(3)
  502 +
  503 + select_nation = Select(self.driver.find_element_by_id('nation')) # 设置名族
  504 + select_nation.select_by_visible_text(nation)
  505 + select = Select(self.driver.find_element_by_id("feepsntype")) # 缴费人员类别
  506 + select.select_by_index(0) # 下拉框的索引
  507 + time.sleep(0.5)
  508 + select.select_by_visible_text(payers)
  509 +
  510 + self.driver.find_element_by_id('residentaddr').clear()
  511 + self.driver.find_element_by_id('residentaddr').send_keys(hukou_address) # 籍贯
  512 + self.driver.find_element_by_id('residentzip').clear()
  513 + self.driver.find_element_by_id('residentzip').send_keys(hukou_code) # 籍贯邮编
  514 + self.driver.find_element_by_id("address").clear() # 清除输入框内容
  515 + self.driver.find_element_by_id('address').send_keys(now_address) # 现住址
  516 + self.driver.find_element_by_id('zip').clear()
  517 + self.driver.find_element_by_id('zip').send_keys(now_address_code) # 现住址邮编
  518 +
  519 + select = Select(self.driver.find_element_by_id('getBillMethod')) # 对账单方式
  520 + select.select_by_visible_text(bill_way)
  521 + select = Select(self.driver.find_element_by_id('education')) # 文化程度
  522 + select.select_by_visible_text(education)
  523 + self.driver.find_element_by_id('tel').clear()
  524 + self.driver.find_element_by_id('tel').send_keys(tel) # 手机号
  525 + self.driver.find_element_by_id('cellphone').clear()
  526 + self.driver.find_element_by_id('cellphone').send_keys(tel)
  527 + self.driver.find_element_by_id('salary').clear()
  528 + self.driver.find_element_by_id('salary').send_keys(wage)
  529 +
  530 + bank_list = self.driver.find_elements_by_xpath('//*[@id="deputybank"]/option')
  531 + select = Select(self.driver.find_element_by_id('deputybank')) # 委托代发银行名称
  532 + for item in bank_list:
  533 + if item.text in bank_name:
  534 + select.select_by_visible_text(item.text)
  535 + break
  536 +
  537 + self.driver.find_element_by_id('deputybankaccount').clear()
  538 + self.driver.find_element_by_id('deputybankaccount').send_keys(bank_num) # 银行卡号
  539 +
  540 + # 配置定点医疗机构1
  541 + self.driver.find_element_by_id('set1').click() # 配置定点医疗机构1
  542 + self.driver.switch_to.frame('hosp1Frame') # 切换到frame下寻找元素
  543 + self.driver.find_element_by_id('personInfoReg_search').send_keys(medical1) # 输入医院1
  544 + self.driver.find_elements_by_tag_name('input')[2].click()
  545 + time.sleep(1)
  546 + tds = self.driver.find_elements_by_tag_name('td')
  547 + if len(tds) <= 4:
  548 + return False, '定点医疗机构1不存在'
  549 +
  550 + # 选择查询到的医疗机构1
  551 + inputs = self.driver.find_elements_by_tag_name('input')
  552 + for item in inputs:
  553 + if item.get_attribute('value') == '选择':
  554 + item.click()
  555 + break
  556 + self.driver.switch_to.default_content() # 退出frame
  557 + self.driver.switch_to.frame('center')
  558 + self.driver.switch_to.frame('mainFrame') # 切换到frame下寻找元素
  559 + time.sleep(1)
  560 +
  561 + # 配置定点医疗机构2
  562 + self.driver.find_element_by_id('set2').click() # 配置定点医疗机构1
  563 + self.driver.switch_to.frame('hosp2Frame') # 切换到frame下寻找元素
  564 + self.driver.find_element_by_id('personInfoReg_search').send_keys(medical2) # 输入医院2
  565 + self.driver.find_elements_by_tag_name('input')[2].click()
  566 + time.sleep(1)
  567 + tds = self.driver.find_elements_by_tag_name('td')
  568 + if len(tds) <= 4:
  569 + return False, '定点医疗机构2不存在'
  570 +
  571 + # 选择查询到的医疗机构1
  572 + inputs = self.driver.find_elements_by_tag_name('input')
  573 + for j in inputs:
  574 + if j.get_attribute('value') == '选择':
  575 + j.click()
  576 + break
  577 + self.driver.switch_to.default_content() # 退出frame
  578 + self.driver.switch_to.frame('center')
  579 + self.driver.switch_to.frame('mainFrame') # 切换到frame下寻找元素
  580 + time.sleep(1)
  581 +
  582 + # 配置定点医疗机构3
  583 + if medical3:
  584 + self.__select_medical('set3', 'hosp3Frame', medical3)
  585 + # 配置定点医疗机构4
  586 + if medical4:
  587 + self.__select_medical('set4', 'hosp4Frame', medical4)
  588 + # 配置定点医疗机构5
  589 + if medical5:
  590 + self.__select_medical('set5', 'hosp5Frame', medical5)
  591 +
  592 + select = Select(self.driver.find_element_by_id('hosReason')) # 医保个人缴费原因
  593 + select.select_by_visible_text('新参统')
  594 + select = Select(self.driver.find_element_by_id('fourReason')) # 四险个人缴费原因
  595 + select.select_by_visible_text(four_save_reason)
  596 + # 新增中新加字段
  597 + if self.job.mark == '人力资源':
  598 + # js_val = 'document.getElementById("staffType").value="劳务外包员工"'
  599 + select = Select(self.driver.find_element_by_id("staffType")) # 员工类型
  600 + select.select_by_visible_text(staff_type)
  601 + # self.driver.execute_script(js_val)
  602 + # time.sleep(1)
  603 + # self.driver.find_element_by_id('staffType').send_keys('劳务外包员工')
  604 + time.sleep(1)
  605 + # js = "document.getElementById('photo').setAttribute('onchange',' ')" # 去除弹窗
  606 + # self.driver.execute_script(js)
  607 + if staff_type == '劳务外包员工':
  608 + time.sleep(3)
  609 + self.new_system_prompt()
  610 + # js_cl1 = "document.getElementsByTagName('div')[1].style.display='none'"
  611 + # self.driver.execute_script(js_cl1)
  612 + # time.sleep(2)
  613 + # js = "document.getElementById('coverTop').style.display='none'"
  614 + # self.driver.execute_script(js)
  615 + # self.left_click(1259, 357)
  616 + time.sleep(1)
  617 + if staff_type != '本单位员工':
  618 + self.driver.find_element_by_id('employerUscc').send_keys(uniform_code) # 输入社会统一信用代码
  619 + # TODO 统一信用代码输入错误处理
  620 + js = "document.getElementById('employerDeptName').removeAttribute('readonly')" # 删除元素
  621 + self.driver.execute_script(js)
  622 + time.sleep(1)
  623 + self.driver.find_element_by_id('employerDeptName').send_keys(uniform) # 填写用工单位名称
  624 + # 设置合同开始时间
  625 + try:
  626 + time.sleep(1)
  627 + js_start = 'document.getElementById("laborStartDate").value="%s";' % (laborStartDate) #
  628 + self.driver.execute_script(js_start)
  629 + time.sleep(2)
  630 + js_end = 'document.getElementById("laborEndDate").value="%s";' % (laborEndDate) #
  631 + self.driver.execute_script(js_end)
  632 + # self.driver.switch_to_default_content()
  633 + # self.driver.switch_to.frame('center')
  634 + # self.driver.switch_to.frame('mainFrame')
  635 + # self.driver.find_element_by_id('laborStartDate').clear()
  636 + # self.driver.find_element_by_id('laborStartDate').send_keys(laborStartDate) # 输入劳动合同开始时间
  637 + # self.driver.switch_to.frame(0)
  638 + # self.driver.find_element_by_id('dpTodayInput').click() # 点击日期窗口的今天按钮
  639 + except Exception as e:
  640 + logger.error(str(e))
  641 + self.driver.refresh()
  642 + continue
  643 + time.sleep(1)
  644 +
  645 + # 设置合同结束时间
  646 + # try:
  647 + # # self.driver.switch_to_default_content()
  648 + # # self.driver.switch_to.frame('center')
  649 + # # self.driver.switch_to.frame('mainFrame')
  650 + # # year, month, day = self.__date()
  651 + # js = "document.getElementById('laborEndDate').removeAttribute('readonly')" # 删除元素
  652 + # self.driver.execute_script(js)
  653 + # # endDay = str(year) + '-' + str(month) + '-' + str(day)
  654 + # self.driver.find_element_by_id('laborEndDate').send_keys(laborEndDate) # 输入合同结束时间
  655 + # self.driver.find_element_by_xpath(
  656 + # '//*[@id="newform"]/table[1]/tbody/tr/td/table/tbody/tr[9]/td[1]/strong').click()
  657 + # time.sleep(1)
  658 + # except Exception as e:
  659 + # logger.error(str(e))
  660 + # self.driver.refresh()
  661 + # continue
  662 + time.sleep(2)
  663 + # 劳动合同类型
  664 + select = Select(self.driver.find_element_by_id("laborContractType"))
  665 + select.select_by_visible_text(contract_type)
  666 + time.sleep(2)
  667 + if singed_contract in '否':
  668 + self.driver.find_element_by_id('signElectronicLabor0').click()
  669 + else:
  670 + self.driver.find_element_by_id('signElectronicLabor1').click()
  671 + time.sleep(2)
  672 + # self.driver.find_element_by_xpath(
  673 + # '//*[@id="newform"]/table[1]/tbody/tr/td/table/tbody/tr[9]/td[1]/strong').click()
  674 + # self.driver.find_element_by_id('employerDeptName').click() # 带出用工单位名称
  675 + select = Select(self.driver.find_element_by_id("workPost")) # 岗位
  676 + select.select_by_visible_text(work_post)
  677 + self.driver.find_element_by_id('contractSalary').send_keys(salary) # 合同约定工资薪金
  678 + time.sleep(1)
  679 + time.sleep(2)
  680 + self.driver.find_element_by_id('submitshow').click() # 提交按钮
  681 + try:
  682 + time.sleep(1)
  683 + self.driver.switch_to_alert().accept() # 弹窗处理
  684 + except Exception as e:
  685 + logger.error(str(e))
  686 + try:
  687 + time.sleep(1)
  688 + self.new_system_prompt()
  689 + except Exception as e:
  690 + logger.error(str(e))
  691 + time.sleep(2)
  692 + for _ in range(3):
  693 + try:
  694 + # 确认用户信息悬浮框
  695 + time.sleep(3)
  696 + self.driver.find_element_by_xpath('//*[@id="newDiv"]/button[1]').click()
  697 + break
  698 + except Exception as e:
  699 + logger.error(str(e))
  700 + time.sleep(2)
  701 + continue
  702 +
  703 + for m in range(3):
  704 + # 处理操作业务成功的逻辑
  705 + try:
  706 + msg = self.driver.find_element_by_xpath('/html/body/div[2]/form[1]/table[1]/tbody/tr[1]/td[1]/div[1]/span').text
  707 + if '业务导入失败' in msg:
  708 + logger.error(msg)
  709 + return True, msg
  710 + elif '业务导入成功' in msg:
  711 + logger.info(msg)
  712 + gov_ids = re.findall('\d{16}', msg)
  713 + if gov_ids:
  714 + gov_id = gov_ids[0].strip()
  715 + return True, gov_id
  716 + except Exception as e:
  717 + logger.error(str(e))
  718 + return True, "等待查询反馈"
  719 + except Exception as e:
  720 + logger.error(str(e))
  721 + self.driver.refresh()
  722 + continue
  723 + return constant.STATUS_INIT, comment
  724 +
  725 + def transfer_staff(self, task):
  726 + """北京社保转入人员参保"""
  727 + id_num = task['insured_id_num']
  728 + name = task['insured_name']
  729 + wage = task['base']
  730 +
  731 + id_num = id_num.upper().replace(' ', '')
  732 + if not check_id_num(id_num=id_num):
  733 + logger.error('请输入正确的身份证号: {}'.format(id_num))
  734 + return False, '请输入正确的身份证号: {}'.format(id_num)
  735 +
  736 + ext_infos = task['ext_info']
  737 + staff_type = '' # 员工类型
  738 + uniform_code = '' # 统一社会信用代码
  739 + uniform = '' # 用工单位
  740 + work_post = '' # 岗位
  741 + salary = '' # 合同约定工资薪金
  742 + laborStartDate = '' # 劳动合同开始时间
  743 + laborEndDate = '' # 劳动合同结束时间
  744 + contract_type = ''
  745 + singed_contract = ''
  746 + for ext_info in ext_infos:
  747 + if ext_info['name'] == '员工类型':
  748 + staff_type = ext_info['value']
  749 + if ext_info['name'] == '统一社会信用代码':
  750 + uniform_code = ext_info['value']
  751 + if ext_info['name'] == '用工单位':
  752 + uniform = ext_info['value']
  753 + if ext_info['name'] == '岗位':
  754 + work_post = ext_info['value']
  755 + if ext_info['name'] == '合同约定工资薪金':
  756 + salary = ext_info['value']
  757 + if ext_info['name'] == '劳动合同开始时间':
  758 + laborStartDate = ext_info['value']
  759 + if ext_info['name'] == '劳动合同结束时间':
  760 + laborEndDate = ext_info['value']
  761 + if ext_info['name'] == '劳动合同类型':
  762 + contract_type = ext_info['value']
  763 + if ext_info['name'] == '是否已签订电子劳动合同':
  764 + singed_contract = ext_info['value']
  765 +
  766 + # 判断区分人力资源账户和单立户
  767 + if self.job.mark == '人力资源':
  768 + if not staff_type:
  769 + staff_type = '本单位员工'
  770 + # return False, '员工类型为空'
  771 + if not uniform_code:
  772 + return False, '统一社会信用代码为空'
  773 + if not work_post:
  774 + return False, '岗位为空'
  775 + if not salary:
  776 + salary = wage
  777 + # return False, '合同约定工资薪金为空'
  778 + if not laborStartDate:
  779 + return False, '劳动合同开始时间为空'
  780 + if not laborEndDate:
  781 + return False, '劳动合同结束时间为空'
  782 + if not contract_type:
  783 + contract_type = '固定期限劳动合同'
  784 + if not singed_contract:
  785 + singed_contract = '否'
  786 +
  787 +
  788 + comment = '网络或服务器繁忙,请稍后再试'
  789 + for i in range(3):
  790 + status, comment = self.check_nav_show(div_id='level:1', one_id='link000', two_id='link003')
  791 + if not status:
  792 + return constant.STATUS_INIT, comment
  793 +
  794 + self.system_prompt()
  795 +
  796 + try:
  797 + time.sleep(1)
  798 + self.driver.find_element_by_xpath('//*[@id="Layer2"]/table/tbody/tr[1]/td[2]/a').click() # 点击关闭
  799 + except Exception as e:
  800 + logger.error(str(e))
  801 + self.driver.switch_to.default_content()
  802 + try:
  803 + # self.driver.find_element_by_xpath('/html/body/div[@class="popwrap"]/div/h2/a').click()
  804 + self.driver.find_element_by_xpath('/html/body/div[last()]/div[@class="popup_top"]/h2/a').click()
  805 + except Exception as e:
  806 + logger.info('没有提示')
  807 + logger.error(str(e))
  808 + time.sleep(2)
  809 + try:
  810 + self.driver.find_element_by_xpath('/html/body/div[@class="popwrap"]/div/h2/a').click()
  811 + except Exception as e:
  812 + logger.info('没有提示')
  813 + logger.error(str(e))
  814 + self.driver.switch_to.default_content()
  815 + self.driver.switch_to.frame('center')
  816 + self.driver.switch_to.frame('mainFrame')
  817 + try:
  818 + time.sleep(1)
  819 + self.driver.find_element_by_id('button').click() # 点击普通增员
  820 + except Exception as e:
  821 + logger.error(str(e))
  822 + self.driver.refresh()
  823 + continue
  824 +
  825 + try:
  826 + time.sleep(1)
  827 + self.driver.find_element_by_xpath('//*[@id="Layer2"]/table/tbody/tr[1]/td[2]/a').click() # 点击关闭
  828 + except Exception as e:
  829 + logger.error(str(e))
  830 +
  831 + try:
  832 + self.driver.find_element_by_id('dataNormalAdd.idCard').send_keys(id_num) # 输入身份证号
  833 + self.driver.find_element_by_id('dataNormalAdd.personName').send_keys(name) # 输入姓名
  834 + self.driver.find_element_by_xpath('//*[@id="newform"]/table[1]/tbody/tr/td/table/tbody/tr[2]/td[2]/label[2]/input').click() # 点击查询
  835 + time.sleep(1)
  836 +
  837 + # 判断该人员是否可以正常转入
  838 + card_text = self.driver.find_element_by_xpath("//*[@id='listzone']/table[2]/tbody/tr[1]/td[1]/table[1]/tbody/tr[2]/td[2]").text
  839 + if id_num not in card_text:
  840 + cause = self.driver.find_element_by_xpath("//*[@id='messages']/ul[1]/li[1]/span").text
  841 + if '查询结果为空' in cause or '不能进行转入人员增加' in cause:
  842 + return False, cause
  843 + return True, cause
  844 +
  845 + person_type = self.driver.find_element_by_xpath('//*[@id="listzone"]/table[2]/tbody/tr/td/table/tbody/tr[5]/td[2]').text
  846 + person_type = person_type.replace(' ', '').replace('\n', '').replace('\t', '')
  847 + hhr_type = person_type # 转入人员必须返回户籍类型
  848 + logger.info("转入户籍类型:" + str(hhr_type))
  849 +
  850 + if person_type == '自由职业人员':
  851 + person_type = '本市城镇职工'
  852 + elif person_type == '本市农村劳动力(24号文)':
  853 + person_type = '本市农村劳动力(养24号文)'
  854 + elif person_type == '灵活就业':
  855 + logger.info('户籍类型:灵活就业')
  856 + return False, person_type
  857 + select = Select(self.driver.find_element_by_id('personType')) # 缴费人员类别
  858 + select.select_by_visible_text(person_type)
  859 + self.driver.find_element_by_id('pay').send_keys(wage) # 申报月工资收入
  860 +
  861 + # logger.info('备注字段:{}'.format(self.job.mark))
  862 + if self.job.mark in '人力资源':
  863 + print(self.job.mark)
  864 + time.sleep(2)
  865 + select = Select(self.driver.find_element_by_id("staffType")) # 员工类型
  866 + select.select_by_visible_text(staff_type)
  867 + time.sleep(1)
  868 + # 设置合同开始时间
  869 + try:
  870 + time.sleep(1)
  871 + js_start = 'document.getElementById("laborStartDate").value="%s";' % (laborStartDate) #
  872 + self.driver.execute_script(js_start)
  873 + time.sleep(2)
  874 + js_end = 'document.getElementById("laborEndDate").value="%s";' % (laborEndDate) #
  875 + self.driver.execute_script(js_end)
  876 + # self.driver.switch_to_default_content()
  877 + # self.driver.switch_to.frame('center')
  878 + # self.driver.switch_to.frame('mainFrame')
  879 + # self.driver.find_element_by_id('laborStartDate').clear()
  880 + # self.driver.find_element_by_id('laborStartDate').send_keys(laborStartDate) # 输入劳动合同开始时间
  881 + # self.driver.switch_to.frame(0)
  882 + # self.driver.find_element_by_id('dpTodayInput').click() # 点击日期窗口的今天按钮
  883 + except Exception as e:
  884 + logger.error(str(e))
  885 + self.driver.refresh()
  886 + continue
  887 + time.sleep(1)
  888 + # 设置合同结束时间
  889 + # try:
  890 + # # self.driver.switch_to_default_content()
  891 + # # self.driver.switch_to.frame('center')
  892 + # # self.driver.switch_to.frame('mainFrame')
  893 + # # year, month, day = self.__date()
  894 + # js = "document.getElementById('laborEndDate').removeAttribute('readonly')" # 删除元素
  895 + # self.driver.execute_script(js)
  896 + # # endDay = str(year) + '-' + str(month) + '-' + str(day)
  897 + # self.driver.find_element_by_id('laborEndDate').send_keys(laborEndDate) # 输入合同结束时间
  898 + # self.driver.find_element_by_xpath('//*[@id="newform"]/table[1]/tbody/tr/td/table/tbody/tr[9]/td[1]/strong').click()
  899 + # time.sleep(1)
  900 + # except Exception as e:
  901 + # logger.error(str(e))
  902 + # self.driver.refresh()
  903 + # continue
  904 + # 劳动合同类型
  905 + select = Select(self.driver.find_element_by_id("laborContractType"))
  906 + select.select_by_visible_text(contract_type)
  907 + time.sleep(2)
  908 + # 签订劳动合同时间
  909 + # self.driver.find_element_by_id('laborSignDate').clear()
  910 + # self.driver.find_element_by_id('laborSignDate').send_keys(laborStartDate)
  911 + # self.driver.switch_to_default_content()
  912 + # self.driver.switch_to.frame('center')
  913 + # self.driver.switch_to.frame('mainFrame')
  914 + time.sleep(2)
  915 + if staff_type == '劳务外包员工':
  916 + self.system_prompt()
  917 + if staff_type != '本单位员工':
  918 + self.driver.find_element_by_id('employerUscc').send_keys(uniform_code) # 输入社会统一信用代码
  919 + # TODO 统一信用代码输入错误处理
  920 + js = "document.getElementById('employerDeptName').removeAttribute('readonly')" # 删除元素
  921 + self.driver.execute_script(js)
  922 + time.sleep(1)
  923 + # self.driver.find_element_by_id('employerDeptName').send_keys(uniform) # 填写用工单位名称
  924 + self.driver.find_element_by_id('employerDeptName').click() # 填写用工单位名称
  925 + # self.driver.find_element_by_xpath(
  926 + # '//*[@id="newform"]/table[1]/tbody/tr/td/table/tbody/tr[9]/td[1]/strong').click()
  927 + # self.driver.find_element_by_id('employerDeptName').click() # 带出用工单位名称
  928 + select = Select(self.driver.find_element_by_id("workPost")) # 岗位
  929 + select.select_by_visible_text(work_post)
  930 + self.driver.find_element_by_id('contractSalary').send_keys(salary) # 合同约定工资薪金
  931 + time.sleep(2)
  932 + # 是否已签订电子劳动合同
  933 + if singed_contract in '否':
  934 + time.sleep(2)
  935 + self.driver.find_element_by_id('signElectronicLabor0').click()
  936 + else:
  937 + time.sleep(2)
  938 + self.driver.find_element_by_id('signElectronicLabor1').click()
  939 + else:
  940 + try:
  941 + time.sleep(1) #
  942 + js_start = 'document.getElementById("laborStartDate").value="%s";' % (laborStartDate) #
  943 + self.driver.execute_script(js_start)
  944 + time.sleep(2)
  945 + js_end = 'document.getElementById("laborEndDate").value="%s";' % (laborEndDate) #
  946 + self.driver.execute_script(js_end)
  947 + except Exception as e:
  948 + logger.error(str(e))
  949 + self.driver.refresh()
  950 + continue
  951 + time.sleep(1)
  952 + # 劳动合同类型
  953 + select = Select(self.driver.find_element_by_id("laborContractType"))
  954 + select.select_by_visible_text(contract_type)
  955 + time.sleep(2)
  956 + select = Select(self.driver.find_element_by_id("workPost")) # 岗位
  957 + select.select_by_visible_text(work_post)
  958 + time.sleep(2)
  959 + self.driver.find_element_by_id('contractSalary').send_keys(salary) # 合同约定工资薪金
  960 + time.sleep(2)
  961 + # 是否已签订电子劳动合同
  962 + if singed_contract in '否':
  963 + time.sleep(2)
  964 + self.driver.find_element_by_id('signElectronicLabor0').click()
  965 + else:
  966 + time.sleep(2)
  967 + self.driver.find_element_by_id('signElectronicLabor1').click()
  968 + time.sleep(1)
  969 +
  970 + # return True, '等待查询反馈'
  971 + self.driver.find_element_by_id('submitButton').click() # 点击【提交】
  972 +
  973 + # 判断弹窗错误信息
  974 + try:
  975 + alert_text = self.driver.switch_to_alert().text
  976 + logger.error('{}'.format(alert_text))
  977 + self.driver.switch_to_alert().accept()
  978 + return False, alert_text
  979 + except Exception as e:
  980 + logger.error(str(e))
  981 +
  982 + for k in range(4):
  983 + time.sleep(2)
  984 + sound_code = self.driver.page_source
  985 + if '人员已处于正常缴费状态' in sound_code:
  986 + return True, '等待查询反馈' + '#' + hhr_type
  987 + elif '业务操作失败' in sound_code:
  988 + logger.error('业务操作失败')
  989 + cause = self.driver.find_element_by_xpath('//*[@id="0"]/td/table/tbody/tr[3]/td/span/span').text
  990 + return True, cause + '#' + hhr_type
  991 + elif '业务操作成功' in sound_code:
  992 + gov_id = self.driver.find_element_by_xpath('//*[@id="0"]/td/table/tbody/tr[2]/td/span/span').text
  993 + logger.info("转入流水号:" + str(gov_id))
  994 + if gov_id:
  995 + gov_id = gov_id.replace(' ', '')
  996 + return True, gov_id + '#' + hhr_type
  997 + return True, '等待查询反馈'
  998 + except Exception as e:
  999 + logger.error(str(e))
  1000 + self.driver.refresh()
  1001 + continue
  1002 + return constant.STATUS_INIT, comment
  1003 +
  1004 + def __decrease(self): # 有问题
  1005 + logger.info('start decrease ')
  1006 + tasks = self.__get_tasks(constant.OP_TYPE_DECREASE, constant.STATUS_INIT)
  1007 + if not tasks:
  1008 + return
  1009 + try:
  1010 + self.close_notice()
  1011 + except Exception as e:
  1012 + logger.info(str(e))
  1013 +
  1014 + for task in tasks:
  1015 + task_detail, err_code = waclient.get_si_task(self.ctx, task['id'])
  1016 + if err_code != 200:
  1017 + break
  1018 +
  1019 + response = self.do_decrease(task_detail)
  1020 + comment = response[1]
  1021 +
  1022 + # logger.info(('---***---'))
  1023 + # logger.info(response)
  1024 + # logger.info(comment)
  1025 + ins = self.get_all_ins(task_detail)
  1026 + if not ins:
  1027 + ins = ['医疗保险', '生育保险', '养老保险', '失业保险', '工伤保险']
  1028 + result = self.return_ins_result(ins=ins, status=constant.STATUS_CONFORMING)
  1029 +
  1030 + if self.is_once_submit():
  1031 + return_status = constant.STATUS_SUCCESS
  1032 + result = self.return_ins_result(ins=ins, status=constant.STATUS_SUCCESS)
  1033 + else:
  1034 + return_status = constant.STATUS_CONFORMING
  1035 +
  1036 + # if response[0] != constant.STATUS_INIT:
  1037 + # if not response[0]:
  1038 + # return_status = constant.STATUS_FAIL
  1039 + # result = self.return_ins_result(ins=ins, status=constant.STATUS_FAIL)
  1040 + # else:
  1041 + # return_status = constant.STATUS_INIT
  1042 + # result = self.return_ins_result(ins=ins, status=constant.STATUS_INIT)
  1043 + print('---***--')
  1044 + print(return_status)
  1045 + print(comment)
  1046 + print(result)
  1047 + if '等待查询反馈' in comment:
  1048 + return_status = constant.STATUS_CONFORMING
  1049 + if comment.isdigit(): # 减员成功
  1050 + return_status = constant.STATUS_SUCCESS
  1051 + result = self.return_ins_result(ins=ins, status=constant.STATUS_SUCCESS)
  1052 + if '无权查看此人信息' in comment:
  1053 + return_status = constant.STATUS_SUCCESS
  1054 + result = self.return_ins_result(ins=ins, status=constant.STATUS_FAIL)
  1055 + if '[养老缴费(中断)转出未转入] [失业缴费(中断)转出未转入] [工伤缴费(中断)转出未转入] [医保缴费 (暂停)缴费]' in comment:
  1056 + return_status = constant.STATUS_SUCCESS
  1057 + result = self.return_ins_result(ins=ins, status=constant.STATUS_SUCCESS)
  1058 + if '人员已处于中断缴费状态,不允许重复减员' in comment:
  1059 + return_status = constant.STATUS_SUCCESS
  1060 + result = self.return_ins_result(ins=ins, status=constant.STATUS_SUCCESS)
  1061 + response = waclient.update_si_task(self.ctx, task['id'], return_status, comment, result=result)
  1062 +
  1063 + if response[1] != 200:
  1064 + logger.error("Task Status Update Fail: " + task['id'])
  1065 +
  1066 + def do_decrease(self, task):
  1067 + """北京社保减员操作"""
  1068 + logger.info('statr do decrease')
  1069 + id_num = task['insured_id_num']
  1070 + name = task['insured_name']
  1071 +
  1072 + ext_infos = task['ext_info']
  1073 + decrease_reason = '' # 个人停止缴费原因
  1074 + for ext_info in ext_infos:
  1075 + if ext_info['name'] == '个人停止缴费原因':
  1076 + decrease_reason = ext_info['value']
  1077 + if not decrease_reason:
  1078 + decrease_reason = '本人意愿解除劳动合同'
  1079 + # return False, '请输入正确的个人停止缴费原因'
  1080 + if decrease_reason not in ['劳动合同期满', '非本人意愿解除劳动合同', '本人意愿解除劳动合同']:
  1081 + return False, '请输入正确的个人停止缴费原因: {}'.format(decrease_reason)
  1082 +
  1083 + if not check_id_num(id_num=id_num):
  1084 + logger.error('请输入正确的身份证号: {}'.format(id_num))
  1085 + return False, '请输入正确的身份证号: {}'.format(id_num)
  1086 +
  1087 + comment = '网络或服务器繁忙,请稍后再试'
  1088 + for i in range(3):
  1089 + status, comment = self.check_nav_show(div_id='level:1', one_id='link000', two_id='link005')
  1090 + if not status:
  1091 + return constant.STATUS_INIT, comment
  1092 +
  1093 + self.driver.switch_to.default_content() # 退出frame
  1094 + self.driver.switch_to.frame('center')
  1095 + self.driver.switch_to.frame('mainFrame') # 切换到frame下寻找元素
  1096 +
  1097 + try:
  1098 + time.sleep(1)
  1099 + self.driver.find_element_by_xpath('//*[@id="Layer2"]/table/tbody/tr[1]/td[2]/a').click()
  1100 + except Exception as e:
  1101 + logger.error(str(e))
  1102 +
  1103 + try:
  1104 + self.driver.find_element_by_id('cut').click() # 点击零星减员
  1105 + time.sleep(1)
  1106 + except Exception as e:
  1107 + logger.error(str(e))
  1108 + self.driver.refresh()
  1109 + continue
  1110 +
  1111 + try:
  1112 + self.driver.find_element_by_id('idCard').send_keys(id_num) # 输入身份证号
  1113 + self.driver.find_element_by_id('personName').send_keys(name) # 输入名字
  1114 + time.sleep(1)
  1115 + self.driver.find_element_by_id('select').click() # 点击查询
  1116 + try:
  1117 + printinfo = self.driver.find_element_by_id('printinfo')
  1118 + if printinfo.is_displayed():
  1119 + cause1 = self.driver.find_element_by_xpath("//*[@id='tbody1']/tr[2]/td[2]/font").text
  1120 + return False, cause1
  1121 + wronginfo = self.driver.find_element_by_id('wronginfo')
  1122 + if wronginfo.is_displayed():
  1123 + cause2 = self.driver.find_element_by_xpath("//*[@id='tbody1']/tr[3]/td[2]/font").text
  1124 + return False, cause2
  1125 + retireinfo = self.driver.find_element_by_id('retireinfo')
  1126 + if retireinfo.is_displayed():
  1127 + cause3 = self.driver.find_element_by_xpath("//*[@id='tbody1']/tr[4]/td[2]/font").text
  1128 + return False, cause3
  1129 + except Exception as e:
  1130 + logger.error(str(e))
  1131 + # self.driver.refresh()
  1132 + # continue
  1133 +
  1134 + # 判断用户是否已停缴、中止、断缴等状态
  1135 + time.sleep(1)
  1136 + jfzt_text = self.driver.find_element_by_xpath('//*[@id="tbody2"]/tr[3]/td[2]').text
  1137 + if len(re.findall(r'正常', jfzt_text)) != 4:
  1138 + return True, jfzt_text
  1139 + time.sleep(2)
  1140 + # 点击提交按钮
  1141 + logger.info("开始点击提交按钮... ...")
  1142 +
  1143 + # TODO 减员改动待测试
  1144 + select = Select(self.driver.find_element_by_id("reason")) # 个人停止缴费原因
  1145 + select.select_by_visible_text(decrease_reason)
  1146 + time.sleep(1)
  1147 + # self.driver.find_element_by_xpath('/html/body/div[3]/h2/a').click() # 关闭提示信息
  1148 + # self.driver.find_element_by_xpath('/html/body/div[-1]/h2/a').click() # 关闭提示信息
  1149 + time.sleep(1)
  1150 + # js_cl = "$('.popup').remove()"
  1151 + # self.driver.execute_script(js_cl)
  1152 + js = "var aa=document.getElementsByClassName('popup')[0];aa.parentNode.removeChild(aa)"
  1153 + self.driver.execute_script(js)
  1154 + # self.left_click(1259, 357)
  1155 + time.sleep(1)
  1156 + js_cl1 = 'var child=document.getElementById("cover");child.parentNode.removeChild(child);'
  1157 + self.driver.execute_script(js_cl1)
  1158 + time.sleep(1)
  1159 + # 点击提交按钮
  1160 + self.driver.find_element_by_id('submit').click() # 保存 save # 提交:submit
  1161 + time.sleep(10)
  1162 + for k in range(4):
  1163 + time.sleep(3)
  1164 + sound_code = self.driver.page_source
  1165 + if '服务器繁忙' in sound_code:
  1166 + logger.error('服务器繁忙,请稍后再试')
  1167 + self.driver.refresh()
  1168 + continue
  1169 + elif '业务操作失败' in sound_code:
  1170 + logger.error('减员失败,请检查是否重复减员')
  1171 + cause = etree.HTML(sound_code).xpath('//*[@id="cutform"]/table/tbody/tr[2]/td/table/tbody/tr[2]/td/p/span[2]/text()')
  1172 + if cause:
  1173 + cause = cause[1] + cause[2]
  1174 + return True, '业务操作失败: ' + cause
  1175 + elif '业务操作成功' in sound_code:
  1176 + gov_id = self.driver.find_element_by_xpath('//*[@id="cutform"]/table/tbody/tr[2]/td/table/tbody/tr[2]/td/p/span/span').text
  1177 + if gov_id:
  1178 + gov_id = gov_id.replace(' ', '')
  1179 + return True, gov_id
  1180 + return True, '等待查询反馈'
  1181 + except Exception as e:
  1182 + logger.error(str(e))
  1183 + self.driver.refresh()
  1184 + continue
  1185 + return constant.STATUS_INIT, comment
  1186 +
  1187 + def __payback(self):
  1188 + tasks = self.__get_tasks(constant.OP_TYPE_PAYBACK, constant.STATUS_INIT)
  1189 + if not tasks:
  1190 + return
  1191 +
  1192 + self.close_notice()
  1193 +
  1194 + # 判断业务办理时间
  1195 + try:
  1196 + msg = self.driver.find_element_by_xpath('/html/body/table[3]/tbody/tr/td').text
  1197 + if '该申报业务办理时间为每月5日-25日' in msg:
  1198 + return
  1199 + except Exception as e:
  1200 + logger.error(str(e))
  1201 +
  1202 + for task in tasks:
  1203 + task_detail, err_code = waclient.get_si_task(self.ctx, task['id'])
  1204 + if err_code != 200:
  1205 + break
  1206 +
  1207 + response = self.do_payback(task_detail)
  1208 + comment = response[1]
  1209 + ins = self.get_all_ins(task_detail)
  1210 + if not ins:
  1211 + ins = ['医疗保险', '生育保险', '养老保险', '失业保险', '工伤保险']
  1212 + result = self.return_ins_result(ins=ins, status=constant.STATUS_CONFORMING)
  1213 +
  1214 + if not self.is_once_submit_payback():
  1215 + if self.is_once_submit():
  1216 + return_status = constant.STATUS_SUCCESS
  1217 + else:
  1218 + return_status = constant.STATUS_CONFORMING
  1219 +
  1220 + if response[0] != constant.STATUS_INIT:
  1221 + if not response[0]:
  1222 + return_status = constant.STATUS_FAIL
  1223 + result = self.return_ins_result(ins=ins, status=constant.STATUS_FAIL)
  1224 + else:
  1225 + return_status = constant.STATUS_INIT
  1226 + result = self.return_ins_result(ins=ins, status=constant.STATUS_INIT)
  1227 +
  1228 + response = waclient.update_si_task(self.ctx, task['id'], return_status, comment, result=result)
  1229 + if response[1] != 200:
  1230 + logger.error("Task Status Update Fail: " + task['id'])
  1231 +
  1232 + def do_payback(self, task):
  1233 + """北京社保补缴操作"""
  1234 + id_num = task['insured_id_num']
  1235 + name = task['insured_name']
  1236 + start_month = task['start_month']
  1237 + end_month = task['end_month']
  1238 +
  1239 + id_num = id_num.upper().replace(' ', '')
  1240 + if not check_id_num(id_num=id_num):
  1241 + logger.error('请输入正确的身份证号: {}'.format(id_num))
  1242 + return False, '请输入正确的身份证号: {}'.format(id_num)
  1243 +
  1244 + month_lst = []
  1245 + start = time.strftime('%Y-%m', time.localtime(start_month))
  1246 + end = time.strftime('%Y-%m', time.localtime(end_month))
  1247 + start_month = time.strptime(start, '%Y-%m')
  1248 + end_month = time.strptime(end, '%Y-%m')
  1249 + start_month = datetime.datetime(start_month[0], start_month[1], start_month[2], start_month[3], start_month[4], start_month[5])
  1250 + end_month = datetime.datetime(end_month[0], end_month[1], end_month[2], end_month[3], end_month[4], end_month[5])
  1251 + result = (end_month - start_month).days
  1252 + if result < 0:
  1253 + return False, '补缴起始日期不能大于结束日期'
  1254 + elif result == 0:
  1255 + month_lst.append(start)
  1256 + elif 0 < result < 56:
  1257 + month_lst.append(start)
  1258 + elif 56 <= result < 84:
  1259 + month_lst.append(start)
  1260 + month_lst.append(end)
  1261 + elif 84 <= result < 112:
  1262 + month_lst.append(start)
  1263 + lst = start.split('-')
  1264 + mid = ''
  1265 + if int(lst[1]) <= 11:
  1266 + mid = lst[0] + '-' + str(int(lst[1]) + 1)
  1267 + elif int(lst[1]) == 12:
  1268 + mid = str(int(lst[0]) + 1) + "-01"
  1269 + month_lst.append(mid)
  1270 + month_lst.append(end)
  1271 + else:
  1272 + return False, '补缴日期不能超过规定3个月以上'
  1273 +
  1274 + comment = '网络或服务器繁忙,请稍后再试'
  1275 + for i in range(3):
  1276 + status, comment = self.check_nav_show(div_id='level:1', one_id='link000', two_id='link031')
  1277 + if not status:
  1278 + return constant.STATUS_INIT, comment
  1279 +
  1280 + # 判断业务办理时间
  1281 + try:
  1282 + msg = self.driver.find_element_by_xpath('/html/body/table[3]/tbody/tr/td').text
  1283 + if '该申报业务办理时间为每月5日-25日' in msg:
  1284 + return
  1285 + except Exception as e:
  1286 + logger.error(str(e))
  1287 +
  1288 + try:
  1289 + time.sleep(1)
  1290 + self.driver.find_element_by_id('addIndaddButton').click() # 点击新增补缴
  1291 + time.sleep(2)
  1292 + self.driver.find_element_by_name('idCode').send_keys(id_num) # 输入身份证号
  1293 + self.driver.find_element_by_name('name').send_keys(name) # 输入姓名
  1294 + self.driver.find_element_by_id('addQueryBtn').click() # 点击查询
  1295 + time.sleep(2)
  1296 +
  1297 + try:
  1298 + source_text = self.driver.page_source
  1299 + if '没有找到符合条件的个人用户信息' in source_text:
  1300 + return False, '没有找到符合条件的个人用户信息'
  1301 + elif '该人不在该单位' in source_text:
  1302 + return False, '该人不在该单位'
  1303 + elif '未查询到满足延迟三个月补缴条件的数据' in source_text:
  1304 + return True, '未查询到满足延迟三个月补缴条件的数据,如需办理其他补缴业务请通过经办窗口办理。'
  1305 +
  1306 + # payback_btn = self.driver.find_element_by_id('buttonSubmit')
  1307 + # if not payback_btn:
  1308 + # msg = self.driver.find_element_by_xpath('//*[@id="show"]/table[2]/tbody/tr[1]/td/span').text
  1309 + # if msg is not None:
  1310 + # return False, msg
  1311 + except Exception as e:
  1312 + logger.error(str(e))
  1313 +
  1314 + trs = self.driver.find_elements_by_xpath('//*[@id="indAddPayForm"]/table/tbody/tr')
  1315 + if not trs:
  1316 + self.driver.refresh()
  1317 + continue
  1318 +
  1319 + for k in range(1, len(trs)+1):
  1320 + mark_xpath = "//*[@id='indAddPayForm']/table/tbody/tr[" + str(k) + "]/td"
  1321 + tds = self.driver.find_elements_by_xpath(mark_xpath)
  1322 + if len(tds) != 15:
  1323 + continue
  1324 + checkbox = self.driver.find_element_by_xpath(mark_xpath + "[1]/input[1]")
  1325 + month_text = self.driver.find_element_by_xpath(mark_xpath + "[2]").text
  1326 + month_text.strip()
  1327 +
  1328 + if not checkbox.is_enabled():
  1329 + continue
  1330 + if not checkbox.is_selected() and month_text in month_lst:
  1331 + checkbox.click()
  1332 +
  1333 + try:
  1334 + # 个人补缴申报导入
  1335 + self.driver.find_element_by_id("buttonSubmit").click()
  1336 + self.driver.switch_to_alert().accept()
  1337 + except Exception as e:
  1338 + logger.error(str(e))
  1339 +
  1340 + for _ in range(3):
  1341 + try:
  1342 + time.sleep(2)
  1343 + status = self.driver.find_element_by_xpath('/html/body/table/tbody/tr/td/table/tbody/tr[2]/td/p').text
  1344 + # '/html/body/table/tbody/tr/td/table/tbody/tr[3]/td/p/span/span/text()' # 流水号
  1345 + if status and '操作成功' not in status: # 个人补缴申报导入操作成功!
  1346 + return False, status
  1347 + # 点击返回按钮
  1348 + self.driver.find_element_by_xpath('/html/body/center/input').click()
  1349 + break
  1350 + except Exception as e:
  1351 + logger.error(str(e))
  1352 + continue
  1353 +
  1354 + # 选择保存成功的记录
  1355 + for _ in range(3):
  1356 + try:
  1357 + time.sleep(2)
  1358 + record_trs = self.driver.find_elements_by_xpath('/html/body/div[1]/table/tbody[2]/tr')
  1359 + if len(record_trs) <= 1:
  1360 + return True, "等待查询反馈"
  1361 +
  1362 + for n in range(1, len(record_trs)):
  1363 + # idcard_xpath = "/html/body/div[1]/table/tbody[2]/tr[" + str(n) + "]/td[4]"
  1364 + check_xpath = "/html/body/div[1]/table/tbody[2]/tr[" + str(n) + "]/td[1]/input"
  1365 + # if id_num != self.driver.find_element_by_xpath(idcard_xpath).text:
  1366 + # continue
  1367 + cb_record = self.driver.find_element_by_xpath(check_xpath)
  1368 + if not cb_record.is_selected():
  1369 + cb_record.click()
  1370 + break
  1371 + except Exception as e:
  1372 + logger.error(str(e))
  1373 + continue
  1374 +
  1375 + try:
  1376 + # 汇总提交
  1377 + self.driver.find_element_by_id('submitButton').click()
  1378 + self.driver.switch_to_alert().accept()
  1379 + except Exception as e:
  1380 + logger.error(str(e))
  1381 +
  1382 + # 最终交易结果页面
  1383 + for _ in range(3):
  1384 + try:
  1385 + time.sleep(2)
  1386 + status = self.driver.find_element_by_xpath('/html/body/table/tbody/tr/td/table/tbody/tr[2]/td/p').text
  1387 + if status and '操作成功' not in status: # 个人补缴申报导入操作成功!
  1388 + return True, status
  1389 + id_code = self.driver.find_element_by_xpath('/html/body/table/tbody/tr/td/table/tbody/tr[3]/td/p/span/span').text
  1390 + return True, id_code
  1391 + except Exception as e:
  1392 + logger.error(str(e))
  1393 + continue
  1394 + return True, "等待查询反馈"
  1395 + except Exception as e:
  1396 + logger.error(str(e))
  1397 + self.driver.refresh()
  1398 + continue
  1399 + return constant.STATUS_INIT, comment
  1400 +
  1401 + def __confirm(self):
  1402 + tasks = self.__get_tasks('', constant.STATUS_CONFORMING)
  1403 + if not tasks:
  1404 + return
  1405 +
  1406 + self.close_notice()
  1407 +
  1408 + for task in tasks:
  1409 + task_detail, err_code = waclient.get_si_task(self.ctx, task['id'])
  1410 + if err_code != 200:
  1411 + break
  1412 +
  1413 + response = self.do_confirm(task_detail)
  1414 + confirm_result = response[0]
  1415 + comment = response[1]
  1416 + ins = self.get_all_ins(task_detail)
  1417 + if not ins:
  1418 + ins = ['医疗保险', '生育保险', '养老保险', '失业保险', '工伤保险']
  1419 + result = self.return_ins_result(ins=ins)
  1420 +
  1421 + if confirm_result == constant.STATUS_FAIL:
  1422 + result = self.return_ins_result(ins=ins, status=constant.STATUS_FAIL)
  1423 + elif confirm_result == constant.STATUS_CONFORMING:
  1424 + continue
  1425 + elif confirm_result == constant.STATUS_INIT:
  1426 + result = self.return_ins_result(ins=ins, status=constant.STATUS_INIT)
  1427 +
  1428 + response = waclient.update_si_task(self.ctx, task['id'], confirm_result, comment, result=result)
  1429 + if response[1] != 200:
  1430 + logger.error("Task Status Update Fail: ", task['id'])
  1431 +
  1432 + def do_confirm(self, task):
  1433 + """北京社保查询"""
  1434 + comment = task['comment']
  1435 + if re.findall('(\d{16})', comment) and len(comment) <= 17:
  1436 + return constant.STATUS_SUCCESS, '成功'
  1437 + else:
  1438 + id_num = task['insured_id_num']
  1439 + op_type = task['op_type']
  1440 +
  1441 + for i in range(3):
  1442 + status, comments = self.check_nav_show(div_id='level:2', one_id='link012', two_id='link013')
  1443 + if not status:
  1444 + return constant.STATUS_CONFORMING, comment
  1445 +
  1446 + # 设置开始日期
  1447 + try:
  1448 + self.driver.switch_to.default_content() # 退出frame
  1449 + self.driver.switch_to.frame('center')
  1450 + self.driver.switch_to.frame('mainFrame') # 切换到frame下寻找元素
  1451 + time.sleep(2)
  1452 + self.driver.find_element_by_id('startDate').click()
  1453 + self.driver.switch_to_frame(self.driver.find_element_by_xpath("//iframe[contains(@src,'http://fuwu.rsj.beijing.gov.cn/csibiz/csirp/js/datepicker/My97DatePicker.htm')]"))
  1454 + time.sleep(2)
  1455 + self.driver.find_element_by_id('dpOkInput').click()
  1456 + time.sleep(2)
  1457 + # self.driver.switch_to.frame(0)
  1458 + # start_trs = self.driver.find_elements_by_xpath('/html/body/div/div[3]/table/tbody/tr')
  1459 + # if len(start_trs) == 7:
  1460 + # start_tds = self.driver.find_elements_by_xpath('/html/body/div/div[3]/table/tbody/tr[2]/td')
  1461 + # for item in start_tds:
  1462 + # if item.text == '1':
  1463 + # item.click()
  1464 + # break
  1465 + except Exception as e:
  1466 + logger.error(str(e))
  1467 + self.driver.refresh()
  1468 + continue
  1469 +
  1470 + # 设置结束日期
  1471 + try:
  1472 + self.driver.switch_to_default_content()
  1473 + self.driver.switch_to.frame('center')
  1474 + self.driver.switch_to.frame('mainFrame')
  1475 + time.sleep(2)
  1476 + self.driver.find_element_by_id('endDate').click()
  1477 + # http://fuwu.rsj.beijing.gov.cn/csibiz/csirp/js/datepicker/My97DatePicker.htm
  1478 + time.sleep(2)
  1479 + self.driver.switch_to_frame(self.driver.find_element_by_xpath(
  1480 + "//iframe[contains(@src,'http://fuwu.rsj.beijing.gov.cn/csibiz/csirp/js/datepicker/My97DatePicker.htm')]"))
  1481 + time.sleep(2)
  1482 + # self.driver.switch_to.frame(0)
  1483 + self.driver.find_element_by_id('dpOkInput').click() # 点击日期窗口的确定按钮
  1484 + except Exception as e:
  1485 + logger.error(str(e))
  1486 + self.driver.refresh()
  1487 + continue
  1488 +
  1489 + self.driver.switch_to_default_content()
  1490 + self.driver.switch_to.frame('center')
  1491 + self.driver.switch_to.frame('mainFrame')
  1492 + self.driver.find_element_by_id('idCard').clear()
  1493 + self.driver.find_element_by_id('idCard').send_keys(id_num)
  1494 + dataTypeSelect = Select(self.driver.find_element_by_id('dataTypeSelect'))
  1495 +
  1496 + if op_type == constant.OP_TYPE_INCREASE:
  1497 + if task['handle_type'] == "0":
  1498 + dataTypeSelect.select_by_visible_text('新参保人员登记')
  1499 + elif task['handle_type'] == "1":
  1500 + dataTypeSelect.select_by_visible_text('转入人员增加')
  1501 + elif op_type == constant.OP_TYPE_DECREASE:
  1502 + dataTypeSelect.select_by_visible_text('普通减员')
  1503 +
  1504 + statusSelect = Select(self.driver.find_element_by_id('statusSelect'))
  1505 + statusSelect.select_by_visible_text('处理结束')
  1506 +
  1507 + self.driver.find_element_by_id('button_1').click() # 点击查询
  1508 + time.sleep(2)
  1509 +
  1510 + trs = self.driver.find_elements_by_xpath('/html/body/table[4]/tbody/tr')
  1511 + if len(trs) < 2:
  1512 + return constant.STATUS_FAIL, comment
  1513 +
  1514 + k = 1
  1515 + for _ in trs:
  1516 + k += 1
  1517 + try: # /html/body/table[5]/tbody/tr[2]/td[8]/div
  1518 + result = self.driver.find_element_by_xpath("/html/body/table[4]/tbody/tr[" + str(k) + "]/td[8]/div").text
  1519 + if '成功' in result:
  1520 + return constant.STATUS_SUCCESS, '成功'
  1521 + elif '失败' in result:
  1522 + msg = self.driver.find_element_by_xpath("/html/body/table[4]/tbody/tr[" + str(k) + "]/td[9]/div").text
  1523 + return constant.STATUS_FAIL, msg
  1524 + else:
  1525 + # msg = self.driver.find_element_by_xpath("/html/body/table[4]/tbody/tr[" + str(k) + "]/td[9]/div").text
  1526 + return constant.STATUS_FAIL, comment
  1527 + except Exception as e:
  1528 + logger.error(str(e))
  1529 + time.sleep(1)
  1530 + return constant.STATUS_CONFORMING, comment
  1531 +
  1532 + def is_once_submit(self):
  1533 + return False
  1534 +
  1535 + def close_notice(self):
  1536 + """关闭页面悬浮div弹框"""
  1537 + for i in range(3):
  1538 + try:
  1539 + self.driver.switch_to_default_content()
  1540 + self.driver.switch_to.frame('center')
  1541 + self.driver.switch_to_frame('mainFrame')
  1542 + xpath = '//*[@id="wBox"]/div/table/tbody/tr[2]/td[2]/div/table/tbody/tr/td[2]/div'
  1543 + # xpath = '//div[@class="wBox_close_on"]'
  1544 + self.driver.find_element_by_xpath(xpath).click()
  1545 + except Exception as e:
  1546 + logger.error(str(e))
  1547 + time.sleep(1)
  1548 +
  1549 + def check_nav_show(self, div_id='', one_id='', two_id=''):
  1550 + """检查左侧导航是否显示二级导航"""
  1551 + k = 0
  1552 + while True:
  1553 + k += 1
  1554 + if k == 6:
  1555 + return False, '服务器繁忙,请稍后再试'
  1556 +
  1557 + try:
  1558 + time.sleep(1)
  1559 + self.driver.switch_to.default_content()
  1560 + self.driver.switch_to.frame('center')
  1561 + self.driver.switch_to.frame('leftFrame') # 切换到frame下寻找元素
  1562 +
  1563 + display = []
  1564 + if div_id != '':
  1565 + styles = self.driver.find_element_by_id(div_id).get_attribute('style')
  1566 + styles = styles.replace(' ', '').strip().lower()
  1567 + display = re.findall('display:none', styles)
  1568 +
  1569 + if display:
  1570 + if one_id != "" and two_id != "":
  1571 + self.driver.find_element_by_id(one_id).click()
  1572 + time.sleep(1)
  1573 + self.driver.find_element_by_id(two_id).click()
  1574 + else:
  1575 + self.driver.find_element_by_id(two_id).click()
  1576 +
  1577 + time.sleep(1)
  1578 +
  1579 + sound_code = self.driver.page_source
  1580 + # /html/body/table[3]/tbody/tr/td
  1581 + if '此业务的使用日期' in sound_code:
  1582 + msg = '此业务的使用日期为每月5日至22日(逢节假日不提前,也不错后)'
  1583 + return False, msg
  1584 + elif '此业务每天的使用时间' in sound_code:
  1585 + logger.error('此业务每天的使用时间为6:00—22:00')
  1586 + return False, '此业务每天的使用时间为6:00—22:00'
  1587 + # elif '404' in sound_code:
  1588 + # logger.error('页面出现404错误')
  1589 + # self.driver.refresh()
  1590 + # continue
  1591 + elif '服务器繁忙' in sound_code:
  1592 + logger.error('服务器繁忙,请稍后再试')
  1593 + self.driver.refresh()
  1594 + continue
  1595 + return True, ''
  1596 + except Exception as e:
  1597 + logger.error(str(e))
  1598 + self.driver.refresh()
  1599 + continue
  1600 +
  1601 + def __select_medical(self, *args):
  1602 + """判断是否有医疗机构3,4,5"""
  1603 + self.driver.find_element_by_id(args[0]).click() # 配置医疗机构
  1604 + self.driver.switch_to.frame(args[1]) # 切换到frame下寻找元素
  1605 + self.driver.find_element_by_id('personInfoReg_search').send_keys(args[2]) # 输入医院
  1606 + self.driver.find_elements_by_tag_name('input')[2].click()
  1607 + time.sleep(1)
  1608 + tds = self.driver.find_elements_by_tag_name('td')
  1609 + if len(tds) >= 5:
  1610 + inputs = self.driver.find_elements_by_tag_name('input')
  1611 + for j in inputs:
  1612 + if j.get_attribute('value') == '选择':
  1613 + j.click()
  1614 + break
  1615 + self.driver.switch_to.default_content() # 退出frame
  1616 + self.driver.switch_to.frame('center')
  1617 + self.driver.switch_to.frame('mainFrame') # 切换到frame下寻找元素
  1618 + time.sleep(2)
  1619 +
  1620 + def system_prompt(self):
  1621 + """关闭系统提示窗口"""
  1622 + time.sleep(1)
  1623 + self.driver.switch_to.default_content() # 退出frame
  1624 + # msg_xpath = self.driver.find_element_by_xpath('/html/body/div[3]/div/h2/a') # 系统提示
  1625 + # if msg_xpath:
  1626 + # msg_xpath.click()
  1627 + try:
  1628 + self.driver.find_element_by_xpath('/html/body/div[3]/div/h2/a').click() # 关闭系统提示
  1629 + except:
  1630 + pass
  1631 +
  1632 + self.driver.switch_to.default_content() # 退出frame
  1633 + self.driver.switch_to.frame('center')
  1634 + self.driver.switch_to.frame('mainFrame') # 切换到frame下寻找元素
  1635 + def new_system_prompt(self):
  1636 + """新关闭系统提示窗口"""
  1637 + time.sleep(8)
  1638 + self.driver.switch_to.default_content() # 退出frame
  1639 + self.driver.switch_to.default_content() # 退出frame
  1640 + # msg_xpath = self.driver.find_element_by_xpath('/html/body/div[3]/div/h2/a') # 系统提示
  1641 + # if msg_xpath:
  1642 + # msg_xpath.click()
  1643 + # source_text = self.driver.page_source
  1644 + # print(source_text)
  1645 + try:
  1646 + self.driver.find_element_by_xpath('//div[@class="popwrap"]/div/h2/a').click() # 关闭系统提示
  1647 + except Exception as e:
  1648 + logger.error(str(e))
  1649 +
  1650 + self.driver.switch_to.default_content() # 退出frame
  1651 + self.driver.switch_to.frame('center')
  1652 + self.driver.switch_to.frame('mainFrame') # 切换到frame下寻找元素
  1653 +
  1654 + def __date(self):
  1655 + """合同日期计算"""
  1656 + year = datetime.datetime.now().year + 3
  1657 + month = datetime.datetime.now().month
  1658 + day = datetime.datetime.now().day - 1
  1659 + if day == 0:
  1660 + month = month - 1
  1661 + if month == 0:
  1662 + month = 12
  1663 + if month == 2:
  1664 + day = 28
  1665 + elif month == 2 or month == 4 or month == 6 or month == 9 or month == 11:
  1666 + day = 30
  1667 + else:
  1668 + day = 31
  1669 +
  1670 + return year, month, day
  1671 +
  1672 + def left_click(x, y):
  1673 + win32api.SetCursorPos([x, y])
  1674 +
  1675 + win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
  1676 + win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
此 diff 太大无法显示。
  1 +botclient 532 2022-02-10 15:12:45,687 ERROR :<_Rendezvous of RPC that terminated with:
  2 + status = StatusCode.UNKNOWN
  3 + details = "Stream removed"
  4 + debug_error_string = "{"created":"@1644477165.685000000","description":"Error received from peer ipv4:172.17.35.193:60001","file":"src/core/lib/surface/call.cc","file_line":1055,"grpc_message":"Stream removed","grpc_status":2}"
  5 +>
  6 +service 459 2022-02-10 16:24:00,328 ERROR :'No job by the id of id_auto_time was found'
  7 +server 118 2022-02-10 16:24:04,102 ERROR :
  8 +service 459 2022-02-10 16:27:12,413 ERROR :'No job by the id of id_auto_time was found'
  9 +op_type 20 2022-02-10 16:27:22,127 INFO :get_op_types sucessful
  10 +op_type 20 2022-02-10 16:27:24,401 INFO :get_op_types sucessful
  11 +op_type 20 2022-02-10 16:27:30,541 INFO :get_op_types sucessful
  12 +op_type 20 2022-02-10 16:27:32,587 INFO :get_op_types sucessful
  13 +botclient 663 2022-02-10 18:33:08,006 ERROR :<_Rendezvous of RPC that terminated with:
  14 + status = StatusCode.UNIMPLEMENTED
  15 + details = "Method not found!"
  16 + debug_error_string = "{"created":"@1644489188.006000000","description":"Error received from peer ipv4:172.17.35.193:60001","file":"src/core/lib/surface/call.cc","file_line":1055,"grpc_message":"Method not found!","grpc_status":12}"
  17 +>
  18 +main_form 1012 2022-02-10 18:33:08,006 ERROR :argument of type 'NoneType' is not iterable
  1 +[data]
  2 +path=sibot.db
  3 +filepath=download_file
  4 +
  5 +[hro]
  6 +api_endpoint=https://api.workai.com.cn
  7 +client_id=106716051667947520
  8 +client_secret=7bbcecb0-b7f8-4f48-8e94-e748c32edc26
  9 +
  10 +[ca_drivers]
  11 +path=["C:\\GM3000\\GM3000Mon.exe"]
  12 +
  13 +[time_point]
  14 +auto=1
  15 +
  16 +[flag]
  17 +dev=1
  18 +download=1
  19 +city_code=350100
  20 +
  21 +[terminals]
  22 +terminal = 0
不能预览此文件类型
不能预览此文件类型
不能预览此文件类型
不能预览此文件类型
  1 +@echo off
  2 +
  3 +ping 127.0.0.1 -n 1 > nul
  4 +echo ...
  5 +echo ...
  6 +echo 开始打包Worker
  7 +
  8 +F:\OFFICE\CODE\stand_alone\environment\sibot\Scripts\pyinstaller.exe -Fc --hidden-import=pkg_resources --distpath=./hefei --icon=sbkj.ico F:\OFFICE\CODE\stand_alone\sibot\sibot\worker\server.py -n Worker
  9 +
  10 +echo 打包Controller结束
  11 +echo ...
  12 +echo ...
  13 +echo ...
  14 +echo 开始删除编译临时文件...
  15 +rmdir /S /Q .\build
  16 +del /a /f /s .\Worker.spec
  17 +echo 删除编译临时文件完成...
  1 +@echo off
  2 +
  3 +ping 127.0.0.1 -n 1 > nul
  4 +echo ...
  5 +echo ...
  6 +echo 开始打包Controlle
  7 +
  8 +D:\developer\python\Scripts\pyinstaller.exe -Fc --hidden-import=pkg_resources --distpath=./sibot --icon=bot.ico D:\developer\Code\alone\sibot\sibot\controller\server.py -n Controller
  9 +
  10 +echo 打包Controlle结束
  11 +
  12 +
  13 +ping 127.0.0.1 -n 1 > nul
  14 +echo ...
  15 +echo ...
  16 +echo 开始打包Worker
  17 +
  18 +D:\developer\python\Scripts\pyinstaller.exe -Fc --hidden-import=pkg_resources --distpath=./sibot --icon=bot.ico D:\developer\Code\alone\sibot\sibot\worker\server.py -n Worker
  19 +
  20 +echo 打包Worker结束
  21 +
  22 +ping 127.0.0.1 -n 1 > nul
  23 +echo ...
  24 +echo ...
  25 +echo 开始打包Bot
  26 +
  27 +D:\developer\python\Scripts\pyinstaller.exe -Fw --hidden-import=pkg_resources --distpath=./sibot --icon=bot.ico D:\developer\Code\alone\sibot\sibot\watcher\server.py -n Bot
  28 +
  29 +echo 打包Bot结束
  30 +
  31 +echo ...
  32 +echo ...
  33 +echo ...
  34 +echo 开始删除编译临时文件...
  35 +rmdir /S /Q .\build
  36 +del /a /f /s .\Controller.spec
  37 +del /a /f /s .\Worker.spec
  38 +del /a /f /s .\Bot.spec
  39 +del /a /f /s .\BotClient.spec
  40 +echo 删除编译临时文件完成...
注册登录 后发表评论