# coding=utf-8 """ 为设备添加errorTimes的otherConf。 添加了此参数的设备,如果其adapter文件被startErrorTimer装饰器装饰 在错误启动次数达到errorTimes之后,会进行一定的操作,比如锁定端口或者上报设备故障等等 """ import os import click from base import init_env import pandas as pd init_env(interactive=True) from apps.web.device.models import Device, Group from apps.web.dealer.models import Dealer from apps.web.agent.models import Agent from apps.web.constant import Const def update_device_conf(devNos, times, driverCode=None): faultDev = list() successDev = list() print(devNos) for dev in Device.objects.filter(devNo__in=devNos): print(dev.devNo) if driverCode is not None and dev.devType.code != driverCode: continue otherConf = dev.otherConf or dict() otherConf.update({"errorTimes": times}) try: dev.otherConf = otherConf dev.save() except Exception as e: faultDev.append(dev.logicalCode) else: successDev.append(dev.logicalCode) # 清除掉设备的缓存 Device.invalid_device_cache(dev.devNo) return faultDev, successDev @click.group() def cli(): click.echo(""" 为设备添加errorTimes的otherConf。\n 添加了此参数的设备,如果其adapter文件被startErrorTimer装饰器装饰\n 在错误启动次数达到errorTimes之后,会进行一定的操作,比如锁定端口或者上报设备故障等等 """) @cli.command() @click.option("--path", prompt="请输入设备编号(logicalCode)文件地址") @click.option("--times", default=Const.ERROR_START_TIMES, type=int, prompt="请输入最大错误次数") def from_file(path, times): if not os.path.exists(path): click.echo("path 不存在!") return try: dataForm = pd.read_excel(path, header=None, usecols=1) except Exception as e: click.echo("读取文件失败,请使用excel文件格式将logicalCode设置在第一列") return # dataForm. logicalCodes = dataForm.values.tolist() # print dataForm print logicalCodes devNos = [Device.get_devNo_by_logicalCode(str(int(item[0]))) for item in logicalCodes] devNos = filter(lambda x:x is not None, devNos) faultDev, successDev = update_device_conf(devNos, times) click.echo("共修改 {} 设备相关配置".format(len(successDev))) if faultDev: message = "修改失败 {} 设备, 编号为:\n{}".format(len(faultDev), "\n".join(faultDev)) click.echo(message) @cli.command() @click.option("--logical", prompt="请输入设备编号(logicalCode)") @click.option("--times", default=Const.ERROR_START_TIMES, type=int, prompt="请输入最大错误次数") def from_enter(logical, times): devNo = Device.get_devNo_by_logicalCode(logical) faultDev, successDev = update_device_conf([devNo], times) if faultDev: click.echo("修改失败") else: click.echo("修改成功!") @cli.command() @click.option("--group", prompt="请输入设备组ID") @click.option("--driver", prompt="请输入驱动编号") @click.option("--times", default=Const.ERROR_START_TIMES, type=int, prompt="请输入最大错误次数") def from_group(group, driver, times): devNos = Device.get_devNos_by_group([group]) faultDev, successDev = update_device_conf(devNos, times, driverCode=driver) click.echo("共修改 {} 设备相关配置".format(len(successDev))) if faultDev: message = "修改失败 {} 设备, 编号为:\n{}".format(len(faultDev), "\n".join(faultDev)) click.echo(message) @cli.command() @click.option("--username", prompt="请输入经销商手机号码") @click.option("--driver", prompt="请输入驱动编号") @click.option("--times", default=Const.ERROR_START_TIMES, type=int, prompt="请输入最大错误次数") def from_dealer(username, driver, times): devNos = list() for dealer in Dealer.objects.filter(username=username): groupIds = Group.get_group_ids_of_dealer(str(dealer.id)) devNos.extend(Device.get_devNos_by_group(groupIds)) faultDev, successDev = update_device_conf(devNos, times, driverCode=driver) click.echo("共修改 {} 设备相关配置".format(len(successDev))) if faultDev: message = "修改失败 {} 设备, 编号为:\n{}".format(len(faultDev), "\n".join(faultDev)) click.echo(message) @cli.command() @click.option("--username", prompt="请输入代理商手机号码") @click.option("--driver", prompt="请输入驱动编号") @click.option("--times", default=Const.ERROR_START_TIMES, type=int, prompt="请输入最大错误次数") def from_agent(username, driver, times): devNos = list() agent = Agent.objects.get(username=username) dealers = agent.get_dealers() for dealer in dealers: groupIds = Group.get_group_ids_of_dealer(str(dealer.id)) devNos.extend(Device.get_devNos_by_group(groupIds)) faultDev, successDev = update_device_conf(devNos, times, driverCode=driver) click.echo("共修改 {} 设备相关配置".format(len(successDev))) if faultDev: message = "修改失败 {} 设备, 编号为:\n{}".format(len(faultDev), "\n".join(faultDev)) click.echo(message) if __name__ == '__main__': cli()