暂无描述

maintenance_views.py 13KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372
  1. # -*- coding: utf-8 -*-
  2. from __future__ import division
  3. import json
  4. from datetime import datetime
  5. from django.conf import settings
  6. from django.db.models.query_utils 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 maintenance.models import ExpressCompanyInfo, MaintenaceInfo
  13. from pre.custom_message import sendtemplatemessage
  14. from utils.admin_utils import is_admin, is_maintenanceman
  15. from utils.error.errno_utils import MaintenanceStatusCode
  16. from utils.kuaidi.subscribe import KuaiDi100 as KuaiDi100Subscribe
  17. from utils.kuaidi.synquery import KuaiDi100
  18. WECHAT = settings.WECHAT
  19. @logit
  20. def maintenance_add(request):
  21. user_id = request.POST.get('user_id', '')
  22. name = request.POST.get('name', '')
  23. phone = request.POST.get('phone', '')
  24. address = request.POST.get('address', '')
  25. model_id = request.POST.get('model_id', '')
  26. log_id = request.POST.get('log_id', '')
  27. sn = request.POST.get('sn', '')
  28. desc = request.POST.get('desc', '')
  29. point_id = request.POST.get('point_id', '')
  30. point_name = request.POST.get('point_name', '')
  31. express_name = request.POST.get('express_name', '')
  32. tracking_number = request.POST.get('tracking_number', '')
  33. maintenance_status = request.POST.get('maintenance_status', MaintenaceInfo.TRACKING_TO_DESPATCH)
  34. try:
  35. company = ExpressCompanyInfo.objects.get(name=express_name, status=True)
  36. except ExpressCompanyInfo.DoesNotExist:
  37. company = None
  38. maintenance = MaintenaceInfo.objects.create(
  39. user_id=user_id,
  40. name=name,
  41. phone=phone,
  42. address=address,
  43. model_id=model_id,
  44. log_id=log_id,
  45. sn=sn,
  46. desc=desc,
  47. point_id=point_id,
  48. point_name=point_name,
  49. express_name=express_name,
  50. express_com=company.com if company else '',
  51. tracking_number=tracking_number,
  52. maintenance_status=maintenance_status,
  53. maintenance_status_at={maintenance_status: tc.utc_datetime()}
  54. )
  55. maintenance_tracking_info_subscribe(maintenance, 'tracking')
  56. return response(data={
  57. 'maintenance_id': maintenance.id,
  58. })
  59. @logit
  60. def maintenance_delete(request):
  61. brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
  62. maintenance_id = request.POST.get('maintenance_id', '')
  63. user_id = request.POST.get('user_id', '')
  64. try:
  65. maintenance = MaintenaceInfo.objects.get(id=maintenance_id, status=True)
  66. except MaintenaceInfo.DoesNotExist:
  67. return response(MaintenanceStatusCode.MAINTENACE_NOT_FOUND)
  68. if user_id != maintenance.user_id and not is_maintenanceman(brand_id, user_id):
  69. return response(MaintenanceStatusCode.MAINTENACE_PERMISSION_DENIED)
  70. maintenance.status = False
  71. maintenance.save()
  72. return response()
  73. @logit
  74. def maintenance_update(request):
  75. brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
  76. maintenance_id = request.POST.get('maintenance_id', '')
  77. admin_id = request.POST.get('admin_id', '')
  78. user_id = request.POST.get('user_id', '')
  79. name = request.POST.get('name', '')
  80. phone = request.POST.get('phone', '')
  81. address = request.POST.get('address', '')
  82. sn = request.POST.get('sn', '')
  83. desc = request.POST.get('desc', '')
  84. point_id = request.POST.get('point_id', '')
  85. point_name = request.POST.get('point_name', '')
  86. express_name = request.POST.get('express_name', '')
  87. tracking_number = request.POST.get('tracking_number', '')
  88. back_express_name = request.POST.get('back_express_name', '')
  89. back_tracking_number = request.POST.get('back_tracking_number', '')
  90. maintenance_status = request.POST.get('maintenance_status', MaintenaceInfo.TRACKING_TO_DESPATCH)
  91. try:
  92. maintenance = MaintenaceInfo.objects.get(id=maintenance_id, status=True)
  93. except MaintenaceInfo.DoesNotExist:
  94. return response(MaintenanceStatusCode.MAINTENACE_NOT_FOUND)
  95. if user_id != maintenance.user_id and not is_admin(brand_id, admin_id):
  96. return response(MaintenanceStatusCode.MAINTENACE_PERMISSION_DENIED)
  97. old_tracking_number = maintenance.tracking_number
  98. old_back_tracking_number = maintenance.back_tracking_number
  99. old_maintenance_status = maintenance.maintenance_status
  100. # 新增 `back_tracking_number` 之后,更新维修状态
  101. if not old_back_tracking_number and back_tracking_number:
  102. maintenance_status = MaintenaceInfo.TRACKING_FIXED_BACK
  103. if name:
  104. maintenance.name = name
  105. if phone:
  106. maintenance.phone = phone
  107. if address:
  108. maintenance.address = address
  109. if sn:
  110. maintenance.sn = sn
  111. if desc:
  112. maintenance.desc = desc
  113. if point_id:
  114. maintenance.point_id = point_id
  115. if point_name:
  116. maintenance.point_name = point_name
  117. if express_name:
  118. try:
  119. company = ExpressCompanyInfo.objects.get(name=express_name, status=True)
  120. except ExpressCompanyInfo.DoesNotExist:
  121. company = None
  122. maintenance.express_name = express_name
  123. maintenance.express_com = company.com if company else ''
  124. if tracking_number:
  125. maintenance.tracking_number = tracking_number
  126. if back_express_name:
  127. try:
  128. company = ExpressCompanyInfo.objects.get(name=back_express_name, status=True)
  129. except ExpressCompanyInfo.DoesNotExist:
  130. company = None
  131. maintenance.back_express_name = back_express_name
  132. maintenance.back_express_com = company.com if company else ''
  133. if back_tracking_number:
  134. maintenance.back_tracking_number = back_tracking_number
  135. if maintenance_status:
  136. maintenance.maintenance_status = maintenance_status
  137. maintenance_status_at = maintenance.maintenance_status_at
  138. if maintenance_status not in maintenance_status_at:
  139. maintenance_status_at[maintenance_status] = tc.utc_datetime()
  140. maintenance.maintenance_status_at = maintenance_status_at
  141. maintenance.save()
  142. if tracking_number and tracking_number != old_tracking_number:
  143. maintenance_tracking_info_subscribe(maintenance, 'tracking')
  144. if back_tracking_number and back_tracking_number != old_back_tracking_number:
  145. maintenance_tracking_info_subscribe(maintenance, 'back_tracking')
  146. if maintenance_status != old_maintenance_status:
  147. maintenance_status_update_sendtemplatemessage(maintenance)
  148. return response()
  149. @logit
  150. def maintenance_list(request):
  151. brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
  152. admin_id = request.POST.get('admin_id', '')
  153. user_id = request.POST.get('user_id', '')
  154. page = request.POST.get('page', 1)
  155. num = request.POST.get('num', 20)
  156. query = request.POST.get('query', '')
  157. maintenance_status = request.POST.get('maintenance_status', 'all')
  158. start_time = request.POST.get('start_time', '')
  159. end_time = request.POST.get('end_time', '')
  160. maintenances = MaintenaceInfo.objects.filter(status=True)
  161. if not is_admin(brand_id, admin_id):
  162. maintenances = maintenances.filter(user_id=user_id)
  163. if start_time and end_time:
  164. start_time = datetime.strptime(start_time, '%Y%m%d')
  165. end_time = datetime.strptime(end_time + ' 23:59:59', '%Y%m%d %H:%M:%S')
  166. maintenances = maintenances.filter(created_at__range=(start_time, end_time))
  167. if query:
  168. maintenances = maintenances.filter(Q(phone=query) | Q(name__icontains=query) | Q(sn=query))
  169. if maintenance_status and not maintenance_status == 'all':
  170. maintenances = maintenances.filter(maintenance_status=maintenance_status)
  171. count = maintenances.count()
  172. maintenances = [maintenance.data for maintenance in maintenances]
  173. maintenances, left = pagination(maintenances, page, num)
  174. return response(data={
  175. 'maintenaces': maintenances,
  176. 'count': count,
  177. 'left': left,
  178. })
  179. @logit
  180. def maintenance_detail(request):
  181. maintenance_id = request.POST.get('maintenance_id', '')
  182. try:
  183. maintenance = MaintenaceInfo.objects.get(id=maintenance_id, status=True)
  184. except MaintenaceInfo.DoesNotExist:
  185. return response(MaintenanceStatusCode.MAINTENACE_NOT_FOUND)
  186. return response(data={
  187. 'maintenace': maintenance.data,
  188. })
  189. def maintenance_status_update_sendtemplatemessage(maintenance):
  190. try:
  191. user = UserInfo.objects.get(user_id=maintenance.user_id, status=True)
  192. except UserInfo.DoesNotExist:
  193. return
  194. # Send template_message
  195. # data = {
  196. # "first": {
  197. # "value": u'你的补码申请已通过,请点击消息绑定您的电子保修卡',
  198. # "color": "#173177"
  199. # },
  200. # "keyword1": {
  201. # "value": log.name,
  202. # "color": "#173177"
  203. # },
  204. # "keyword2": {
  205. # "value": log.model_name,
  206. # "color": "#173177"
  207. # },
  208. # "keyword3": {
  209. # "value": log.sn,
  210. # "color": "#173177"
  211. # },
  212. # "remark": {
  213. # "value": u'感谢您的使用',
  214. # "color": "#173177"
  215. # }
  216. # }
  217. #
  218. # wxcfg = WECHAT.get('MINIAPP', {})
  219. # appid = wxcfg.get('appID')
  220. #
  221. # sendtemplatemessage(openid=user.openid, template_id=settings.TEMPLATE_ID_COMPLEMENT, data=data, miniappid=appid, minipagepath='/pages/register/consumer/consumer?q={}&marketcode=1'.format(ciphertext))
  222. def is_maintenance_tracking_signed(tracking_info):
  223. if not tracking_info:
  224. return False
  225. items = tracking_info.get('data', [])
  226. if not items:
  227. return False
  228. return items[0].get('status') == u'签收'
  229. def maintenance_tracking_info_update(maintenance, type_, tracking_info):
  230. old_maintenance_status = maintenance.maintenance_status
  231. is_tracking_signed = is_maintenance_tracking_signed(tracking_info)
  232. if type_ == 'tracking':
  233. maintenance.tracking_info = tracking_info
  234. maintenance.tracking_signed = is_tracking_signed
  235. maintenance_status = MaintenaceInfo.TRACKING_SIGNED_FIXING
  236. else:
  237. maintenance.back_tracking_info = tracking_info
  238. maintenance.back_tracking_signed = is_tracking_signed
  239. maintenance_status = MaintenaceInfo.TRACKING_BACK_SIGNED
  240. maintenance.maintenance_status = maintenance_status
  241. maintenance_status_at = maintenance.maintenance_status_at
  242. if maintenance_status not in maintenance_status_at:
  243. maintenance_status_at[maintenance_status] = tc.utc_datetime()
  244. maintenance.maintenance_status_at = maintenance_status_at
  245. maintenance.save()
  246. if maintenance_status != old_maintenance_status:
  247. maintenance_status_update_sendtemplatemessage(maintenance)
  248. @logit
  249. def maintenance_tracking_info(request):
  250. maintenance_id = request.POST.get('maintenance_id', '')
  251. type_ = request.POST.get('type', 'tracking') # tracking / back_tracking
  252. try:
  253. maintenance = MaintenaceInfo.objects.get(id=maintenance_id, status=True)
  254. except MaintenaceInfo.DoesNotExist:
  255. return response(MaintenanceStatusCode.MAINTENACE_NOT_FOUND)
  256. tracking_info = {}
  257. if type_ == 'tracking':
  258. if maintenance.express_com and maintenance.tracking_number:
  259. tracking_info = KuaiDi100().track(maintenance.express_com, maintenance.tracking_number)
  260. else:
  261. if maintenance.back_express_com and maintenance.back_tracking_number:
  262. tracking_info = KuaiDi100().track(maintenance.back_express_com, maintenance.back_tracking_number)
  263. if tracking_info:
  264. try:
  265. tracking_info = json.loads(tracking_info)
  266. except Exception:
  267. tracking_info = {}
  268. if tracking_info:
  269. maintenance_tracking_info_update(maintenance, type_, tracking_info)
  270. return response(data={
  271. 'type': type_,
  272. 'tracking_info': tracking_info,
  273. })
  274. def maintenance_tracking_info_subscribe(maintenance, type_):
  275. callbackurl = '{}/api/maintenance/tracking/info/callback?maintenance_id={}&type={}'.format(settings.DOMAIN, maintenance.pk, type_)
  276. if type_ == 'tracking':
  277. express_com = maintenance.express_com
  278. tracking_number = maintenance.tracking_number
  279. phone = maintenance.phone
  280. else:
  281. express_com = maintenance.back_express_com
  282. tracking_number = maintenance.back_tracking_number
  283. phone = maintenance.phone
  284. res = KuaiDi100Subscribe().submit(express_com, tracking_number, phone=phone, callbackurl=callbackurl)
  285. @logit(body=True)
  286. def maintenance_tracking_info_callback(request):
  287. maintenance_id = request.GET.get('maintenance_id', '')
  288. type_ = request.GET.get('type', 'tracking') # tracking / back_tracking
  289. param = request.POST.get('param', '')
  290. if not param:
  291. return response(message='Not Param')
  292. try:
  293. callback_json = json.loads(param)
  294. except Exception:
  295. return response(message='JSON Loads Error')
  296. tracking_info = callback_json.get('lastResult', {})
  297. if not tracking_info:
  298. return response(message='Not Tracking Info')
  299. try:
  300. maintenance = MaintenaceInfo.objects.get(id=maintenance_id, status=True)
  301. except MaintenaceInfo.DoesNotExist:
  302. return response(MaintenanceStatusCode.MAINTENACE_NOT_FOUND)
  303. maintenance_tracking_info_update(maintenance, type_, tracking_info)
  304. return response()