123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357 |
- # -*- coding: utf-8 -*-
- # !/usr/bin/env python
- import datetime
- import os
- import sys
- PROJECT_ROOT = os.path.join(os.path.abspath(os.path.split(os.path.realpath(__file__))[0] + "/.."), '..')
- sys.path.insert(0, PROJECT_ROOT)
- from script.base import init_env
- os.environ["DJANGO_SETTINGS_MODULE"] = "configs.production"
- init_env(False)
- from apps.web.core.db import copy_document_classes
- from apps.web.dealer.proxy import DealerIncomeProxy
- from apps.web.dealer.models import Dealer
- begin = datetime.datetime(2017, 1, 1, 0, 0, 0)
- end = datetime.datetime(2089, 1, 1, 0, 0, 0)
- check_date = datetime.datetime(2022, 2, 1, 0, 0, 0)
- import simplejson as json
- def get_partner_ids(dealerId):
- rv = []
- try:
- if begin < check_date:
- his_model_cls = copy_document_classes(DealerIncomeProxy, '{}_his'.format(DealerIncomeProxy.__name__),
- 'report_his')
- for item in his_model_cls.objects(
- dealerIds=dealerId,
- dateTimeAdded__gte=begin,
- dateTimeAdded__lt=check_date if check_date < end else end
- ).only('dealerIds').limit(100): # type: DealerIncomeProxy
- for _dealerId in item.dealerIds:
- if str(_dealerId) == str(dealerId):
- continue
- elif str(_dealerId) not in rv:
- rv.append(str(_dealerId))
- if begin > check_date:
- for item in DealerIncomeProxy.objects(
- dealerIds=dealerId,
- dateTimeAdded__gte=begin,
- dateTimeAdded__lt=check_date if check_date < end else end
- ).only('dealerIds').limit(100):
- for _dealerId in item.dealerIds:
- if str(_dealerId) == str(dealerId):
- continue
- elif str(_dealerId) not in rv:
- rv.append(str(_dealerId))
- else:
- if check_date > end:
- pass
- else:
- for item in DealerIncomeProxy.objects(
- dealerIds=dealerId,
- dateTimeAdded__gte=begin,
- dateTimeAdded__lt=check_date if check_date < end else end
- ).only('dealerIds').limit(100):
- for _dealerId in item.dealerIds:
- if str(_dealerId) == str(dealerId):
- continue
- elif str(_dealerId) not in rv:
- rv.append(str(_dealerId))
- except Exception as e:
- pass
- return list(set(rv))
- def read_xls(filename):
- rv = {}
- import xlrd
- book = xlrd.open_workbook(filename)
- sheet1 = book.sheet_by_index(0)
- print('row is {}'.format(sheet1.nrows))
- for _row in range(sheet1.nrows):
- diff = sheet1.cell_value(_row, 0)
- dealerId = sheet1.cell_value(_row, 1)
- if dealerId in rv:
- print('{} is dup.'.format(dealerId))
- rv[dealerId] = (diff, dealerId)
- print('row is {}'.format(len(rv.keys())))
- return rv
- def write_execl(ass_dict, value_dict):
- import openpyxl
- book = openpyxl.Workbook()
- sheet = book.create_sheet(title=u'对账记录', index=0)
- row = 1
- for dealerId, assList in ass_dict.iteritems():
- sheet.cell(row, 1).value = value_dict[dealerId]
- sheet.cell(row, 2).value = dealerId
- row += 1
- for itemId in assList:
- if itemId != dealerId:
- sheet.cell(row, 1).value = value_dict[itemId]
- sheet.cell(row, 2).value = itemId
- row += 1
- sheet.cell(row, 1).value = ""
- sheet.cell(row, 2).value = ""
- row += 1
- book.save('all_data_done.xlsx')
- def merge(dealerId, ass_list, ass_dict, merged, reverse_dict, merge_dict, flag):
- if dealerId in ['5b5800328732d6282c3e13a6', '5ab8ce248732d645900f5e8f']:
- pass
- merged.extend(ass_list)
- for ass_dealer_id in ass_list:
- ass_dealer_id = str(ass_dealer_id)
- if ass_dealer_id == dealerId:
- continue
- if ass_dealer_id in ass_dict:
- second_ass_list = ass_dict.pop(ass_dealer_id)
- for itemId in second_ass_list:
- itemId = str(itemId)
- if itemId != dealerId:
- reverse_dict[itemId] = dealerId
- reverse_dict[ass_dealer_id] = dealerId
- merged.append(ass_dealer_id)
- flag['flag'] = True
- merge(dealerId, second_ass_list, ass_dict, merged, reverse_dict, merge_dict, flag)
- elif ass_dealer_id in merge_dict:
- # if ass_dealer_id == '5ab8ce248732d645900f5e8f':
- # pass
- merge_ass_list = merge_dict.pop(ass_dealer_id)
- merged.extend(merge_ass_list)
- for itemId in merge_ass_list:
- itemId = str(itemId)
- if itemId != dealerId:
- reverse_dict[itemId] = dealerId
- reverse_dict[ass_dealer_id] = dealerId
- merged.append(ass_dealer_id)
- flag['flag'] = True
- merge(dealerId, merge_ass_list, ass_dict, merged, reverse_dict, merge_dict, flag)
- elif ass_dealer_id in reverse_dict:
- while True:
- reverse_dealer_id = reverse_dict.pop(ass_dealer_id)
- reverse_dealer_id = str(reverse_dealer_id)
- if reverse_dealer_id == dealerId:
- reverse_dict[ass_dealer_id] = dealerId
- ass_dealer_id = None
- break
- else:
- if reverse_dealer_id in reverse_dict:
- merged.append(ass_dealer_id)
- reverse_dict[ass_dealer_id] = dealerId
- ass_dealer_id = reverse_dealer_id
- else:
- ass_dealer_id = reverse_dealer_id
- break
- if not ass_dealer_id:
- continue
- if ass_dealer_id in ass_dict:
- second_ass_list = ass_dict.pop(ass_dealer_id)
- for itemId in second_ass_list:
- itemId = str(itemId)
- if itemId != dealerId:
- reverse_dict[itemId] = dealerId
- reverse_dict[ass_dealer_id] = dealerId
- merged.append(ass_dealer_id)
- flag['flag'] = True
- merge(dealerId, second_ass_list, ass_dict, merged, reverse_dict, merge_dict, flag)
- elif ass_dealer_id in merge_dict:
- # if ass_dealer_id == '5ab8ce248732d645900f5e8f':
- # pass
- merge_ass_list = merge_dict.pop(ass_dealer_id)
- merged.extend(merge_ass_list)
- merged.append(ass_dealer_id)
- for itemId in merge_ass_list:
- itemId = str(itemId)
- if itemId != dealerId:
- reverse_dict[itemId] = dealerId
- reverse_dict[ass_dealer_id] = dealerId
- flag['flag'] = True
- merge(dealerId, merge_ass_list, ass_dict, merged, reverse_dict, merge_dict, flag)
- else:
- raise Exception('{} not find'.format(ass_dealer_id))
- else:
- raise Exception('{} not find'.format(ass_dealer_id))
- def make_org_ass():
- all_data = read_xls('all_data.xlsx')
- # all_data = read_xls(u'E:\\code\\washpayer\\script\\transaction\\all_data.xlsx')
- rv = {}
- for dealerId in list(set(all_data.keys())):
- curr_data = all_data.get(dealerId)
- rv[dealerId] = [curr_data]
- partners = get_partner_ids(dealerId)
- for partner_id in partners:
- if partner_id == dealerId:
- print('{} = {}'.format(partner_id, dealerId))
- continue
- if partner_id not in all_data:
- print('{} no data.'.format(partner_id))
- else:
- partner_data = all_data.get(partner_id)
- rv[dealerId].append(partner_data)
- print rv[dealerId]
- with open('result.txt', 'w') as f:
- f.write(json.dumps(rv))
- def do_medium():
- with open("medium.txt") as f:
- all_lines = f.readlines()
- import openpyxl
- book = openpyxl.Workbook()
- sheet = book.create_sheet(title=u'对账记录', index=0)
- row = 1
- for line in all_lines:
- if line:
- tokens = line.split(';')
- value = tokens[0]
- value = float(value.replace('diff is: ', '').strip())
- dealerId = tokens[1]
- dealerId = dealerId.replace(" id = ", '').strip()
- sheet.cell(row, 1).value = value
- sheet.cell(row, 2).value = dealerId
- row += 1
- book.save('all_data.xlsx')
- if __name__ == '__main__':
- # do_medium()
- # make_org_ass()
- with open('result.txt', "r") as f:
- file_contents = f.read()
- rv = json.loads(file_contents)
- value_dict = {}
- ass_dict = {}
- for dealerId, asses in rv.iteritems():
- dealerId = str(dealerId)
- ass_dict[dealerId] = []
- for ass in asses:
- other_dealer_id = str(ass[1])
- if other_dealer_id == dealerId:
- value_dict[dealerId] = ass[0]
- else:
- ass_dict[dealerId].append(other_dealer_id)
- print ass_dict
- reverse_dict = {}
- while True:
- flag = {'flag': False}
- merge_dict = {}
- for dealerId in list(set(ass_dict.keys())):
- dealerId = str(dealerId)
- if dealerId not in ass_dict:
- continue
- merged = []
- ass_list = ass_dict.pop(dealerId)
- merge(dealerId, ass_list, ass_dict, merged, reverse_dict, merge_dict, flag)
- merge_dict[dealerId] = list(set(merged))
- ass_dict = merge_dict
- if not flag['flag']:
- break
- print ass_dict
- write_execl(ass_dict, value_dict)
|