analysis.py 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. import datetime
  4. import os
  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. from script.base import init_env
  9. os.environ["DJANGO_SETTINGS_MODULE"] = "configs.production"
  10. init_env(False)
  11. from apps.web.core.db import copy_document_classes
  12. from apps.web.dealer.proxy import DealerIncomeProxy
  13. from apps.web.dealer.models import Dealer
  14. begin = datetime.datetime(2017, 1, 1, 0, 0, 0)
  15. end = datetime.datetime(2089, 1, 1, 0, 0, 0)
  16. check_date = datetime.datetime(2022, 2, 1, 0, 0, 0)
  17. import simplejson as json
  18. def get_partner_ids(dealerId):
  19. rv = []
  20. try:
  21. if begin < check_date:
  22. his_model_cls = copy_document_classes(DealerIncomeProxy, '{}_his'.format(DealerIncomeProxy.__name__),
  23. 'report_his')
  24. for item in his_model_cls.objects(
  25. dealerIds=dealerId,
  26. dateTimeAdded__gte=begin,
  27. dateTimeAdded__lt=check_date if check_date < end else end
  28. ).only('dealerIds').limit(100): # type: DealerIncomeProxy
  29. for _dealerId in item.dealerIds:
  30. if str(_dealerId) == str(dealerId):
  31. continue
  32. elif str(_dealerId) not in rv:
  33. rv.append(str(_dealerId))
  34. if begin > check_date:
  35. for item in DealerIncomeProxy.objects(
  36. dealerIds=dealerId,
  37. dateTimeAdded__gte=begin,
  38. dateTimeAdded__lt=check_date if check_date < end else end
  39. ).only('dealerIds').limit(100):
  40. for _dealerId in item.dealerIds:
  41. if str(_dealerId) == str(dealerId):
  42. continue
  43. elif str(_dealerId) not in rv:
  44. rv.append(str(_dealerId))
  45. else:
  46. if check_date > end:
  47. pass
  48. else:
  49. for item in DealerIncomeProxy.objects(
  50. dealerIds=dealerId,
  51. dateTimeAdded__gte=begin,
  52. dateTimeAdded__lt=check_date if check_date < end else end
  53. ).only('dealerIds').limit(100):
  54. for _dealerId in item.dealerIds:
  55. if str(_dealerId) == str(dealerId):
  56. continue
  57. elif str(_dealerId) not in rv:
  58. rv.append(str(_dealerId))
  59. except Exception as e:
  60. pass
  61. return list(set(rv))
  62. def read_xls(filename):
  63. rv = {}
  64. import xlrd
  65. book = xlrd.open_workbook(filename)
  66. sheet1 = book.sheet_by_index(0)
  67. print('row is {}'.format(sheet1.nrows))
  68. for _row in range(sheet1.nrows):
  69. diff = sheet1.cell_value(_row, 0)
  70. dealerId = sheet1.cell_value(_row, 1)
  71. if dealerId in rv:
  72. print('{} is dup.'.format(dealerId))
  73. rv[dealerId] = (diff, dealerId)
  74. print('row is {}'.format(len(rv.keys())))
  75. return rv
  76. def write_execl(ass_dict, value_dict):
  77. import openpyxl
  78. book = openpyxl.Workbook()
  79. sheet = book.create_sheet(title=u'对账记录', index=0)
  80. row = 1
  81. for dealerId, assList in ass_dict.iteritems():
  82. sheet.cell(row, 1).value = value_dict[dealerId]
  83. sheet.cell(row, 2).value = dealerId
  84. row += 1
  85. for itemId in assList:
  86. if itemId != dealerId:
  87. sheet.cell(row, 1).value = value_dict[itemId]
  88. sheet.cell(row, 2).value = itemId
  89. row += 1
  90. sheet.cell(row, 1).value = ""
  91. sheet.cell(row, 2).value = ""
  92. row += 1
  93. book.save('all_data_done.xlsx')
  94. def merge(dealerId, ass_list, ass_dict, merged, reverse_dict, merge_dict, flag):
  95. if dealerId in ['5b5800328732d6282c3e13a6', '5ab8ce248732d645900f5e8f']:
  96. pass
  97. merged.extend(ass_list)
  98. for ass_dealer_id in ass_list:
  99. ass_dealer_id = str(ass_dealer_id)
  100. if ass_dealer_id == dealerId:
  101. continue
  102. if ass_dealer_id in ass_dict:
  103. second_ass_list = ass_dict.pop(ass_dealer_id)
  104. for itemId in second_ass_list:
  105. itemId = str(itemId)
  106. if itemId != dealerId:
  107. reverse_dict[itemId] = dealerId
  108. reverse_dict[ass_dealer_id] = dealerId
  109. merged.append(ass_dealer_id)
  110. flag['flag'] = True
  111. merge(dealerId, second_ass_list, ass_dict, merged, reverse_dict, merge_dict, flag)
  112. elif ass_dealer_id in merge_dict:
  113. # if ass_dealer_id == '5ab8ce248732d645900f5e8f':
  114. # pass
  115. merge_ass_list = merge_dict.pop(ass_dealer_id)
  116. merged.extend(merge_ass_list)
  117. for itemId in merge_ass_list:
  118. itemId = str(itemId)
  119. if itemId != dealerId:
  120. reverse_dict[itemId] = dealerId
  121. reverse_dict[ass_dealer_id] = dealerId
  122. merged.append(ass_dealer_id)
  123. flag['flag'] = True
  124. merge(dealerId, merge_ass_list, ass_dict, merged, reverse_dict, merge_dict, flag)
  125. elif ass_dealer_id in reverse_dict:
  126. while True:
  127. reverse_dealer_id = reverse_dict.pop(ass_dealer_id)
  128. reverse_dealer_id = str(reverse_dealer_id)
  129. if reverse_dealer_id == dealerId:
  130. reverse_dict[ass_dealer_id] = dealerId
  131. ass_dealer_id = None
  132. break
  133. else:
  134. if reverse_dealer_id in reverse_dict:
  135. merged.append(ass_dealer_id)
  136. reverse_dict[ass_dealer_id] = dealerId
  137. ass_dealer_id = reverse_dealer_id
  138. else:
  139. ass_dealer_id = reverse_dealer_id
  140. break
  141. if not ass_dealer_id:
  142. continue
  143. if ass_dealer_id in ass_dict:
  144. second_ass_list = ass_dict.pop(ass_dealer_id)
  145. for itemId in second_ass_list:
  146. itemId = str(itemId)
  147. if itemId != dealerId:
  148. reverse_dict[itemId] = dealerId
  149. reverse_dict[ass_dealer_id] = dealerId
  150. merged.append(ass_dealer_id)
  151. flag['flag'] = True
  152. merge(dealerId, second_ass_list, ass_dict, merged, reverse_dict, merge_dict, flag)
  153. elif ass_dealer_id in merge_dict:
  154. # if ass_dealer_id == '5ab8ce248732d645900f5e8f':
  155. # pass
  156. merge_ass_list = merge_dict.pop(ass_dealer_id)
  157. merged.extend(merge_ass_list)
  158. merged.append(ass_dealer_id)
  159. for itemId in merge_ass_list:
  160. itemId = str(itemId)
  161. if itemId != dealerId:
  162. reverse_dict[itemId] = dealerId
  163. reverse_dict[ass_dealer_id] = dealerId
  164. flag['flag'] = True
  165. merge(dealerId, merge_ass_list, ass_dict, merged, reverse_dict, merge_dict, flag)
  166. else:
  167. raise Exception('{} not find'.format(ass_dealer_id))
  168. else:
  169. raise Exception('{} not find'.format(ass_dealer_id))
  170. def make_org_ass():
  171. all_data = read_xls('all_data.xlsx')
  172. # all_data = read_xls(u'E:\\code\\washpayer\\script\\transaction\\all_data.xlsx')
  173. rv = {}
  174. for dealerId in list(set(all_data.keys())):
  175. curr_data = all_data.get(dealerId)
  176. rv[dealerId] = [curr_data]
  177. partners = get_partner_ids(dealerId)
  178. for partner_id in partners:
  179. if partner_id == dealerId:
  180. print('{} = {}'.format(partner_id, dealerId))
  181. continue
  182. if partner_id not in all_data:
  183. print('{} no data.'.format(partner_id))
  184. else:
  185. partner_data = all_data.get(partner_id)
  186. rv[dealerId].append(partner_data)
  187. print rv[dealerId]
  188. with open('result.txt', 'w') as f:
  189. f.write(json.dumps(rv))
  190. def do_medium():
  191. with open("medium.txt") as f:
  192. all_lines = f.readlines()
  193. import openpyxl
  194. book = openpyxl.Workbook()
  195. sheet = book.create_sheet(title=u'对账记录', index=0)
  196. row = 1
  197. for line in all_lines:
  198. if line:
  199. tokens = line.split(';')
  200. value = tokens[0]
  201. value = float(value.replace('diff is: ', '').strip())
  202. dealerId = tokens[1]
  203. dealerId = dealerId.replace(" id = ", '').strip()
  204. sheet.cell(row, 1).value = value
  205. sheet.cell(row, 2).value = dealerId
  206. row += 1
  207. book.save('all_data.xlsx')
  208. if __name__ == '__main__':
  209. # do_medium()
  210. # make_org_ass()
  211. with open('result.txt', "r") as f:
  212. file_contents = f.read()
  213. rv = json.loads(file_contents)
  214. value_dict = {}
  215. ass_dict = {}
  216. for dealerId, asses in rv.iteritems():
  217. dealerId = str(dealerId)
  218. ass_dict[dealerId] = []
  219. for ass in asses:
  220. other_dealer_id = str(ass[1])
  221. if other_dealer_id == dealerId:
  222. value_dict[dealerId] = ass[0]
  223. else:
  224. ass_dict[dealerId].append(other_dealer_id)
  225. print ass_dict
  226. reverse_dict = {}
  227. while True:
  228. flag = {'flag': False}
  229. merge_dict = {}
  230. for dealerId in list(set(ass_dict.keys())):
  231. dealerId = str(dealerId)
  232. if dealerId not in ass_dict:
  233. continue
  234. merged = []
  235. ass_list = ass_dict.pop(dealerId)
  236. merge(dealerId, ass_list, ass_dict, merged, reverse_dict, merge_dict, flag)
  237. merge_dict[dealerId] = list(set(merged))
  238. ass_dict = merge_dict
  239. if not flag['flag']:
  240. break
  241. print ass_dict
  242. write_execl(ass_dict, value_dict)