views.py 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556
  1. #coding=utf-8
  2. import traceback
  3. import json
  4. from django.utils import timezone
  5. from libs import utils
  6. from libs.http import JSONError, JSONResponse,DataGridJSONResponse
  7. from apps.account.decorators import token_required
  8. from django.contrib.auth.decorators import login_required
  9. from django.db import transaction, IntegrityError
  10. from apps.exceptions import CustomError
  11. from apps.foundation.models import BizLog
  12. from django.db.models import Q, Sum
  13. from django.conf import settings
  14. from .models import *
  15. from .serializers import *
  16. from .filters import *
  17. from apps.customer.models import Customer
  18. from apps.account.models import Branch
  19. from apps.WechatApplet.models import WechatApplet
  20. from .base import OrderUpdate
  21. from util.format import Formater
  22. from util.file_operation import PathAndRename, resizePicture, UploadFile, DeleteFile
  23. from django.http import JsonResponse as DJR
  24. @token_required
  25. @login_required()
  26. def branch_list(request):
  27. f = BranchFilter(request.GET, queryset=Branch.objects.filter())
  28. rows, total = utils.get_page_data(request, f.qs)
  29. serializer = BranchSerializer(rows, many=True)
  30. return DataGridJSONResponse(serializer.data, total)
  31. @token_required
  32. @login_required()
  33. def branch_save(request):
  34. id = request.GET.get('id')
  35. data = json.loads(request.body)
  36. try:
  37. with transaction.atomic():
  38. serializer = BranchSerializer.factory(request.user, data, id)
  39. serializer.validSave()
  40. return JSONResponse(serializer.data)
  41. except CustomError as e:
  42. return JSONError(e.get_error_msg())
  43. except Exception as e:
  44. traceback.print_exc()
  45. return JSONError(u'保存失败!')
  46. @token_required
  47. @login_required()
  48. def self_branch(request):
  49. order = Branch.objects.filter(id=request.user.branch_id).first()
  50. data = {}
  51. if order:
  52. data = {'name': order.name, 'tel': order.tel, 'address': order.address}
  53. return JSONResponse({'data': data})
  54. @token_required
  55. @login_required()
  56. def member_list(request):
  57. f = CustomerFilter(request.GET, queryset=Customer.objects.filter(branch=request.user.branch))
  58. rows, total = utils.get_page_data(request, f.qs)
  59. serializer = CustomerSerializer(rows, many=True)
  60. return DataGridJSONResponse(serializer.data, total)
  61. @token_required
  62. @login_required()
  63. def member_coupon_list(request):
  64. f = MemberCouponFilter(request.GET, queryset=MemberCoupon.objects.filter(member__branch=request.user.branch))
  65. rows, total = utils.get_page_data(request, f.qs)
  66. serializer = MemberCouponSerializer(rows, many=True)
  67. return DataGridJSONResponse(serializer.data, total)
  68. @token_required
  69. @login_required()
  70. def coupon_write_off(request):
  71. id = request.GET.get('id')
  72. try:
  73. with transaction.atomic():
  74. instance = MemberCoupon.getById(id)
  75. if instance.member.branch and instance.member.branch_id != request.user.branch_id:
  76. raise CustomError(u'禁止跨店操作!')
  77. instance.writeOff()
  78. BizLog.objects.addnew(request.user, BizLog.CHECK, u"核销会员优惠券,id=%d" % instance.id)
  79. except CustomError as e:
  80. return JSONError(e.get_error_msg())
  81. except Exception as e:
  82. traceback.print_exc()
  83. return JSONError(u'核销失败!')
  84. return JSONResponse()
  85. @token_required
  86. @login_required()
  87. def coupon_cancel_write_off(request):
  88. id = request.GET.get('id')
  89. try:
  90. with transaction.atomic():
  91. instance = MemberCoupon.getById(id)
  92. if instance.member.branch and instance.member.branch_id != request.user.branch_id:
  93. raise CustomError(u'禁止跨店操作!')
  94. instance.cancelWriteOff()
  95. BizLog.objects.addnew(request.user, BizLog.CHECK, u"撤销核销会员优惠券,id=%d" % instance.id)
  96. except CustomError as e:
  97. return JSONError(e.get_error_msg())
  98. except Exception as e:
  99. traceback.print_exc()
  100. return JSONError(u'撤销核销失败!')
  101. return JSONResponse()
  102. @token_required
  103. @login_required()
  104. def order_list(request):
  105. OrderUpdate.update_status()
  106. if request.user.is_superuser:
  107. rows = Order.objects.filter()
  108. else:
  109. rows = Order.objects.filter(branch=request.user.branch)
  110. f = OrderFilter(request.GET, queryset=rows)
  111. rows_sum = f.qs.aggregate(
  112. sum_rebate=Sum('rebate'),
  113. sum_amount=Sum('amount')
  114. )
  115. more = {
  116. 'sum_amount':Formater.formatPriceShow(rows_sum['sum_amount']),
  117. 'sum_rebate':Formater.formatPriceShow(rows_sum['sum_rebate']),
  118. }
  119. rows, total = utils.get_page_data(request, f.qs)
  120. serializer = OrderSerializer(rows, many=True)
  121. return DataGridJSONResponse(serializer.data, total, more)
  122. @token_required
  123. @login_required()
  124. def order_split_account(request):
  125. id = request.GET.get('id')
  126. try:
  127. order = Order.objects.filter(id=id).first()
  128. app = WechatApplet.objects.filter().first()
  129. if not app:
  130. raise CustomError(u'未设置小程序信息!')
  131. if not order:
  132. raise CustomError(u'未找到相应的订单')
  133. if not order.pay or order.pay.status != Pay.CONFIRM:
  134. raise CustomError(u'该订单尚未支付,无法分账!')
  135. with transaction.atomic():
  136. if not order.splitaccount:
  137. if (order.rebate <= 0) or (not order.recommend_member) or (order.pay.profit_sharing == "N"):
  138. raise CustomError(u'该订单无需分账!')
  139. sp, spd, spr = SplitAccount._addnew(order.branch, order.id, order.rebate, order.recommend_member)
  140. order.splitaccount = sp
  141. order.save()
  142. sp = order.splitaccount
  143. spd = SplitAccountDetail.objects.filter(main=sp).first()
  144. if not spd:
  145. raise CustomError(u'未找到相应的分账明细!')
  146. if spd.status == SplitAccountDetail.SUCCESS:
  147. raise CustomError(u'该订单已分账,禁止重复申请!')
  148. order.splitaccount.handSplitAccont(spd, order.pay, app)
  149. BizLog.objects.addnew(request.user, BizLog.INSERT, u"订单申请分账,id=%d" % order.id)
  150. except CustomError as e:
  151. return JSONError(e.get_error_msg())
  152. except Exception as e:
  153. traceback.print_exc()
  154. return JSONError(u'订单分账申请失败!')
  155. return JSONResponse()
  156. @token_required
  157. @login_required()
  158. def order_update_split(request):
  159. id = request.GET.get('id')
  160. try:
  161. order = Order.objects.filter(id=id).first()
  162. app = WechatApplet.objects.filter().first()
  163. if not app:
  164. raise CustomError(u'未设置小程序信息!')
  165. if not order:
  166. raise CustomError(u'未找到相应的订单!')
  167. if not order.splitaccount:
  168. raise CustomError(u'未找到该订单分账信息!')
  169. sp = order.splitaccount
  170. spd = SplitAccountDetail.objects.filter(main=sp).first()
  171. if not spd:
  172. raise CustomError(u'未找到相应的分账明细!')
  173. with transaction.atomic():
  174. order.splitaccount.updateAccountSplit(spd, order.pay, app)
  175. BizLog.objects.addnew(request.user, BizLog.INSERT, u"刷新订单分账结果,id=%d" % order.id)
  176. except CustomError as e:
  177. return JSONError(e.get_error_msg())
  178. except Exception as e:
  179. traceback.print_exc()
  180. return JSONError(u'刷新订单分账结果失败!')
  181. return JSONResponse()
  182. @token_required
  183. @login_required()
  184. def coupon_list(request):
  185. f = BranchFilter(request.GET, queryset=Coupon.objects.filter(branch=request.user.branch))
  186. rows, total = utils.get_page_data(request, f.qs)
  187. serializer = CouponSerializer(rows, many=True)
  188. return DataGridJSONResponse(serializer.data, total)
  189. @token_required
  190. @login_required()
  191. def coupon_save(request):
  192. id = request.GET.get('id')
  193. data = json.loads(request.body)
  194. try:
  195. with transaction.atomic():
  196. data['branch'] = request.user.branch_id
  197. serializer = CouponSerializer.factory(request.user, data, id)
  198. serializer.validSave()
  199. return JSONResponse(serializer.data)
  200. except CustomError as e:
  201. return JSONError(e.get_error_msg())
  202. except Exception as e:
  203. traceback.print_exc()
  204. return JSONError(u'保存失败!')
  205. @token_required
  206. @login_required()
  207. def coupon_dict(request):
  208. rows = Coupon.objects.filter(
  209. Q(branch=request.user.branch, enabled=True) &
  210. Q(
  211. Q(end_date__isnull=False) & Q(end_date__gt=timezone.now().date()) |
  212. Q(end_date__isnull=True)
  213. )
  214. )
  215. serializer = CouponComboboxSerializer(rows, many=True)
  216. return DataGridJSONResponse(serializer.data, rows.count())
  217. @token_required
  218. @login_required()
  219. def activity_list(request):
  220. if request.user.is_superuser:
  221. rows = Activity.objects.filter(delete=False)
  222. else:
  223. rows = Activity.objects.filter(branch_id=request.user.branch_id, delete=False)
  224. f = ActivityFilter(request.GET, queryset=rows)
  225. rows, total = utils.get_page_data(request, f.qs)
  226. serializer = ActivitySerializer(rows, many=True)
  227. return DataGridJSONResponse(serializer.data, total)
  228. @token_required
  229. @login_required()
  230. def activity_details(request):
  231. if request.user.is_superuser:
  232. rows = ActivityDetails.objects.filter(delete=False)
  233. else:
  234. rows = ActivityDetails.objects.filter(main__branch_id=request.user.branch_id, delete=False)
  235. f = ActivityDetailsFilter(request.GET, queryset=rows)
  236. serializer = ActivityDetailsSerializer(f.qs, many=True)
  237. return DataGridJSONResponse(serializer.data, len(serializer.data))
  238. @token_required
  239. @login_required()
  240. def activity_detail_list(request):
  241. if request.user.is_superuser:
  242. rows = ActivityDetails.objects.filter(delete=False)
  243. else:
  244. rows = ActivityDetails.objects.filter(main__branch_id=request.user.branch_id, delete=False)
  245. f = ActivityDetailsFilter(request.GET, queryset=rows)
  246. rows, total = utils.get_page_data(request, f.qs)
  247. serializer = ActivityDetailsSerializer(rows, many=True)
  248. return DataGridJSONResponse(serializer.data, total)
  249. @token_required
  250. @login_required()
  251. def activity_coupon_list(request):
  252. if request.user.is_superuser:
  253. rows = ActivityCoupon.objects.filter(coupon__enabled=True)
  254. else:
  255. rows = ActivityCoupon.objects.filter(coupon__branch_id=request.user.branch_id, coupon__enabled=True)
  256. f = ActivityCouponFilter(request.GET, queryset=rows)
  257. rows, total = utils.get_page_data(request, f.qs)
  258. serializer = ActivityCouponSerializer(rows, many=True)
  259. return DataGridJSONResponse(serializer.data, total)
  260. @token_required
  261. @login_required()
  262. def activity_save(request):
  263. #id = request.GET.get('id')
  264. items = json.loads(request.POST.get('items'))
  265. production_data = json.loads(request.POST.get('production'))
  266. try:
  267. with transaction.atomic():
  268. production_data['branch'] = request.user.branch_id
  269. serializer = ActivitySerializer.factory(request.user, production_data)
  270. order = serializer.validSave()
  271. for item in items:
  272. if float(item['amount']) * 0.3 < float(item['rebate']):
  273. raise CustomError(u"项目[%s]返利不得超过价格的30%" % item['name'])
  274. item['main'] = order.id
  275. production = ActivityDetailsSerializer.factory(request.user, data=item)
  276. production.validSave()
  277. return JSONResponse(serializer.data)
  278. except CustomError as e:
  279. return JSONError(e.get_error_msg())
  280. except Exception as e:
  281. traceback.print_exc()
  282. return JSONError(u'保存失败!')
  283. @token_required
  284. @login_required()
  285. def activity_edit(request):
  286. id = request.GET.get('id')
  287. items = json.loads(request.POST.get('items'))
  288. production_data = json.loads(request.POST.get('production'))
  289. try:
  290. with transaction.atomic():
  291. production_data['branch'] = request.user.branch_id
  292. serializer = ActivitySerializer.factory(request.user, production_data, id)
  293. order = serializer.validSave()
  294. edit_ids = []
  295. exist_rows = ActivityDetails.objects.filter(main_id=order.id, delete=False).values('id')
  296. exist_ids = [exist_row['id'] for exist_row in exist_rows]
  297. for item in items:
  298. if float(item['amount']) * 0.3 < float(item['rebate']):
  299. raise CustomError(u"项目[%s]返利不得超过价格的30%" % item['name'])
  300. if item['id']:
  301. edit_ids.append(item['id'])
  302. item['main'] = order.id
  303. production = ActivityDetailsSerializer.factory(request.user, data=item)
  304. production.validSave()
  305. ActivityDetails.objects.filter(Q(main_id=order.id, id__in=exist_ids), ~Q(id__in=edit_ids)).update(delete=True)
  306. return JSONResponse(serializer.data)
  307. except CustomError as e:
  308. return JSONError(e.get_error_msg())
  309. except Exception as e:
  310. traceback.print_exc()
  311. return JSONError(u'保存失败!')
  312. @token_required
  313. @login_required()
  314. def activity_delete(request):
  315. id = request.GET.get('id')
  316. try:
  317. with transaction.atomic():
  318. order = Activity.objects.filter(id=id).first()
  319. if order.check_status == settings.PASS:
  320. raise CustomError(u'该活动已审核')
  321. order.delete = True
  322. order.save()
  323. BizLog.objects.addnew(request.user, BizLog.INSERT, u"删除活动[%s],id=%s" % (order.title, order.id))
  324. return JSONResponse({})
  325. except CustomError as e:
  326. return JSONError(e.get_error_msg())
  327. except Exception as e:
  328. traceback.print_exc()
  329. return JSONError(u'保存失败!')
  330. @token_required
  331. @login_required()
  332. def activity_check(request):
  333. id = request.GET.get('id')
  334. status = request.GET.get('status')
  335. try:
  336. with transaction.atomic():
  337. order = Activity.objects.filter(id=id).first()
  338. if order.delete:
  339. raise CustomError(u'该活动已删除')
  340. if order.check_status == int(status):
  341. raise CustomError(u'该活动已当前状态不允许执行此操作')
  342. if int(status) == settings.PASS:
  343. order.check_status = settings.PASS
  344. order.save()
  345. BizLog.objects.addnew(request.user, BizLog.INSERT, u"审核活动[%s],id=%s" % (order.title, order.id))
  346. else:
  347. order.check_status = settings.DEFAULT
  348. order.save()
  349. BizLog.objects.addnew(request.user, BizLog.INSERT, u"活动撤销审核[%s],id=%s" % (order.title, order.id))
  350. return JSONResponse({})
  351. except CustomError as e:
  352. return JSONError(e.get_error_msg())
  353. except Exception as e:
  354. traceback.print_exc()
  355. return JSONError(u'保存失败!')
  356. @token_required
  357. @login_required()
  358. def activity_signs_save(request):
  359. id = request.GET.get('id')
  360. signs = request.POST.get('signs')
  361. try:
  362. with transaction.atomic():
  363. signs = json.loads(signs)
  364. order = Activity.objects.filter(id=id).first()
  365. if order.delete:
  366. raise CustomError(u'该活动已删除')
  367. save_sign = ''
  368. for sign in signs:
  369. save_sign += sign + ','
  370. order.required_signs = save_sign
  371. order.save()
  372. BizLog.objects.addnew(request.user, BizLog.INSERT, u"活动设置必填项[%s],id=%s" % (order.title, order.id),signs )
  373. return JSONResponse({})
  374. except CustomError as e:
  375. return JSONError(e.get_error_msg())
  376. except Exception as e:
  377. traceback.print_exc()
  378. return JSONError(u'保存失败!')
  379. @token_required
  380. @login_required()
  381. def activity_coupon_save(request):
  382. id = request.GET.get('id')
  383. coupon_ids = request.POST.get('coupons')
  384. try:
  385. with transaction.atomic():
  386. coupons = json.loads(coupon_ids)
  387. order = ActivityDetails.objects.filter(id=id).first()
  388. if order.delete:
  389. raise CustomError(u'该活动已删除')
  390. ActivityCoupon.objects.filter(main=order).delete()
  391. for coupon in coupons:
  392. ActivityCoupon.objects.create(
  393. main=order,
  394. coupon_id=coupon
  395. )
  396. BizLog.objects.addnew(request.user, BizLog.INSERT, u"活动添加优惠券[%s],项目[%s],id=%s" % (order.main.title, order.name, order.id),coupon_ids )
  397. return JSONResponse({})
  398. except CustomError as e:
  399. return JSONError(e.get_error_msg())
  400. except Exception as e:
  401. traceback.print_exc()
  402. return JSONError(u'保存失败!')
  403. @token_required
  404. @login_required()
  405. def activity_code(request):
  406. id = request.GET.get('id')
  407. try:
  408. with transaction.atomic():
  409. order = Activity.getById1(id)
  410. if order.delete:
  411. raise CustomError(u'该活动已删除')
  412. if not order.wxapp_img:
  413. app = WechatApplet.objects.filter().first()
  414. wxCode = app.generateActivityWXappCode(order.id)
  415. order.wxapp_img = settings.MEDIA_URL + wxCode
  416. order.save()
  417. return JSONResponse({'data': order.wxapp_img})
  418. except CustomError as e:
  419. return JSONError(e.get_error_msg())
  420. except Exception as e:
  421. traceback.print_exc()
  422. return JSONError(u'获取失败!')
  423. # def ueditor_image(request):
  424. # try:
  425. # upload_path = PathAndRename("upload/")
  426. #
  427. # data = {}
  428. # if request.FILES.getlist('upfile'):
  429. # document = request.FILES.getlist('upfile')[0]
  430. # type = document.name.split('.')[-1]
  431. # name = timezone.now().strftime('%Y%m%d%H%M%S%f')
  432. # filename = "%s-%s.%s" % (
  433. # upload_path.path, name, type)
  434. # filename = filename.lower()
  435. # full_filename = "%s/%s" % (settings.MEDIA_ROOT, filename)
  436. # with open(full_filename, 'wb+') as destination:
  437. # for chunk in document.chunks():
  438. # destination.write(chunk)
  439. #
  440. # resizePicture(full_filename, 500)
  441. # data = {
  442. # "state": "SUCCESS",
  443. # "original": "%s.%s" % (name, type),
  444. # "title": "%s.%s" % (name, type),
  445. # "url": 'https://jpm.zzly.vip' + settings.MEDIA_URL + filename
  446. # }
  447. # return DJR(data, safe=False)
  448. # except CustomError as e:
  449. # return JSONError(e.get_error_msg())
  450. # except Exception as e:
  451. # traceback.print_exc()
  452. # return JSONError(u'图片上传失败!')
  453. @token_required
  454. @login_required()
  455. def upload_image(request):
  456. id = request.GET.get('id')
  457. poster = request.FILES.get('image', None)
  458. try:
  459. if not poster:
  460. raise CustomError(u'未找到上传文件!')
  461. activity = Activity.getById1(id)
  462. if activity.delete:
  463. raise CustomError(u'该活动已删除')
  464. with transaction.atomic():
  465. filename = UploadFile(poster, "upload/", width=500)
  466. if activity.pic:
  467. DeleteFile(activity.pic)
  468. activity.pic = filename
  469. activity.save()
  470. return JSONResponse({})
  471. except CustomError as e:
  472. return JSONError(e.get_error_msg())
  473. except Exception as e:
  474. traceback.print_exc()
  475. return JSONError(u'上传失败!')