change_cards_to_autocharge.py 3.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. # -*- coding: utf-8 -*-
  2. #!/usr/bin/env python
  3. import os
  4. import simplejson as json
  5. import sys
  6. PROJECT_ROOT = os.path.join(os.path.abspath(os.path.split(os.path.realpath(__file__))[0] + "/.."), '..')
  7. sys.path.insert(0, PROJECT_ROOT)
  8. os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'configs.production')
  9. from script.base import init_env
  10. init_env(interactive = False)
  11. from apps.web.device.models import Device
  12. from apps.web.dealer.models import Dealer
  13. from apps.web.agent.models import Agent
  14. from bson.objectid import ObjectId
  15. from apps.web.core.messages.sms import SMSSender
  16. import datetime
  17. # 将所有未配置的100台设备以内经销商的设备,配置为自动充值
  18. dealers = Dealer.get_collection().find({},{'username': 1, 'agentId': 1, 'smsVendor': 1})
  19. dealer_map = {}
  20. for dealer in dealers[10000:50000]:
  21. try:
  22. if not dealer['agentId']:
  23. continue
  24. b = ObjectId(dealer['agentId'])
  25. dealer_map[str(dealer['_id'])] = dealer
  26. print dealer['_id']
  27. except :
  28. continue
  29. agent_product_map = {
  30. agent['_id']: agent.get('productName', '').encode('utf-8')
  31. for agent in Agent.get_collection()
  32. .find({'_id': {'$in': [ObjectId(_['agentId']) for _ in dealer_map.values()]}},
  33. {'productName': 1})
  34. }
  35. for dealerId in dealer_map.keys():
  36. try:
  37. devNos = [_.devNo for _ in Device.objects.filter(ownerId = dealerId).only('devNo')]
  38. if len(devNos) == 0:
  39. continue
  40. if len(devNos) > 200:
  41. print 'dev count > 200',dealerId,devNos
  42. continue
  43. unsetCount = Device.get_collection().find({'simExpireDate':{'$gte':datetime.datetime.now() - datetime.timedelta(days = 365)},'devNo':{'$in':devNos},'$and':[{'simChargeAuto':{'$ne':False}},{'simChargeAuto':{'$ne':True}}]}).count()
  44. if unsetCount == 0:
  45. continue
  46. Device.get_collection().update({'devNo':{'$in':devNos},'simChargeAuto':{'$ne':False}},{'$set':{'simChargeAuto':True}},multi = True)
  47. Device.invalid_many_device_cache(devNos)
  48. print 'change to auto charge',len(devNos)
  49. # 通知客户
  50. sms_sender = SMSSender()
  51. dealer = dealer_map[dealerId]
  52. response = sms_sender.send(phoneNumber = dealer['username'],
  53. templateName="SMS_NOTIFY_EXPIRED_DEVICE_TEMPLATEID",
  54. msg = u'请您务必重视,2021年部分客户总是忘记充值流量卡,导致停机换卡,为了防止运营商假期处理不及时,影响您的正常运营,2022年为了避免此类事宜,年初我们将您设备置为自动续费流量卡,如果希望取消自动续费,请登录系统直接更改配置。'.encode(
  55. 'utf-8'), productName = agent_product_map[ObjectId(dealer['agentId'])])
  56. print('sending sim expired alert to dealer(phone=%s) result=%s' % (dealer['username'], json.dumps(response),))
  57. if not response['result']:
  58. print('send sms to dealer failed, error=%s' % json.dumps(response))
  59. except Exception,e :
  60. continue
  61. # devices = Device.get_sim_expire_notify_devices()
  62. #
  63. #
  64. # from cytoolz import groupby
  65. # devMap = groupby('ownerId', devices)
  66. #
  67. # dealerMap = {} # type: Dict[ObjectId, dict]
  68. # for id_,devs in devMap.items():
  69. # try:
  70. # print len(devs)
  71. # if len(devs) <= 1000:
  72. # for dev in devs:
  73. # try:
  74. # devObj = Device.objects.get(logicalCode = dev['logicalCode'])
  75. # devObj.simChargeAuto = True
  76. # devObj.save()
  77. # Device.invalid_device_cache(devObj.devNo)
  78. # print devObj.devNo
  79. # except Exception,e:
  80. # print e
  81. # continue
  82. # except:
  83. # continue