logicalCode_devNo.py 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. # -*- coding: utf-8 -*-
  2. #!/usr/bin/env python
  3. """
  4. 预设逻辑码对应关系
  5. """
  6. import os
  7. import xlrd
  8. import pprint
  9. from base import regex_split, init_env
  10. import click
  11. init_env(interactive=True)
  12. from apps.web.device.models import Device
  13. class DuplicateError(Exception):
  14. pass
  15. class InvalidInput(Exception):
  16. pass
  17. def check_duplicate(l):
  18. """
  19. 检查是否有重复项
  20. :param l:
  21. :return:
  22. """
  23. seen = []
  24. seen_add = seen.append
  25. for e in l:
  26. if e in seen:
  27. raise DuplicateError()
  28. seen_add(e)
  29. def check(*checkers):
  30. for checker in checkers:
  31. checker()
  32. @click.group()
  33. def cli():
  34. click.echo(u'欢迎来到添加逻辑码脚本!')
  35. @cli.command()
  36. @click.option('-f','--filepath', prompt=u'请输入要转换的表格文件路径', default=os.environ['DEFAULT_LOGICALCODE_EXCEL_PATH'])
  37. @click.option('-s','--start_row', prompt=u'请输入开始插入的行数')
  38. @click.option('-m','--mode', prompt=u'模式:=(read|write|delete)', default='read')
  39. def excel(filepath, start_row, mode):
  40. """
  41. 通过表格批量导入映射关系
  42. :param filepath:
  43. :param start_row:
  44. :param mode:
  45. :return:
  46. """
  47. start_row = int(start_row)
  48. book = xlrd.open_workbook(filepath)
  49. try:
  50. sheet = book.sheet_by_name("Sheet1")
  51. except:
  52. click.echo("no sheet in %s named Sheet1" % filepath)
  53. raise
  54. nrows = sheet.nrows
  55. rows = []
  56. for i in range(1, nrows):
  57. row_data = sheet.row_values(i)
  58. #: 有部分空行和描述行存在,需要过滤掉
  59. if isinstance(row_data[0], float) and int(row_data[0]) >= start_row and row_data[1]:
  60. delimiters = "<", ";", ","
  61. row_data[1] = regex_split(str(int(row_data[1])), *delimiters)[0]
  62. rows.append(row_data)
  63. #: 以免有不合规数据插入,需要首先做校验
  64. check_duplicate(rows)
  65. if mode == 'read':
  66. click.echo('read mode start')
  67. pprint.pprint(list(enumerate(rows)))
  68. click.echo('read mode end')
  69. elif mode == 'write':
  70. #: 目前只操作
  71. click.echo('write mode start')
  72. click.echo('start pushing mapping to database and cache.')
  73. for row in rows:
  74. logicalCode = str(int(row[0]))
  75. devno = str(int(row[1]))
  76. click.echo('adding (logicalCode=%s, devNo=%s) to db' % (logicalCode, devno))
  77. Device.get_collection().insert_one({'devNo':devno, 'logicalCode':logicalCode})
  78. click.echo('setting (logicalCode=%s, devNo=%s) to cache' % (logicalCode, devno))
  79. Device.update_l_cache(devno, logicalCode)
  80. Device.get_dev(devno)
  81. click.echo('write mode end')
  82. elif mode == 'delete':
  83. click.echo('delete mode start')
  84. click.echo('we will only delete cache now')
  85. for row in rows:
  86. logicalCode = str(int(row[0]))
  87. devNo = str(int(row[1]))
  88. click.echo('deleting (logicalCode=%s, devNo=%s)' % (logicalCode, devNo))
  89. Device.invalid_l_cache(logicalCode)
  90. Device.invalid_device_cache(devNo)
  91. click.echo('delete mode end')
  92. elif mode == 'modify':
  93. click.echo('modify mode start')
  94. click.echo('import!!!only expert use it')
  95. for row in rows:
  96. logicalCode = str(int(row[0]))
  97. devNo = str(int(row[1]))
  98. Device.invalid_l_cache(logicalCode)
  99. Device.invalid_device_cache(devNo)
  100. Device.get_collection().update_one({'devNo': devNo}, {'$set': {'logicalCode': logicalCode}}, upsert = False)
  101. Device.update_l_cache(devNo, logicalCode)
  102. Device.get_dev(devNo)
  103. click.echo('delete mode end')
  104. elif mode == 'fix':
  105. click.echo('fix mode start')
  106. for row in rows:
  107. logicalCode = str(int(row[0]))
  108. devNo = str(int(row[1]))
  109. click.echo('fixing (logicalCode=%s, devNo=%s)' % (logicalCode, devNo))
  110. Device.invalid_device_cache(devNo)
  111. click.echo('fix mode end')
  112. click.echo('Finished! total: %s rows' % len(rows))
  113. @cli.command()
  114. @click.option('--bulk/--no-bulk', help=u'是否给所有设备都添加设备号为逻辑编码', default=False)
  115. @click.option('--relation', help=u'映射关系', default='')
  116. @click.option('--relations', help=u'多个映射关系', default='')
  117. def inject(bulk, relation, relations):
  118. """
  119. 手工添加映射关系
  120. :param bulk:
  121. :param relation: 示例: devNo,logicalCode
  122. :param relations: 示例: devNo,logicalCode,devNo,logicalCode
  123. :return:
  124. """
  125. def _single_operation(devNo, logicalCode):
  126. insert_relation_mapping(logicalCode=logicalCode, devNo=devNo)
  127. return Device.objects(devNo=devNo, logicalCode=logicalCode).save()
  128. if bulk:
  129. #: 目前不可用
  130. pass
  131. else:
  132. if not any([relation, relations]):
  133. raise InvalidInput(u"设备号不可为空!")
  134. if relations:
  135. relations = relation.split(',')
  136. relation_tuples = [ (devNo, logicalCode) for devNo in relations[::2] for logicalCode in relation[1::2] ]
  137. for r in relation_tuples:
  138. _single_operation(*r)
  139. if relation:
  140. try:
  141. devNo, logicalCode = relation.strip(' ').split(',')
  142. click.echo(u'你正在添加映射关系 devNo=%s,logicalCode=%s' % (devNo, logicalCode))
  143. _single_operation(devNo, logicalCode)
  144. except AttributeError:
  145. click.echo(u'请注意输入格式应为 设备号,逻辑码 ')
  146. raise
  147. click.echo('success!')
  148. @cli.command()
  149. def update():
  150. """
  151. 需要做一定的校验
  152. :return:
  153. """
  154. pass
  155. @cli.command()
  156. def remove(logicalCode):
  157. """
  158. :param logicalCode:
  159. :return:
  160. """
  161. pass
  162. if __name__ == '__main__':
  163. click.echo(u'该脚本已经弃用,请检查是否有变更的部分需要处理')
  164. #cli()