暂无描述

tenancy_admin_views.py 14KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435
  1. # -*- coding: utf-8 -*-
  2. from __future__ import division
  3. import json
  4. from django.conf import settings
  5. from django.db import transaction
  6. from django.db.models import Q
  7. from django_logit import logit
  8. from django_response import response
  9. from paginator import pagination
  10. from TimeConvert import TimeConvert as tc
  11. from account.models import UserInfo
  12. from api.tenancy_views import tenancy_tracking_info_subscribe
  13. from kodo.decorators import check_admin
  14. from pre.custom_message import sendtemplatemessage
  15. from tenancy.models import TenancyShotInfo, TenancyShotRequestInfo
  16. from utils.error.errno_utils import TenancyStatusCode
  17. from utils.kuaidi.synquery import KuaiDi100
  18. WECHAT = settings.WECHAT
  19. @logit
  20. @check_admin
  21. def shot_list(request, administrator):
  22. page = request.POST.get('page', 1)
  23. num = request.POST.get('num', 20)
  24. tenancy_status = request.POST.get('tenancy_status', '')
  25. query = request.POST.get('query', '')
  26. model_id = request.POST.get('model_id', '')
  27. shots = TenancyShotInfo.objects.filter(status=True).order_by('-pk')
  28. if tenancy_status != '':
  29. shots = shots.filter(tenancy_status=tenancy_status)
  30. if model_id:
  31. shots = shots.filter(model_id=model_id)
  32. if query:
  33. shots = shots.filter(Q(sn__icontains=query))
  34. count = shots.count()
  35. shots = [shot.data for shot in shots]
  36. shots, left = pagination(shots, page, num)
  37. return response(data={
  38. 'shots': shots,
  39. 'left': left,
  40. 'count': count,
  41. })
  42. @logit
  43. @check_admin
  44. def shot_detail(request, administrator):
  45. shot_id = request.POST.get('shot_id', '')
  46. try:
  47. shot = TenancyShotInfo.objects.get(shot_id=shot_id, status=True)
  48. except TenancyShotInfo.DoesNotExist:
  49. return response(TenancyStatusCode.TENANCY_SHOT_NOT_FOUND)
  50. return response(data={
  51. 'shot': shot.data,
  52. })
  53. @logit
  54. @check_admin
  55. def shot_create(request, administrator):
  56. model_id = request.POST.get('model_id', '')
  57. model_name = request.POST.get('model_name', '')
  58. sn = request.POST.get('sn', '')
  59. tenancy_status = request.POST.get('tenancy_status', 0)
  60. shot = TenancyShotInfo.objects.create(
  61. model_id=model_id,
  62. model_name=model_name,
  63. sn=sn,
  64. )
  65. return response(data={
  66. 'shot': shot.data,
  67. })
  68. @logit
  69. @check_admin
  70. def shot_update(request, administrator):
  71. shot_id = request.POST.get('shot_id', '')
  72. model_id = request.POST.get('model_id', '')
  73. model_name = request.POST.get('model_name', '')
  74. sn = request.POST.get('sn', '')
  75. tenancy_status = request.POST.get('tenancy_status', 0)
  76. shot, _ = TenancyShotInfo.objects.update_or_create(shot_id=shot_id, defaults={
  77. 'model_id': model_id,
  78. 'model_name': model_name,
  79. 'sn': sn,
  80. 'tenancy_status': tenancy_status,
  81. })
  82. return response(data={
  83. 'shot': shot.data,
  84. })
  85. @logit
  86. @check_admin
  87. def shot_delete(request, administrator):
  88. shot_id = request.POST.get('shot_id', '')
  89. TenancyShotInfo.objects.filter(shot_id=shot_id).update(admin_id=administrator.admin_id, status=False)
  90. return response()
  91. @logit
  92. @check_admin
  93. def shot_request_list(request, administrator):
  94. page = request.POST.get('page', 1)
  95. num = request.POST.get('num', 20)
  96. query = request.POST.get('query', '')
  97. model_id = request.POST.get('model_id', '')
  98. target_admin_id = request.POST.get('target_admin_id', '')
  99. start_time = request.POST.get('start_time', '')
  100. end_time = request.POST.get('end_time', '')
  101. request_status = request.POST.get('request_status', 'all')
  102. reqs = TenancyShotRequestInfo.objects.filter(status=True).order_by('-pk')
  103. if query:
  104. shots = list(TenancyShotInfo.objects.values_list('shot_id', flat=True).filter(sn__icontains=query))
  105. reqs = reqs.filter(Q(phone__icontains=query) | Q(name__icontains=query) | Q(shot_id__in=shots))
  106. if model_id:
  107. reqs = reqs.filter(model_id=model_id)
  108. if target_admin_id:
  109. reqs = reqs.filter(admin_id=target_admin_id)
  110. if request_status != 'all':
  111. reqs = reqs.filter(request_status=request_status)
  112. if start_time and end_time:
  113. start_time = tc.string_to_utc_datetime(start_time, format='%Y%m%d')
  114. end_time = tc.string_to_utc_datetime(end_time + ' 23:59:59', format='%Y%m%d %H:%M:%S')
  115. reqs = reqs.filter(created_at__range=(start_time, end_time))
  116. count = reqs.count()
  117. reqs = [req.admindata for req in reqs]
  118. reqs, left = pagination(reqs, page, num)
  119. return response(data={
  120. 'reqs': reqs,
  121. 'left': left,
  122. 'count': count,
  123. })
  124. @logit
  125. @check_admin
  126. def shot_request_detail(request, administrator):
  127. req_id = request.POST.get('req_id') or request.POST.get('request_id')
  128. try:
  129. req = TenancyShotRequestInfo.objects.get(request_id=req_id, status=True)
  130. except TenancyShotRequestInfo.DoesNotExist:
  131. return response(TenancyStatusCode.TENANCY_SHOT_REQUEST_NOT_FOUND)
  132. return response(data={
  133. 'req': req.admindata,
  134. })
  135. @logit
  136. @check_admin
  137. @transaction.atomic
  138. def shot_request_update(request, administrator):
  139. req_id = request.POST.get('req_id') or request.POST.get('request_id')
  140. shot_id = request.POST.get('shot_id', '')
  141. name = request.POST.get('name', '')
  142. phone = request.POST.get('phone', '')
  143. postcode = request.POST.get('postcode', '')
  144. location = request.POST.get('location', '')
  145. purpose = request.POST.get('purpose', '')
  146. return_date = request.POST.get('return_date', '')
  147. request_status = request.POST.get('request_status', '')
  148. express_name = request.POST.get('express_name', '')
  149. express_com = request.POST.get('express_com', '')
  150. tracking_number = request.POST.get('tracking_number', '')
  151. back_express_name = request.POST.get('back_express_name', '')
  152. back_express_com = request.POST.get('back_express_com', '')
  153. back_tracking_number = request.POST.get('back_tracking_number', '')
  154. remark = request.POST.get('remark', '')
  155. try:
  156. req = TenancyShotRequestInfo.objects.select_for_update().get(request_id=req_id, status=True)
  157. except TenancyShotRequestInfo.DoesNotExist:
  158. return response(TenancyStatusCode.TENANCY_SHOT_REQUEST_NOT_FOUND)
  159. old_tracking_number = req.tracking_number
  160. old_back_tracking_number = req.back_tracking_number
  161. if req.admin_id and req.admin_id != administrator.admin_id:
  162. return response(40001, 'No permission', '不是经办人,没有权限')
  163. if shot_id:
  164. req.shot_id = shot_id
  165. if name:
  166. req.name = name
  167. if phone:
  168. req.phone = phone
  169. if postcode:
  170. req.postcode = postcode
  171. if location:
  172. req.location = location
  173. if purpose:
  174. req.purpose = purpose
  175. if return_date:
  176. req.return_date = tc.to_date(return_date)
  177. if request_status:
  178. req.request_status = request_status
  179. if express_name:
  180. req.express_name = express_name
  181. if express_com:
  182. req.express_com = express_com
  183. if tracking_number:
  184. req.tracking_number = tracking_number
  185. if back_express_name:
  186. req.back_express_name = back_express_name
  187. if back_express_com:
  188. req.back_express_com = back_express_com
  189. if back_tracking_number:
  190. req.back_tracking_number = back_tracking_number
  191. if remark:
  192. req.remark = remark
  193. req.save()
  194. if tracking_number and tracking_number != old_tracking_number:
  195. tenancy_tracking_info_subscribe(req, 'tracking')
  196. if back_tracking_number and back_tracking_number != old_back_tracking_number:
  197. tenancy_tracking_info_subscribe(req, 'back_tracking')
  198. return response(data={
  199. 'req': req.admindata,
  200. })
  201. @logit
  202. @check_admin
  203. @transaction.atomic
  204. def shot_request_audit(request, administrator):
  205. req_id = request.POST.get('req_id') or request.POST.get('request_id')
  206. audit_status = request.POST.get('audit_status', 0)
  207. try:
  208. req = TenancyShotRequestInfo.objects.select_for_update().get(request_id=req_id, status=True)
  209. except TenancyShotRequestInfo.DoesNotExist:
  210. return response(TenancyStatusCode.TENANCY_SHOT_REQUEST_NOT_FOUND)
  211. req.audit_status = audit_status
  212. req.save()
  213. return response(data={
  214. 'req': req.admindata,
  215. })
  216. @logit
  217. @check_admin
  218. @transaction.atomic
  219. def shot_request_send(request, administrator):
  220. req_id = request.POST.get('req_id') or request.POST.get('request_id')
  221. express_name = request.POST.get('express_name', '')
  222. express_com = request.POST.get('express_com', '')
  223. tracking_number = request.POST.get('tracking_number', '')
  224. shot_id = request.POST.get('shot_id', '')
  225. front_cap_status = request.POST.get('front_cap_status', 0)
  226. rear_cap_status = request.POST.get('rear_cap_status', 0)
  227. lens_hood_status = request.POST.get('lens_hood_status', 0)
  228. tripod_ring_status = request.POST.get('tripod_ring_status', 0)
  229. appearance_performance_status = request.POST.get('appearance_performance_status', 0)
  230. try:
  231. req = TenancyShotRequestInfo.objects.select_for_update().get(request_id=req_id, status=True)
  232. except TenancyShotRequestInfo.DoesNotExist:
  233. return response(TenancyStatusCode.TENANCY_SHOT_REQUEST_NOT_FOUND)
  234. try:
  235. shot = TenancyShotInfo.objects.get(shot_id=shot_id, status=True)
  236. except TenancyShotInfo.DoesNotExist:
  237. return response()
  238. if req.admin_id and req.admin_id != administrator.admin_id:
  239. return response(40001, 'No permission', '不是经办人,没有权限')
  240. old_tracking_number = req.tracking_number
  241. req.admin_id = administrator.admin_id
  242. req.express_name = express_name
  243. req.express_com = express_com
  244. req.tracking_number = tracking_number
  245. req.shot_id = shot_id
  246. req.front_cap_status = front_cap_status
  247. req.rear_cap_status = rear_cap_status
  248. req.lens_hood_status = lens_hood_status
  249. req.tripod_ring_status = tripod_ring_status
  250. req.appearance_performance_status = appearance_performance_status
  251. req.request_status = TenancyShotRequestInfo.TENANCY_TRACKING_SEND
  252. request_status_at = req.request_status_at
  253. request_status_at[TenancyShotRequestInfo.TENANCY_TRACKING_SEND] = tc.utc_string()
  254. req.request_status_at = request_status_at
  255. req.save()
  256. shot.front_cap_status = front_cap_status
  257. shot.rear_cap_status = rear_cap_status
  258. shot.lens_hood_status = lens_hood_status
  259. shot.tripod_ring_status = tripod_ring_status
  260. shot.appearance_performance_status = appearance_performance_status
  261. shot.tenancy_status = 1
  262. shot.save()
  263. try:
  264. user = UserInfo.objects.get(user_id=req.user_id)
  265. except UserInfo.DoesNotExist:
  266. return response()
  267. if tracking_number and tracking_number != old_tracking_number:
  268. tenancy_tracking_info_subscribe(req, 'tracking')
  269. data = {
  270. "first": {
  271. "value": u'镜头租用申请已通过',
  272. "color": "#173177"
  273. },
  274. "thing2": {
  275. "value": req.name,
  276. "color": "#173177"
  277. },
  278. "character_string3": {
  279. "value": shot.data['model_info']['model_name'],
  280. "color": "#173177"
  281. },
  282. "character_string4": {
  283. "value": shot.sn,
  284. "color": "#173177"
  285. },
  286. "remark": {
  287. "value": u'快递已寄出,请注意查收~~~',
  288. "color": "#173177"
  289. }
  290. }
  291. wxcfg = WECHAT.get('MINIAPP', {})
  292. appid = wxcfg.get('appID')
  293. sendtemplatemessage(openid=user.openid, template_id=settings.TEMPLATE_ID_TENANCY, data=data, miniappid=appid, minipagepath='/pages/member/mine/mine?page={}&request_id={}'.format('rentLensPage', req.request_id))
  294. return response(data={
  295. 'req': req.admindata,
  296. })
  297. @logit
  298. @check_admin
  299. @transaction.atomic
  300. def shot_request_signed(request, administrator):
  301. req_id = request.POST.get('req_id') or request.POST.get('request_id')
  302. try:
  303. req = TenancyShotRequestInfo.objects.select_for_update().get(request_id=req_id, status=True)
  304. except TenancyShotRequestInfo.DoesNotExist:
  305. return response(TenancyStatusCode.TENANCY_SHOT_REQUEST_NOT_FOUND)
  306. if req.admin_id and req.admin_id != administrator.admin_id:
  307. return response(40001, 'No permission', '不是经办人,没有权限')
  308. req.request_status = TenancyShotRequestInfo.TENANCY_TRACKING_BACK_SIGNED
  309. request_status_at = req.request_status_at
  310. request_status_at[TenancyShotRequestInfo.TENANCY_TRACKING_BACK_SIGNED] = tc.utc_string()
  311. req.request_status_at = request_status_at
  312. req.save()
  313. TenancyShotInfo.objects.filter(shot_id=req.shot_id).update(tenancy_status=0)
  314. return response(data={
  315. 'req': req.admindata,
  316. })
  317. @logit
  318. @check_admin
  319. def shot_request_tracking_info(request, administrator):
  320. request_id = request.POST.get('request_id', '')
  321. type_ = request.POST.get('type', 'tracking') # tracking / back_tracking
  322. try:
  323. req = TenancyShotRequestInfo.objects.get(request_id=request_id, status=True)
  324. except TenancyShotRequestInfo.DoesNotExist:
  325. return response(TenancyStatusCode.TENANCY_SHOT_REQUEST_NOT_FOUND)
  326. tracking_info = {}
  327. if type_ == 'tracking':
  328. if req.express_com and req.tracking_number:
  329. tracking_info = get_tracking_info(req.express_com, req.tracking_number, req.phone)
  330. req.tracking_info = tracking_info
  331. req.save()
  332. else:
  333. if req.back_express_com and req.back_tracking_number:
  334. tracking_info = get_tracking_info(req.back_express_com, req.back_tracking_number, req.phone)
  335. req.back_tracking_info = tracking_info
  336. req.save()
  337. if tracking_info:
  338. tenancy_tracking_info_subscribe(req, type_)
  339. return response(data={
  340. 'type': type_,
  341. 'tracking_info': tracking_info,
  342. })
  343. def get_tracking_info(express_com, tracking_number, phone):
  344. tracking_info = KuaiDi100().track(express_com, tracking_number, phone=phone)
  345. if tracking_info:
  346. try:
  347. tracking_info = json.loads(tracking_info)
  348. except Exception:
  349. tracking_info = {}
  350. return tracking_info