sync_dianxin_sim_card_from_excel.py 3.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. # -*- coding: utf-8 -*-
  2. #!/usr/bin/env python
  3. import sys,os
  4. import datetime
  5. PROJECT_ROOT = os.path.join(os.path.abspath(os.path.split(os.path.realpath(__file__))[0] + "/.."), '..')
  6. sys.path.insert(0, PROJECT_ROOT)
  7. os.environ.update({"DJANGO_SETTINGS_MODULE": "configs.production"})
  8. import django
  9. django.setup()
  10. from script.base import init_env, get_logger
  11. from apps.web.device.models import SIMCard,Device
  12. import xlrd
  13. from xlrd import xldate_as_tuple
  14. from apilib.utils_datetime import first_day_datetime_of_month
  15. from apps.web.dealer.models import DealerRechargeRecord
  16. # 专门导入电信的卡信息到数据库中。电信的卡给定的excel的位数比设备上报的少1位。如果走原来的流程,会导致设备的过期时间无法更新。
  17. supplier = sys.argv[1]
  18. excelFile = sys.argv[2]
  19. if supplier not in ['tianyu','qiben']:
  20. print 'supplier para is error!'
  21. exit(0)
  22. book = xlrd.open_workbook(excelFile)
  23. try:
  24. sheet = book.sheet_by_name("sheet1")
  25. except Exception,e:
  26. print 'open excel file error =%s' % e
  27. exit(0)
  28. nrows = sheet.nrows
  29. rows = []
  30. okCount = 0
  31. iccids = []
  32. simDict = {}
  33. for i in range(1, nrows):
  34. row = sheet.row_values(i)
  35. for ii in range(3):
  36. try:
  37. if supplier == 'qiben':
  38. if (not row[6]) or (not row[7]):
  39. SIMCard.get_collection().update_one({'iccid':row[1]},{'$set':{'iccid':row[1],'imsi':row[2],'supplier':supplier,'provider':u'电信'}},upsert=True)
  40. break
  41. activeTime = datetime.datetime.strptime(row[6] + ' 00:00:00',"%Y-%m-%d %H:%M:%S")
  42. expireTime = datetime.datetime.strptime(row[7] + ' 00:00:00',"%Y-%m-%d %H:%M:%S")
  43. SIMCard.get_collection().update_one({'iccid':row[1]},{'$set':{'iccid':row[1],'imsi':row[2],'supplier':supplier,'provider':u'电信','expireTime':expireTime}},upsert=True)
  44. iccids.append({'expireTime':expireTime,'iccid':row[1]})
  45. elif supplier == 'tianyu':
  46. if (not row[11]) or (not row[12]):
  47. SIMCard.get_collection().update_one({'iccid':row[1]},{'$set':{'iccid':row[1],'imsi':row[2],'supplier':supplier,'provider':u'电信'}},upsert=True)
  48. break
  49. activeTime = datetime.datetime.strptime(row[11],"%Y-%m-%d %H:%M:%S")
  50. expireTime = datetime.datetime.strptime(row[12],"%Y-%m-%d %H:%M:%S")
  51. SIMCard.get_collection().update_one({'iccid':row[1]},{'$set':{'iccid':row[1],'imsi':row[2],'supplier':supplier,'provider':u'电信','expireTime':expireTime}},upsert=True)
  52. iccids.append({'expireTime':expireTime,'iccid':row[1]})
  53. okCount += 1
  54. if okCount % 300 == 0:
  55. print okCount
  56. break
  57. except Exception,e:
  58. print 'some error when update iccid=%s,e=%s' % (row[1],e)
  59. print u'总共的数据为:%s条,成功导入:%s条' % (nrows-1,okCount)
  60. print u'开始往设备同步电信卡的过期时间'
  61. devNos = [] # 当月已经充值的设备,更新状态的时候,不能更新为updated
  62. startTime = first_day_datetime_of_month() - datetime.timedelta(days=60)
  63. endTime = first_day_datetime_of_month() + datetime.timedelta(days=31)
  64. objs = DealerRechargeRecord.objects.filter(finishedTime__gte = startTime,finishedTime__lte = endTime,status = 'Paid')
  65. for obj in objs:
  66. devNos.extend([item['devNo'] for item in obj.items])
  67. for icDict in iccids:
  68. try:
  69. devObj = Device.objects(iccid__icontains = icDict['iccid']).first()
  70. if devObj is None:
  71. continue
  72. if devObj.devNo in devNos:
  73. continue
  74. devObj.simExpireDate = icDict['expireTime']
  75. devObj.simStatus = 'updated'
  76. devObj.simChargeAuto = True
  77. devObj.save()
  78. Device.invalid_many_device_cache([devObj.devNo])
  79. print 'updated one device OK,devNo=',devObj.devNo
  80. except Exception,e:
  81. continue