views2.py 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321
  1. # coding=utf-8
  2. import datetime
  3. import logging
  4. import simplejson as json
  5. from mongoengine import DoesNotExist
  6. from typing import TYPE_CHECKING
  7. from apilib.monetary import Percent
  8. from apps.web.constant import Const
  9. from apps.web.core import ROLE
  10. from apps.web.core.exceptions import InvalidFileSize, InvalidFileName
  11. from apps.web.core.file import AliOssFileUploader
  12. from apps.web.core.utils import JsonOkResponse, NoCommissionErrorResponse, JsonErrorResponse
  13. from apps.web.dealer.models2 import Partner, GroupShare
  14. from apps.web.dealer.proxy import DealerGroupStats
  15. from apps.web.dealer.utils2 import get_stats, LedgerStatsCalculator
  16. from apps.web.device.models import Group
  17. from apps.web.utils import permission_required
  18. if TYPE_CHECKING:
  19. from apps.web.dealer.models import Dealer
  20. from apps.web.device.models import GroupDict
  21. logger = logging.getLogger(__name__)
  22. @permission_required(ROLE.dealer, ROLE.subaccount)
  23. def getGroups(request):
  24. dealer = request.user.myBoss # type: Dealer
  25. groups = Group.get_groups_of_dealer(str(dealer.id))
  26. result = list()
  27. for _group in groups: # type: GroupDict
  28. _data = {
  29. "groupId": str(_group.id),
  30. "groupName": _group.groupName,
  31. "partnerCount": len(_group.partners)
  32. }
  33. result.append(_data)
  34. return JsonOkResponse(payload={"groups": result})
  35. @permission_required(ROLE.dealer, ROLE.subaccount)
  36. def getPartners(request):
  37. """
  38. 获取全部的合伙人
  39. """
  40. dealer = request.user.myBoss # type: Dealer
  41. pageIndex = request.GET.get("pageIndex", 1)
  42. pageSize = request.GET.get("pageSize", 10)
  43. result = Partner.get_partners(dealer, int(pageIndex), int(pageSize))
  44. payload = {
  45. "dataList": result
  46. }
  47. return JsonOkResponse(payload=payload)
  48. @permission_required(ROLE.dealer, ROLE.subaccount)
  49. def addPartner(request):
  50. """
  51. 新增合伙人
  52. """
  53. dealer = request.user.myBoss
  54. data = json.loads(request.body or "{}")
  55. nickname = data.get("name")
  56. username = data.get("phone")
  57. try:
  58. partner = dealer.__class__.objects.get(agentId=dealer.agentId, username=username, nickname=nickname)
  59. except DoesNotExist:
  60. return NoCommissionErrorResponse(description=u"添加失败,{}【{}】账号不存在,请先注册为合伙人账号".format(username, nickname))
  61. try:
  62. Partner.add_relation(dealer, partner)
  63. except ValueError as ve:
  64. return NoCommissionErrorResponse(description=ve.message)
  65. return JsonOkResponse()
  66. @permission_required(ROLE.dealer, ROLE.subaccount)
  67. def deletePartner(request):
  68. """
  69. 删除合伙人
  70. """
  71. dealer = request.user.myBoss
  72. data = json.loads(request.body or "{}")
  73. partnerId = data.get("partnerId")
  74. try:
  75. partner = dealer.__class__.objects.get(agentId=dealer.agentId, id=partnerId)
  76. except DoesNotExist:
  77. return NoCommissionErrorResponse(description=u"删除失败")
  78. try:
  79. Partner.delete_relation(dealer, partner)
  80. except ValueError as ve:
  81. return NoCommissionErrorResponse(description=ve.message)
  82. return JsonOkResponse()
  83. @permission_required(ROLE.dealer, ROLE.subaccount)
  84. def getPartnerGroups(request):
  85. """
  86. 获取合伙人的所有地址组的信息
  87. """
  88. data = json.loads(request.body or "{}")
  89. _id = request.GET.get("id")
  90. try:
  91. partner = Partner.get_partner(_id) # type: Partner
  92. if not partner:
  93. raise DoesNotExist("合伙关系不存在")
  94. except DoesNotExist:
  95. return NoCommissionErrorResponse(description=u"获取合伙人场地失败")
  96. groups = partner.get_partner_groups()
  97. return JsonOkResponse(payload={"groups": groups})
  98. @permission_required(ROLE.dealer, ROLE.subaccount)
  99. def getGroupPartners(request):
  100. """
  101. 获取组内的合伙人
  102. """
  103. groupId = request.GET.get("groupId")
  104. group = Group.get_group(groupId) # type: GroupDict
  105. if group.ownerId != str(request.user.bossId):
  106. return NoCommissionErrorResponse(description=u"获取失败")
  107. partners = []
  108. for _item in group.partners:
  109. _partner = Partner.get_partner_by_dealer(str(request.user.bossId), _item["id"]) # type: Partner
  110. if not _partner:
  111. return NoCommissionErrorResponse(description=u"地址合伙人配置错误,请联系平台方处理(10000)")
  112. _share = _partner.get_share_group(groupId) # type: GroupShare
  113. if not _share:
  114. return NoCommissionErrorResponse(description=u"地址合伙人配置错误,请联系平台方处理(10001)")
  115. _p_dealer = request.user.myBoss.__class__.get_dealer(_partner.partnerId) # type: Dealer
  116. _data = {
  117. "partnerId": str(_p_dealer.id),
  118. "name": _p_dealer.nickname,
  119. "phone": _p_dealer.username,
  120. "isActive": _share.isActive,
  121. "ratio": _share.ratio,
  122. "payElecFee": _share.payElecFee,
  123. "contracts": _share.contracts
  124. }
  125. partners.append(_data)
  126. return JsonOkResponse(payload={"partners": partners})
  127. @permission_required(ROLE.dealer, ROLE.subaccount)
  128. def updateGroupPartner(request):
  129. dealer = request.user.myBoss
  130. data = json.loads(request.body or "{}")
  131. groupId = data.get("groupId")
  132. partnerId = data.get("partnerId")
  133. ratio = data.get("ratio")
  134. payElecFee = data.get("payElecFee")
  135. isActive = data.get("isActive")
  136. contracts = data.get("contracts")
  137. partner = Partner.get_partner_by_dealer(str(dealer.id), partnerId)
  138. if not partner:
  139. return NoCommissionErrorResponse(u"合伙人变更失败(10001)")
  140. groupShare = partner.get_share_group(groupId)
  141. group = Group.get_group(groupId)
  142. # 新增的处理
  143. try:
  144. if not groupShare:
  145. partner.add_group_share(group, ratio, payElecFee, isActive, contracts)
  146. # 更新的处理
  147. else:
  148. partner.update_group_share(group, ratio, payElecFee, isActive, contracts)
  149. except ValueError as ve:
  150. return NoCommissionErrorResponse(description=ve.message)
  151. return JsonOkResponse()
  152. @permission_required(ROLE.dealer, ROLE.subaccount)
  153. def removeGroupPartner(request):
  154. """
  155. 移除合伙人
  156. """
  157. dealer = request.user.myBoss
  158. data = json.loads(request.body or "{}")
  159. groupId = data.get("groupId")
  160. partnerId = data.get("partnerId")
  161. group = Group.get_group(groupId) # type: GroupDict
  162. if group.ownerId != str(dealer.id):
  163. return JsonErrorResponse(description=u"移除合伙人失败(10001)")
  164. partner = Partner.get_partner_by_dealer(str(dealer.id), partnerId) # type: Partner
  165. if not partner:
  166. return JsonErrorResponse(description=u"移除合伙人失败(10002)")
  167. if partner.dealerId != str(dealer.id):
  168. return JsonErrorResponse(description=u"移除合伙人失败(10003)")
  169. partner.remove_group_share(group)
  170. return JsonOkResponse()
  171. @permission_required(ROLE.dealer, ROLE.subaccount)
  172. def uploadContract(request):
  173. image = request.FILES.get("file")
  174. fileSuffix = image.name.split(".")[1]
  175. if fileSuffix not in ["jpg", "jpeg", "png"]:
  176. return NoCommissionErrorResponse(description=u"图片类型错误,请上传指的的图片类型(jpg,jpeg,png)。")
  177. # 上传保存图片
  178. uploader = AliOssFileUploader(inputFile=image, uploadType="contract")
  179. try:
  180. outputUrl = uploader.upload()
  181. except InvalidFileSize as e:
  182. return JsonErrorResponse(description=e.message)
  183. except InvalidFileName as e:
  184. return JsonErrorResponse(description=e.message)
  185. payload = {
  186. "url": outputUrl
  187. }
  188. return JsonOkResponse(payload=payload)
  189. @permission_required(ROLE.dealer, ROLE.subaccount)
  190. def getLedgerExpected(request):
  191. """
  192. 获取经销商的分润预估收益
  193. """
  194. dealer = request.user.myBoss
  195. # 获取所有的分成地址信息
  196. groupIds = Group.get_group_ids_of_dealer(str(dealer.id))
  197. partnerGroupIds = Group.get_group_ids_of_partner(str(dealer.id))
  198. groupIds.extend(partnerGroupIds)
  199. # 获取今天的统计信息 并模拟出分润金额
  200. now = datetime.datetime.now()
  201. date = now.strftime(Const.DATE_FMT)
  202. stats = get_stats(date=date, groupIds=groupIds)
  203. statsValue = LedgerStatsCalculator(stats, dealer).calculate()
  204. return JsonOkResponse(payload=statsValue.as_dict())
  205. @permission_required(ROLE.dealer, ROLE.subaccount)
  206. def getLedgers(request):
  207. """
  208. 获取经销商的分润 实际已经发生的
  209. """
  210. dealer = request.user.myBoss
  211. start = request.GET.get("startTime")
  212. end = request.GET.get("endTime")
  213. groupId = request.GET.get("groupId")
  214. if not start:
  215. start = datetime.date.today()-datetime.timedelta(days=1)
  216. else:
  217. start = datetime.datetime.strptime(start, "%Y-%m-%d").date()
  218. if not end:
  219. end = datetime.date.today()-datetime.timedelta(days=1)
  220. else:
  221. end = datetime.datetime.strptime(end, "%Y-%m-%d").date()
  222. if start > end:
  223. return JsonErrorResponse(description=u"查询日期错误")
  224. dateInterval = (end - start).days + 1
  225. if dateInterval > 7:
  226. return JsonErrorResponse(description=u"单次查询记录最多7日")
  227. dates = []
  228. for _day in range(dateInterval):
  229. dates.append(start.strftime("%Y-%m-%d"))
  230. start += datetime.timedelta(days=1)
  231. if not groupId:
  232. groupIds = Group.get_group_ids_of_dealer(str(dealer.id))
  233. partnerGroupIds = Group.get_group_ids_of_partner(str(dealer.id))
  234. groupIds.extend(partnerGroupIds)
  235. else:
  236. groupIds = [groupId]
  237. dataList = list()
  238. for _date in dates[::-1]:
  239. _stats = get_stats(date=_date, groupIds=groupIds)
  240. _statsValue = LedgerStatsCalculator(_stats, dealer).calculate()
  241. _data = {"date": _date}
  242. _data.update(_statsValue.as_dict())
  243. dataList.append(_data)
  244. return JsonOkResponse(payload={"dataList": dataList})