# coding=utf-8 import csv import pandas as pd from bson import ObjectId from base import init_env init_env(True) from apps.web.agent.define import AGENT_INCOME_TYPE from apps.web.agent.models import Agent, AgentIncomeReport from apps.web.constant import PARTITION_ROLE from apps.web.dealer.define import DEALER_INCOME_TYPE from apps.web.report.utils import update_income_stats from apps.web.dealer.proxy import DealerIncomeProxy from apps.web.dealer.models import Dealer from apilib.monetary import RMB from apps.web.user.models import RechargeRecord CSV_PATH = u"微信平台9_28退款记录.csv" def get_source_data(csvPath): columns = ["refundStatus", "refundMoney", "wxOrderNo", "orderNo", "payMoney"] columnNums = [3, 5, 7, 8, 11] dataFrame = pd.read_csv(csvPath, skiprows=5, encoding="GBK", usecols=columnNums, names=columns) return dataFrame.iterrows() def get_recharge_record(**kwargs): for k in kwargs.keys(): if k not in ["wxOrderNo", "orderNo"]: print "错误的获取订单参数, {}".format(kwargs) raise Exception(u"错误的获取订单参数") return RechargeRecord.objects.filter(**kwargs).first() def repaired_ledger(csvRow): """ 处理 分账记录的修复 :param csvRow: :return: """ wxOrderNo = csvRow.get("wxOrderNo").replace("`", "") orderNo = csvRow.get("orderNo").replace("`", "") refundFee = RMB(csvRow.get("refundMoney")) record = get_recharge_record(wxOrderNo=wxOrderNo, orderNo=orderNo) refundFee = record.money # 获取分账记录 proxy = DealerIncomeProxy.objects(ref_id=record.id).first() if not proxy: print "not proxy" return # 处理经销商以及参与设备分成的 记录先修改 refund_partition = proxy.update_for_refund(refund_fee=refundFee) # 更新经销商,组和设备汇总信息 if record.logicalCode: update_income_stats(proxy=proxy, refund_partion=refund_partition, refund_fee=refundFee, allowed={'dealer': True, 'group': True, 'device': False}) else: update_income_stats(proxy=proxy, refund_fee=refundFee, refund_partion=refund_partition) # 更新经销商收益和代理商收益以及汇总数据 refund_info = list() for item in refund_partition: if item['amount'] > RMB(0): if item['role'] == PARTITION_ROLE.PARTNER or item['role'] == PARTITION_ROLE.OWNER: try: dealer = Dealer.objects(id=item['id']).first() dealer.decr_fund(DEALER_INCOME_TYPE.DEVICE_INCOME, record.withdrawSourceKey, item['amount']) except Exception, e: print('refund money from dealer error={}'.format(item['id'], str(e))) return else: try: agent = Agent.objects(id=item['id']).first() # type: Agent agent.decr_fund(AGENT_INCOME_TYPE.DEALER_DEVICE_FEE, record.withdrawSourceKey, item['amount']) AgentIncomeReport.get_collection().update( {'detail.recharge_record_id': ObjectId(record.id), 'agentId': item['id']}, {'$inc': {'amount': (-item['amount']).mongo_amount}}) except Exception, e: print('refund money from agent error={}'.format(item['id'], str(e))) return refund_info.append({"role": item["role"], "id": item["id"], "money": str(item["amount"])}) record.attachParas.update({"lige": True, "refund_partition": refund_info}) record.save() return refund_info def run(): repairedList = list() for index, row in get_source_data(CSV_PATH): print row try: refund_info = repaired_ledger(row) except Exception as e: print e repairedList.append({"orderNo": row.get("orderNo"), "repaired": 0}) else: repairedList.append({"orderNo": row.get("orderNo"), "repaired": 1, "refundInfo": refund_info}) with open("lige_ledger", "w") as f: w = csv.DictWriter(f, fieldnames=repairedList[0].keys()) w.writeheader() w.writerows(repairedList) if __name__ == '__main__': run()