set_auto_charge_and_notify.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. import simplejson as json
  4. import os,sys
  5. from typing import Dict
  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.update({"DJANGO_SETTINGS_MODULE": "configs.production"})
  9. import django
  10. django.setup()
  11. from apilib.utils_datetime import to_datetime
  12. from django.conf import settings
  13. from apps.web.device.models import Device
  14. from apps.web.dealer.models import Dealer
  15. from apps.web.agent.models import Agent
  16. from cytoolz import groupby
  17. from bson.objectid import ObjectId
  18. from apps.web.core.messages.sms import SMSSender
  19. from celery.utils.log import get_task_logger
  20. logger = get_task_logger(__name__)
  21. startTime = to_datetime('2020-09-01 00:00:00')
  22. endTime = to_datetime('2020-10-01 00:00:00')
  23. MaxCount = 3000
  24. devices = Device.get_sim_expire_notify_devices()
  25. dealer_device_map = groupby('ownerId', list(devices))
  26. dealer_map = {
  27. dealer['_id']: dealer
  28. for dealer in Dealer.get_collection()
  29. .find({'_id': {'$in': [ObjectId(id_) for id_ in dealer_device_map.keys()]}},
  30. {'username': 1, 'agentId': 1, 'smsVendor': 1})
  31. } # type: Dict[ObjectId, dict]
  32. agent_product_map = {
  33. agent['_id']: agent.get('productName', '').encode('utf-8')
  34. for agent in Agent.get_collection()
  35. .find({'_id': {'$in': [ObjectId(_['agentId']) for _ in dealer_map.values()]}},
  36. {'productName': 1})
  37. }
  38. count = 0
  39. for id_, dealer in dealer_map.iteritems():
  40. logger.debug('sending SIM expired message to Dealer(phone=%s)' % (dealer['username'],))
  41. # 不是我们的资金池的,无法自动续费
  42. dealerObj = Dealer.objects.get(id = id_)
  43. if not dealerObj.is_support_sim_charge_auto():
  44. continue
  45. # 检查下设备数量,先把设备数量20台以下的找出来
  46. devCount = Device.objects.filter(ownerId = str(id_)).count()
  47. if devCount > 20:
  48. continue
  49. devs = dealer_device_map.get(str(id_))
  50. needSend = False
  51. for dev in devs:
  52. devObj = Device.objects.get(logicalCode = dev['logicalCode'])
  53. if not devObj.simChargeAuto:
  54. needSend = True
  55. devObj.simChargeAuto = True
  56. devObj.save()
  57. count += 1
  58. if not needSend:
  59. continue
  60. sms_sender = SMSSender()
  61. response = sms_sender.send(phoneNumber = dealer['username'],
  62. templateName="SMS_NOTIFY_EXPIRED_DEVICE_TEMPLATEID",
  63. msg = u'请您务必重视:设备管理后台系统正在进行整改,会将本月过期设备配置为自动续费,您如果不准备续费,请登录后台及时进行解绑,或者配置为手工续费。'.encode(
  64. 'utf-8'), productName = agent_product_map[ObjectId(dealer['agentId'])])
  65. logger.info('sending sim expired alert to dealer(phone=%s) result=%s' % (dealer['username'], json.dumps(response),))
  66. if response['msg'] != 'success':
  67. logger.error('send sms to dealer failed, error=%s' % json.dumps(response))
  68. if MaxCount <= count:
  69. break
  70. print('finished',count)