repaired_lige.py 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  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.user.models import RechargeRecord, ConsumeRecord
  8. from apps.web.user.transaction_deprecated import refund_cash
  9. from apilib.monetary import RMB, VirtualCoin
  10. from apps.web.device.models import Device
  11. from apps.web.dealer.proxy import DealerIncomeProxy
  12. from apps.web.agent.define import AGENT_INCOME_TYPE
  13. from apps.web.agent.models import Agent, AgentIncomeReport
  14. from apps.web.constant import PARTITION_ROLE
  15. from apps.web.dealer.define import DEALER_INCOME_TYPE
  16. from apps.web.dealer.models import Dealer
  17. from apps.web.report.utils import update_income_stats
  18. FILE_NAME = ["9月27日19点-24点.csv", "9月28日0点-12点.csv", "9月28日12点-18点.csv"]
  19. ALI_ALL_FILE = "liGeAll.xlsx"
  20. ALI_REFUND_FILE = "liGeHasRefunded.xlsx"
  21. WECHAT_NO = [
  22. "4200000694202009275252929409",
  23. "4200000684202009275674877850",
  24. "4200000679202009278707739298",
  25. "4200000682202009273085271461",
  26. "4200000690202009270275987685",
  27. "4200000702202009279868079657"
  28. ]
  29. def parse_csv_file(fileName):
  30. """
  31. 读取里格原始的csv文件
  32. :param fileName:
  33. :return:
  34. """
  35. columns = ["wxOrderNo", "orderNo", "status"]
  36. columnNums = [1, 2, 4]
  37. dataFrame = pd.read_csv(fileName, skiprows=5, encoding="GBK", usecols=columnNums, names=columns)
  38. return dataFrame.iterrows()
  39. def write_need_refund():
  40. writeData = list()
  41. for fileName in FILE_NAME:
  42. # 读取csv的表格文件
  43. for index, row in parse_csv_file(fileName):
  44. # unPay 状态的不处理
  45. if row.get("status") == u"待买家支付":
  46. continue
  47. # 退款成功的这个地方不做处理
  48. elif row.get("status") == u"全额退款完成":
  49. continue
  50. # 最后的状态应该是 买家已支付
  51. else:
  52. orderNo = row.get("orderNo").replace("`", "")
  53. wxOrderNo = row.get("wxOrderNo").replace("`", "")
  54. rechargeRecord = RechargeRecord.objects.filter(orderNo=orderNo, wxOrderNo=wxOrderNo).first()
  55. if not rechargeRecord:
  56. print "not rechargeRecord!, wxOrderNo is <{}>".format(wxOrderNo)
  57. tempData = {
  58. "wxOrderNo": wxOrderNo + "\t",
  59. "orderNo": orderNo,
  60. "status": row.get("status"),
  61. "isNeedRefund": 0,
  62. "reason": u"未找到订单",
  63. "payTime": rechargeRecord.dateTimeAdded
  64. }
  65. writeData.append(tempData)
  66. continue
  67. if not rechargeRecord.isQuickPay:
  68. tempData = {
  69. "wxOrderNo": wxOrderNo + "\t",
  70. "orderNo": orderNo,
  71. "status": row.get("status"),
  72. "isNeedRefund": 0,
  73. "reason": u"非快捷支付(是账户充值等付款)",
  74. "payTime": rechargeRecord.dateTimeAdded
  75. }
  76. writeData.append(tempData)
  77. print "not quickPay, wxOrderNo is <{}>".format(wxOrderNo)
  78. continue
  79. startKey = rechargeRecord.attachParas.get("startKey")
  80. consumeRecord = ConsumeRecord.objects.filter(startKey=startKey).first()
  81. # 这个地方如果没有找到消费订单 说明回调都没有过来 说明需要执行退款
  82. if not consumeRecord:
  83. tempData = {
  84. "wxOrderNo": wxOrderNo + "\t",
  85. "orderNo": orderNo,
  86. "status": row.get("status"),
  87. "isNeedRefund": 1,
  88. "reason": u"未找到消费订单 系统未执行启动设备",
  89. "money": rechargeRecord.money.mongo_amount,
  90. "payTime": rechargeRecord.dateTimeAdded
  91. }
  92. writeData.append(tempData)
  93. print "not quickPay, wxOrderNo is <{}>".format(wxOrderNo)
  94. continue
  95. time1 = consumeRecord.dateTimeAdded
  96. time2 = rechargeRecord.dateTimeAdded
  97. timeDiff = (time1 - time2).seconds
  98. # 启动时间和订单支付时间差小于10分钟, 视为正常启动
  99. if timeDiff < 600:
  100. tempData = {
  101. "wxOrderNo": wxOrderNo + "\t",
  102. "orderNo": orderNo,
  103. "status": row.get("status"),
  104. "isNeedRefund": 0,
  105. "reason": u"正常启动设备",
  106. "payTime": rechargeRecord.dateTimeAdded,
  107. "devStartTime": consumeRecord.dateTimeAdded
  108. }
  109. else:
  110. tempData = {
  111. "wxOrderNo": wxOrderNo + "\t",
  112. "orderNo": orderNo,
  113. "status": row.get("status"),
  114. "isNeedRefund": 0,
  115. "reason": u"支付成功10分种后才启动设备",
  116. "money": rechargeRecord.money.mongo_amount,
  117. "payTime": rechargeRecord.dateTimeAdded,
  118. "devStartTime": consumeRecord.dateTimeAdded
  119. }
  120. writeData.append(tempData)
  121. with open("lige_wechat.csv", "w") as f:
  122. writer = csv.DictWriter(f, fieldnames=["wxOrderNo", "orderNo", "status", "isNeedRefund", "reason", "money", "payTime", "devStartTime"])
  123. writer.writeheader()
  124. writer.writerows(writeData)
  125. def refund_wechat():
  126. for wxOrderNo in WECHAT_NO:
  127. rechargeRecord = RechargeRecord.objects.filter(wxOrderNo=wxOrderNo).first()
  128. if not rechargeRecord:
  129. print "not recharge, <{}>".format(wxOrderNo)
  130. continue
  131. refundFee = RMB(rechargeRecord.money)
  132. try:
  133. result, desc = refund_cash(rechargeRecord, refundFee, VirtualCoin(0))
  134. except Exception as e:
  135. continue
  136. if result:
  137. attachParas = rechargeRecord.attachParas
  138. attachParas["refundCash"] = refundFee.mongo_amount
  139. rechargeRecord.attachParas = attachParas
  140. rechargeRecord.save()
  141. def parse_alipay_csv_file(fileName):
  142. columns = ["orderNo", "wxOrderNo"]
  143. columnNums = [3, 4]
  144. dataFrame = pd.read_excel(fileName, skiprows=3, encoding="GBK", usecols=columnNums, names=columns)
  145. return dataFrame.iterrows()
  146. def parse_alipay_refund_csv_file(fileName):
  147. columns = ["orderNo", "wxOrderNo"]
  148. columnNums = [4, 11]
  149. dataFrame = pd.read_excel(fileName, skiprows=3, encoding="GBK", usecols=columnNums, names=columns)
  150. return dataFrame.iterrows()
  151. def write_ali_need_refund():
  152. # 首先读取已经退款的订单的编号 这个退款的里面会有一笔订单退了两次 订单总额是2元 每次退了1元 最终还是退还了全额
  153. refundOrders = set()
  154. for index, row in parse_alipay_refund_csv_file(ALI_REFUND_FILE):
  155. orderNo = row.get("orderNo")
  156. refundOrders.add(orderNo)
  157. for orderNo in refundOrders:
  158. refund_info = repaired_ledger(orderNo)
  159. def repaired_ledger(orderNo):
  160. """
  161. 处理 分账记录的修复
  162. :return:
  163. """
  164. record = RechargeRecord.objects.filter(orderNo=orderNo).first()
  165. if not record:
  166. print "no rechargeRecord orderNo is <{}>".format(orderNo)
  167. return
  168. refundFee = record.money
  169. # 获取分账记录
  170. proxy = DealerIncomeProxy.objects(ref_id=record.id).first()
  171. if not proxy:
  172. print "not proxy"
  173. return
  174. # 处理经销商以及参与设备分成的 记录先修改
  175. refund_partition = proxy.update_for_refund(refund_fee=refundFee)
  176. # 更新经销商,组和设备汇总信息
  177. if record.logicalCode:
  178. update_income_stats(proxy=proxy, refund_partion=refund_partition, refund_fee=refundFee, allowed={'dealer': True, 'group': True, 'device': False})
  179. else:
  180. update_income_stats(proxy=proxy, refund_fee=refundFee, refund_partion=refund_partition)
  181. # 更新经销商收益和代理商收益以及汇总数据
  182. refund_info = list()
  183. for item in refund_partition:
  184. if item['amount'] > RMB(0):
  185. if item['role'] == PARTITION_ROLE.PARTNER or item['role'] == PARTITION_ROLE.OWNER:
  186. try:
  187. dealer = Dealer.objects(id=item['id']).first()
  188. dealer.decr_fund(DEALER_INCOME_TYPE.DEVICE_INCOME, record.withdrawSourceKey,
  189. item['amount'])
  190. except Exception, e:
  191. print('refund money from dealer<id={}> error={}'.format(item['id'], str(e)))
  192. return
  193. else:
  194. try:
  195. agent = Agent.objects(id=item['id']).first() # type: Agent
  196. agent.decr_fund(AGENT_INCOME_TYPE.DEALER_DEVICE_FEE, record.withdrawSourceKey, item['amount'])
  197. AgentIncomeReport.get_collection().update(
  198. {'detail.recharge_record_id': ObjectId(record.id), 'agentId': item['id']},
  199. {'$inc': {'amount': (-item['amount']).mongo_amount}})
  200. except Exception, e:
  201. print('refund money from agent<id={}> error={}'.format(item['id'], str(e)))
  202. return
  203. refund_info.append({"role": item["role"], "id": item["id"], "money": str(item["amount"])})
  204. record.attachParas.update({"lige": True, "refund_partition": refund_info})
  205. record.save()
  206. return refund_info
  207. write_ali_need_refund()