system_ledger.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333
  1. # coding=utf-8
  2. import os
  3. from base import init_env
  4. os.environ["DJANGO_SETTINGS_MODULE"] = "configs.dev_zjl"
  5. init_env(False)
  6. from django.utils.module_loading import import_string
  7. from apps.web.report.utils import CentralDataProcessor
  8. from apps.web.dealer.proxy import record_income_proxy, DealerIncomeProxy
  9. from apps.web.core import ROLE
  10. from apps.web.dealer.models import Dealer
  11. from apps.web.helpers import get_user_manager_agent, DealerCustomizedBrandVisitor, AgentCustomizedBrandVisitor
  12. from apps.web.device.models import Device, DeviceDict, Group, GroupDict
  13. from apps.web.report.ledger import Ledger
  14. from apps.web.user.models import RechargeRecord
  15. from apps.web.constant import USER_RECHARGE_TYPE
  16. from apilib.monetary import RMB, VirtualCoin
  17. from apps.web.common.transaction import OrderNoMaker, OrderMainType, UserPaySubType
  18. import datetime
  19. def _create_recharge():
  20. # 以下是正式环境的信息
  21. # logicalCode = "406852"
  22. # groupId = "611375c8dde4bfce0cc70a33"
  23. # ownerId = "6113748e00304804c464787f"
  24. # 以下是测试环境的信息
  25. # logicalCode = "010101"
  26. # groupId = "62b4005169f046a084a83fae"
  27. # ownerId = "62188a891bab8edffc4d88ad"
  28. # 这个是测试账号的账单增加信息
  29. # logicalCode = "010107"
  30. # groupId = "62b4005169f046a084a83fae"
  31. # ownerId = "62188a891bab8edffc4d88ad"
  32. # 以下是李虎增加金额的地址信息
  33. # logicalCode = "406852"
  34. # groupId = "5bbaa56e8732d608488522ee"
  35. # ownerId = "5b4de0fc8732d60cb4c3ba0c"
  36. # -----------------------------
  37. """
  38. {u'6417d4456f29257125ebf705': <RMB 0.00> ,
  39. u'61ba2ce000304845c2779797': <RMB 23.77> ,
  40. u'62b122af003048d043c68f54': <RMB 301.43> ,
  41. u'62b1c7886f29251b9886e8b0': <RMB 266.63> }
  42. """
  43. # 以下是甘明波错误的分账地址 金额被扣除 建立负数单子(1)
  44. # logicalCode = "G354338"
  45. # groupId = "62ce8c793637e3149dd8f1d8"
  46. # ownerId = "61ba2ce000304845c2779797"
  47. # 以下是甘明波错误的分账地址 金额被扣除 建立负数单子(2)
  48. # logicalCode = "G354338"
  49. # groupId = "62ce93263637e3149d0c2d74"
  50. # ownerId = "62b122af003048d043c68f54"
  51. # 以下是甘明波错误的分账地址 金额被扣除 建立负数单子(3)
  52. # logicalCode = "G354338"
  53. # groupId = "62ce943c3637e3149d15e275"
  54. # ownerId = "62b1c7886f29251b9886e8b0"
  55. # 以下是甘明波错误的分账地址 分账补偿
  56. # logicalCode = "G395694"
  57. # groupId = "6112618edde4bfce0cbb8d78"
  58. # ownerId = "61114960003048c1e36cdca3"
  59. """
  60. u'5b26152e8732d672afcab4b9': <RMB 371.75> ,
  61. u'62ad5e1f003048033e36a2f0': <RMB 287.45> ,
  62. u'62ad5ff26f29256fb8104ec6': <RMB 586.50> ,
  63. u'62b06a886f29251b9cf7a470': <RMB 57.05> ,
  64. u'62b06a886f29251b9cf7a471': <RMB 24.45> ,
  65. u'62b08576003048d043c68da3': <RMB 9.80> }
  66. """
  67. # 以下是秦初连错误的地址分账 金额被扣除 建立负数单子(1)
  68. # logicalCode = "G384694"
  69. # groupId = "5b2615b78732d672afcab4e2"
  70. # ownerId = "5b26152e8732d672afcab4b9"
  71. # money = -371.75
  72. # 以下是秦初连错误的地址分账 金额被扣除 建立负数单子(2)
  73. # logicalCode = "G384694"
  74. # groupId = "62cea0223637e3149d913a09"
  75. # ownerId = "62ad5e1f003048033e36a2f0"
  76. # money = -287.45
  77. # 以下是秦初连错误的地址分账 金额被扣除 建立负数单子(3)
  78. # logicalCode = "G384694"
  79. # groupId = "62cea1693637e3149d9f66d5"
  80. # ownerId = "62ad5ff26f29256fb8104ec6"
  81. # money = -586.50
  82. # 以下是秦初连错误的地址分账 金额被扣除 建立负数单子(4)
  83. # logicalCode = "G384694"
  84. # groupId = "62cea2d83637e3149daf69c7"
  85. # ownerId = "62b06a886f29251b9cf7a470"
  86. # money = -57.05
  87. # 以下是秦初连错误的地址分账 金额被扣除 建立负数单子(5)
  88. # logicalCode = "G384694"
  89. # groupId = "62cea4123637e3149dbc8ec1"
  90. # ownerId = "62b06a886f29251b9cf7a471"
  91. # money = -24.45
  92. # 以下是秦初连错误的地址分账 金额被扣除 建立负数单子(6)
  93. # logicalCode = "G384694"
  94. # groupId = "62cea4be3637e3149dc41076"
  95. # ownerId = "62b08576003048d043c68da3"
  96. # money = -9.80
  97. # 以下是秦初连错误的分账地址 分账补偿
  98. logicalCode = "G300942"
  99. groupId = "5cd4c136003048355af0f161"
  100. ownerId = "5cb287be0030482cecd6f98e"
  101. money = 9.80 + 24.45 + 57.05 + 586.50 + 287.45 + 371.75
  102. dev = Device.get_dev_by_l(logicalCode) # type: DeviceDict
  103. group = Group.get_group(groupId) # type: GroupDict
  104. dealer = Dealer.objects.get(id=ownerId)
  105. product_agent = get_user_manager_agent(dealer)
  106. source = product_agent
  107. visitor = AgentCustomizedBrandVisitor
  108. funName = "get_{}_env_pay_gateway".format("wechat")
  109. get_env_pay_gateway_func = import_string("apps.web.helpers.{}".format(funName))
  110. payment_gateway = get_env_pay_gateway_func(source, role=ROLE.myuser, vistor=visitor)
  111. # 创建一张名为系统调整的订单 同时金额为负数 (扣钱的人是负数订单 得钱的人是正数订单)
  112. orderNo = OrderNoMaker.make_order_no_32(
  113. identifier=dev.logicalCode,
  114. main_type=OrderMainType.PAY,
  115. sub_type="S"
  116. )
  117. wxOrderNo = ""
  118. transactionId = ""
  119. ownerId = ownerId
  120. openId = ""
  121. groupId = groupId
  122. nickname = ""
  123. money = RMB(money)
  124. coins = VirtualCoin(0)
  125. subject = u"调整地址<5cd4c136003048355af0f161>设备收益差额"
  126. result = "success"
  127. isQuickPay = False
  128. via = "recharge"
  129. devNo = dev.devNo
  130. logicalCode = logicalCode
  131. devType = dev.devTypeName
  132. groupName = group.groupName
  133. address = group.address
  134. operator = "SYSTEM"
  135. dateTimeAdded = datetime.datetime(2022, 6, 15)
  136. payload = {
  137. "orderNo": orderNo,
  138. "wxOrderNo": wxOrderNo,
  139. "transactionId": transactionId,
  140. "ownerId": ownerId,
  141. "openId": openId,
  142. "groupId": groupId,
  143. "nickname": nickname,
  144. "money": money,
  145. "coins": coins,
  146. "subject": subject,
  147. "result": result,
  148. "isQuickPay": isQuickPay,
  149. "via": via,
  150. "devNo": devNo,
  151. "logicalCode": logicalCode,
  152. "devType": devType,
  153. "groupName": groupName,
  154. "address": address,
  155. "operator": operator,
  156. "dateTimeAdded": dateTimeAdded
  157. }
  158. payload.update({
  159. 'gateway': payment_gateway.gateway_type,
  160. 'payAppType': payment_gateway.pay_app_type,
  161. 'payGatewayKey': payment_gateway.gateway_key,
  162. 'withdrawSourceKey': payment_gateway.withdraw_source_key()
  163. })
  164. order = RechargeRecord(**payload).save()
  165. print(order.id)
  166. def _create_ledger():
  167. # 以下是正式环境的ID
  168. # rid = "62ce351234551738b05a9f7c"
  169. # 以下是测试环境的ID
  170. # rid = "62ce2d17dfd09be536636434"
  171. # 以下是李虎的补偿id
  172. # rid = "62ce695df57e6375dd09be11"
  173. # 以下是甘明波的错误修复(扣除ID1)
  174. # rid = "62ce8d5e4980e815d12f859c"
  175. # 以下是甘明波的错误修复(扣除ID2)
  176. # rid = "62ce937e4980e815d12f859e"
  177. # 以下是甘明波的错误修复(扣除ID3)
  178. # rid = "62ce946b4980e815d12f85a0"
  179. # 以下是甘明波的错误修复(补偿)
  180. # rid = "62ce95b44980e815d12f85a2"
  181. # 以下是秦初连的错误修复 (扣除ID1)
  182. # rid = "62ce9f405c9952d06d1801bd"
  183. # 以下是秦初连的错误修复 (扣除ID2)
  184. # rid = "62cea05b5c9952d06d1801bf"
  185. # 以下是秦初连的错误修复 (扣除ID3)
  186. # rid = "62cea1855c9952d06d1801c1"
  187. # 以下是秦初连的错误修复 (扣除ID4)
  188. # rid = "62cea3665c9952d06d1801c3"
  189. # 以下是秦初连的错误修复 (扣除ID5)
  190. # rid = "62cea42a5c9952d06d1801c5"
  191. # 以下是秦初连的错误修复 (扣除ID6)
  192. # rid = "62cea4e75c9952d06d1801c7"
  193. # 以下是秦初连的错误修复(补偿)
  194. rid = "62cea7595c9952d06d1801c9"
  195. order = RechargeRecord.objects.get(id=rid)
  196. if order.isAllocatedCardMoney:
  197. return
  198. l = Ledger(USER_RECHARGE_TYPE.RECHARGE, order)
  199. income_partition = l._get_group_income_partition()
  200. total = RMB(0)
  201. for _k, _v in income_partition.items():
  202. if _k == "owner":
  203. continue
  204. for _item in _v:
  205. total += RMB(_item["money"])
  206. left = order.money - total
  207. income_partition["owner"][0]["money"] = left.mongo_amount
  208. from pprint import pprint
  209. pprint(income_partition)
  210. proxy = record_income_proxy(l.source, order, income_partition, dateTime=datetime.datetime(2022, 6, 15))
  211. proxy.desc = order.subject
  212. proxy.save()
  213. for _role, _items in income_partition.items():
  214. if _role == "agent":
  215. continue
  216. for _item in _items:
  217. dealer = Dealer.objects.get(id=_item["id"])
  218. source_key = order.withdrawSourceKey
  219. dealer.record_income("recharge", source_key, RMB(_item['money']))
  220. order.isAllocatedCardMoney = True
  221. order.save()
  222. def get_proxy():
  223. """
  224. 基本思路是 地址的地址的ownerID会发生变化 但是地址的ID本身不会发生变化
  225. 那就通过这个地址的所有的groupId找出这段时间所有的Income 并且拿到patentMap 如果partnerMap 的owner 不是当前的地址的 则是有问题的单子
  226. """
  227. import datetime
  228. from bson import ObjectId
  229. groupId = ObjectId("5cd4c136003048355af0f161")
  230. group = Group.objects.get(id=groupId)
  231. et = datetime.datetime(2022, 7, 1)
  232. proxies = DealerIncomeProxy.objects.filter(
  233. dateTimeAdded__lt=et,
  234. groupId=groupId
  235. )
  236. proxyIds = [_.id for _ in proxies]
  237. pids = list()
  238. for _pid in proxyIds:
  239. _proxy = DealerIncomeProxy.objects.get(id=_pid)
  240. _items = filter(lambda x: x["role"] == "owner", _proxy.partition)
  241. if _items[0]["id"] != group.ownerId:
  242. pids.append(str(_pid))
  243. with open("get_proxy", "w") as f:
  244. f.write("\n".join(pids))
  245. def get_money():
  246. from apilib.monetary import RMB
  247. with open("get_proxy") as f:
  248. pids = f.readlines()
  249. total = RMB(0)
  250. res = dict()
  251. for _pid in pids:
  252. _proxy = DealerIncomeProxy.objects.get(id=_pid.strip())
  253. for _item in _proxy.partition:
  254. if _item["id"] not in res:
  255. res[_item["id"]] = RMB(_item["money"])
  256. else:
  257. res[_item["id"]] += RMB(_item["money"])
  258. from pprint import pprint
  259. pprint(res)
  260. def ganmingbo3():
  261. from apilib.monetary import RMB
  262. with open("ganmingbo") as f:
  263. pids = f.readlines()
  264. res = ""
  265. for _pid in pids:
  266. _proxy = DealerIncomeProxy.objects.get(id=_pid.strip())
  267. s = u"分账总金额{},".format(_proxy.totalAmount)
  268. for _item in _proxy.partition:
  269. if _item["role"] == "agent":
  270. continue
  271. _d = Dealer.objects.get(id=_item["id"])
  272. if _item["role"] == "partner" and _item["id"] == "611884f30030487ba4ba0e8f":
  273. s += "{}-{} 分账金额 {} 正常分账,".format(_d.username, _d.nickname, _item["money"])
  274. else:
  275. s += "{}-{} 分账金额 {} 异常分账,".format(_d.username, _d.nickname, _item["money"])
  276. s += "\n"
  277. res += s
  278. with open("ganmingbo3", "w") as f:
  279. f.write(res)
  280. if __name__ == '__main__':
  281. pass