repaired_lige_refund.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. # coding=utf-8
  2. import csv
  3. import pandas as pd
  4. from bson import ObjectId
  5. from base import init_env
  6. init_env(True)
  7. from apps.web.agent.define import AGENT_INCOME_TYPE
  8. from apps.web.agent.models import Agent, AgentIncomeReport
  9. from apps.web.constant import PARTITION_ROLE
  10. from apps.web.dealer.define import DEALER_INCOME_TYPE
  11. from apps.web.report.utils import update_income_stats
  12. from apps.web.dealer.proxy import DealerIncomeProxy
  13. from apps.web.dealer.models import Dealer
  14. from apilib.monetary import RMB
  15. from apps.web.user.models import RechargeRecord
  16. CSV_PATH = u"微信平台9_28退款记录.csv"
  17. def get_source_data(csvPath):
  18. columns = ["refundStatus", "refundMoney", "wxOrderNo", "orderNo", "payMoney"]
  19. columnNums = [3, 5, 7, 8, 11]
  20. dataFrame = pd.read_csv(csvPath, skiprows=5, encoding="GBK", usecols=columnNums, names=columns)
  21. return dataFrame.iterrows()
  22. def get_recharge_record(**kwargs):
  23. for k in kwargs.keys():
  24. if k not in ["wxOrderNo", "orderNo"]:
  25. print "错误的获取订单参数, {}".format(kwargs)
  26. raise Exception(u"错误的获取订单参数")
  27. return RechargeRecord.objects.filter(**kwargs).first()
  28. def repaired_ledger(csvRow):
  29. """
  30. 处理 分账记录的修复
  31. :param csvRow:
  32. :return:
  33. """
  34. wxOrderNo = csvRow.get("wxOrderNo").replace("`", "")
  35. orderNo = csvRow.get("orderNo").replace("`", "")
  36. refundFee = RMB(csvRow.get("refundMoney"))
  37. record = get_recharge_record(wxOrderNo=wxOrderNo, orderNo=orderNo)
  38. refundFee = record.money
  39. # 获取分账记录
  40. proxy = DealerIncomeProxy.objects(ref_id=record.id).first()
  41. if not proxy:
  42. print "not proxy"
  43. return
  44. # 处理经销商以及参与设备分成的 记录先修改
  45. refund_partition = proxy.update_for_refund(refund_fee=refundFee)
  46. # 更新经销商,组和设备汇总信息
  47. if record.logicalCode:
  48. update_income_stats(proxy=proxy, refund_partion=refund_partition, refund_fee=refundFee, allowed={'dealer': True, 'group': True, 'device': False})
  49. else:
  50. update_income_stats(proxy=proxy, refund_fee=refundFee, refund_partion=refund_partition)
  51. # 更新经销商收益和代理商收益以及汇总数据
  52. refund_info = list()
  53. for item in refund_partition:
  54. if item['amount'] > RMB(0):
  55. if item['role'] == PARTITION_ROLE.PARTNER or item['role'] == PARTITION_ROLE.OWNER:
  56. try:
  57. dealer = Dealer.objects(id=item['id']).first()
  58. dealer.decr_fund(DEALER_INCOME_TYPE.DEVICE_INCOME, record.withdrawSourceKey,
  59. item['amount'])
  60. except Exception, e:
  61. print('refund money from dealer<id={}> error={}'.format(item['id'], str(e)))
  62. return
  63. else:
  64. try:
  65. agent = Agent.objects(id=item['id']).first() # type: Agent
  66. agent.decr_fund(AGENT_INCOME_TYPE.DEALER_DEVICE_FEE, record.withdrawSourceKey, item['amount'])
  67. AgentIncomeReport.get_collection().update(
  68. {'detail.recharge_record_id': ObjectId(record.id), 'agentId': item['id']},
  69. {'$inc': {'amount': (-item['amount']).mongo_amount}})
  70. except Exception, e:
  71. print('refund money from agent<id={}> error={}'.format(item['id'], str(e)))
  72. return
  73. refund_info.append({"role": item["role"], "id": item["id"], "money": str(item["amount"])})
  74. record.attachParas.update({"lige": True, "refund_partition": refund_info})
  75. record.save()
  76. return refund_info
  77. def run():
  78. repairedList = list()
  79. for index, row in get_source_data(CSV_PATH):
  80. print row
  81. try:
  82. refund_info = repaired_ledger(row)
  83. except Exception as e:
  84. print e
  85. repairedList.append({"orderNo": row.get("orderNo"), "repaired": 0})
  86. else:
  87. repairedList.append({"orderNo": row.get("orderNo"), "repaired": 1, "refundInfo": refund_info})
  88. with open("lige_ledger", "w") as f:
  89. w = csv.DictWriter(f, fieldnames=repairedList[0].keys())
  90. w.writeheader()
  91. w.writerows(repairedList)
  92. if __name__ == '__main__':
  93. run()