coinCalculate.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. # coding=utf-8
  2. import csv
  3. import datetime
  4. from tqdm import tqdm
  5. from base import init_env
  6. init_env(False)
  7. from apps.web.device.models import Device, DeviceDict, Group
  8. from apilib.monetary import VirtualCoin
  9. from apps.web.user.models import MyUser
  10. # class CoinError(Exception):
  11. # pass
  12. #
  13. #
  14. # notEqualDevs = list()
  15. # notWashDevs = list()
  16. #
  17. # for _dev in Device.objects.only("washConfig", "id", "ownerId", "devNo"):
  18. # if not _dev.ownerId:
  19. # continue
  20. # washConfig = _dev.washConfig
  21. # try:
  22. # for _wash in washConfig.values():
  23. # if _wash["price"] != _wash["coins"]:
  24. # raise CoinError()
  25. # except CoinError:
  26. # notEqualDevs.append(_dev.devNo)
  27. # except Exception as e:
  28. # notWashDevs.append(_dev.devNo)
  29. #
  30. # notEqualMap = list()
  31. # notWashMap = list()
  32. # for _devNo in notEqualDevs:
  33. # print _devNo
  34. # dealer = Dealer.get_dealer(Device.get_dev(_devNo).ownerId)
  35. # if not dealer:
  36. # continue
  37. # notEqualMap.append({"devNo": _devNo, "dealer": "{}-{}".format(dealer.get("id"), dealer.get("username"))})
  38. #
  39. #
  40. # for _devNo in notWashDevs:
  41. # dealer = Dealer.get_dealer(Device.get_dev(_devNo).ownerId)
  42. # if not dealer:
  43. # continue
  44. # notWashMap.append({"devNo": _devNo, "dealer": "{}-{}".format(dealer.get("id"), dealer.get("username"))})
  45. #
  46. # headers = ["devNo", "dealer"]
  47. # with open("notEqual.csv", "w") as f:
  48. # w = csv.DictWriter(f, fieldnames=headers)
  49. # w.writeheader()
  50. # w.writerows(notEqualMap)
  51. #
  52. # with open("notWash.csv", "w") as f:
  53. # w = csv.DictWriter(f, fieldnames=headers)
  54. # w.writeheader()
  55. # w.writerows(notWashMap)
  56. from collections import namedtuple
  57. DealerInfo = namedtuple("DealerInfo", ["id", "devCount", "offlineDevCount", "userCount", "coinCount"])
  58. def read_csv():
  59. with open("notEqual.csv", "r") as f:
  60. csvReader = csv.DictReader(f)
  61. data = [row.get("dealer").split("-")[0] for row in csvReader]
  62. return set(data)
  63. def get_dev_count(dealerInfo): # type: (DealerInfo) -> int
  64. dealerId = dealerInfo.id
  65. devCount = Device.objects.filter(ownerId=dealerId).count()
  66. return devCount
  67. def get_offline_dev_count(dealerInfo): # type: (DealerInfo) -> int
  68. dealerId = dealerInfo.id
  69. groupIds = Group.get_group_ids_of_dealer(dealerId)
  70. devNos = Device.get_devNos_by_group(groupIds)
  71. count = 0
  72. for _devNo in devNos:
  73. dev = Device.get_dev(_devNo) # type: DeviceDict
  74. if not dev.online and datetime.datetime.fromtimestamp(int(str(Device.get_dev("867435053358115").offTime)[0:10])) < datetime.datetime(2021, 2, 1):
  75. count += 1
  76. return count
  77. def get_user_count(dealerInfo): # type:(DealerInfo) -> int
  78. dealerId = dealerInfo.id
  79. groupIds = Group.get_group_ids_of_dealer(dealerId)
  80. return MyUser.objects.filter(groupId__in=groupIds).count()
  81. def get_user_coin_count(dealerInfo):
  82. dealerId = dealerInfo.id
  83. groupIds = Group.get_group_ids_of_dealer(dealerId)
  84. users = MyUser.objects.filter(groupId__in=groupIds).only("balance", "groupId")
  85. return sum((_user.balance for _user in users), VirtualCoin(0))
  86. def main():
  87. dealerIds = read_csv()
  88. resultList = list()
  89. for _id in tqdm(dealerIds):
  90. dealerInfo = DealerInfo(id=_id, devCount=-1, offlineDevCount=-1, userCount=-1, coinCount=-1)
  91. devCount = get_dev_count(dealerInfo)
  92. offDevCount = get_offline_dev_count(dealerInfo)
  93. userCount = get_user_count(dealerInfo)
  94. coinCount = get_user_coin_count(dealerInfo)
  95. dealerInfo = dealerInfo._replace(devCount=devCount, offlineDevCount=offDevCount, userCount=userCount, coinCount=coinCount)
  96. resultList.append(dealerInfo._asdict())
  97. with open("notEqualDealer.csv", "w") as f:
  98. w = csv.DictWriter(f, fieldnames=resultList[0].keys())
  99. w.writeheader()
  100. w.writerows(resultList)
  101. if __name__ == '__main__':
  102. main()