暫無描述

maintenance_views.py 15KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410
  1. # -*- coding: utf-8 -*-
  2. from __future__ import division
  3. import json
  4. from django.conf import settings
  5. from django.db.models.query_utils import Q
  6. from django_logit import logit
  7. from django_response import response
  8. from paginator import pagination
  9. from TimeConvert import TimeConvert as tc
  10. from account.models import UserInfo
  11. from maintenance.models import ExpressCompanyInfo, MaintenaceInfo
  12. from mch.models import ModelInfo
  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. model_id = request.POST.get('model_id', '')
  83. log_id = request.POST.get('log_id', '')
  84. sn = request.POST.get('sn', '')
  85. desc = request.POST.get('desc', '')
  86. point_id = request.POST.get('point_id', '')
  87. point_name = request.POST.get('point_name', '')
  88. express_name = request.POST.get('express_name', '')
  89. tracking_number = request.POST.get('tracking_number', '')
  90. back_express_name = request.POST.get('back_express_name', '')
  91. back_tracking_number = request.POST.get('back_tracking_number', '')
  92. try:
  93. maintenance = MaintenaceInfo.objects.get(id=maintenance_id, status=True)
  94. except MaintenaceInfo.DoesNotExist:
  95. return response(MaintenanceStatusCode.MAINTENACE_NOT_FOUND)
  96. if user_id != maintenance.user_id and not is_admin(brand_id, admin_id):
  97. return response(MaintenanceStatusCode.MAINTENACE_PERMISSION_DENIED)
  98. old_tracking_number = maintenance.tracking_number
  99. old_back_tracking_number = maintenance.back_tracking_number
  100. # 新增 `back_tracking_number` 之后,更新维修状态
  101. if not old_back_tracking_number and back_tracking_number:
  102. maintenance.maintenance_status = MaintenaceInfo.TRACKING_FIXED_BACK
  103. maintenance_status_at = maintenance.maintenance_status_at
  104. maintenance_status_at[MaintenaceInfo.TRACKING_FIXED_BACK] = tc.utc_datetime()
  105. maintenance.maintenance_status_at = maintenance.maintenance_status_at
  106. maintenance_status_update_sendtemplatemessage(maintenance)
  107. if name:
  108. maintenance.name = name
  109. if phone:
  110. maintenance.phone = phone
  111. if address:
  112. maintenance.address = address
  113. if log_id:
  114. maintenance.log_id = log_id
  115. if model_id:
  116. maintenance.model_id = model_id
  117. if sn:
  118. maintenance.sn = sn
  119. if desc:
  120. maintenance.desc = desc
  121. if point_id:
  122. maintenance.point_id = point_id
  123. if point_name:
  124. maintenance.point_name = point_name
  125. if express_name:
  126. try:
  127. company = ExpressCompanyInfo.objects.get(name=express_name, status=True)
  128. except ExpressCompanyInfo.DoesNotExist:
  129. company = None
  130. maintenance.express_name = express_name
  131. maintenance.express_com = company.com if company else ''
  132. if tracking_number:
  133. maintenance.tracking_number = tracking_number
  134. if back_express_name:
  135. try:
  136. company = ExpressCompanyInfo.objects.get(name=back_express_name, status=True)
  137. except ExpressCompanyInfo.DoesNotExist:
  138. company = None
  139. maintenance.back_express_name = back_express_name
  140. maintenance.back_express_com = company.com if company else ''
  141. if back_tracking_number:
  142. maintenance.back_tracking_number = back_tracking_number
  143. maintenance.save()
  144. if tracking_number and tracking_number != old_tracking_number:
  145. maintenance_tracking_info_subscribe(maintenance, 'tracking')
  146. if back_tracking_number and back_tracking_number != old_back_tracking_number:
  147. maintenance_tracking_info_subscribe(maintenance, 'back_tracking')
  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. maintenance_status = request.POST.get('maintenance_status', 'all')
  157. query = request.POST.get('query', '')
  158. start_time = request.POST.get('start_time', '')
  159. end_time = request.POST.get('end_time', '')
  160. point_id = request.POST.get('point_id', '')
  161. maintenances = MaintenaceInfo.objects.filter(status=True)
  162. if not is_admin(brand_id, admin_id):
  163. maintenances = maintenances.filter(user_id=user_id)
  164. if maintenance_status and maintenance_status != 'all':
  165. maintenances = maintenances.filter(maintenance_status=maintenance_status)
  166. if query:
  167. maintenances = maintenances.filter(Q(phone=query) | Q(name__icontains=query) | Q(sn=query))
  168. if start_time and end_time:
  169. start_time = tc.string_to_utc_datetime(start_time, format='%Y%m%d')
  170. end_time = tc.string_to_utc_datetime(end_time + ' 23:59:59', format='%Y%m%d %H:%M:%S')
  171. maintenances = maintenances.filter(created_at__range=(start_time, end_time))
  172. if point_id:
  173. maintenances = maintenances.filter(point_id=point_id)
  174. count = maintenances.count()
  175. maintenances = maintenances.order_by('-pk')
  176. maintenances = [maintenance.data for maintenance in maintenances]
  177. maintenances, left = pagination(maintenances, page, num)
  178. return response(data={
  179. 'maintenaces': maintenances,
  180. 'count': count,
  181. 'left': left,
  182. })
  183. @logit
  184. def maintenance_detail(request):
  185. maintenance_id = request.POST.get('maintenance_id', '')
  186. try:
  187. maintenance = MaintenaceInfo.objects.get(id=maintenance_id, status=True)
  188. except MaintenaceInfo.DoesNotExist:
  189. return response(MaintenanceStatusCode.MAINTENACE_NOT_FOUND)
  190. return response(data={
  191. 'maintenace': maintenance.data,
  192. })
  193. def maintenance_status_update_sendtemplatemessage(maintenance):
  194. try:
  195. user = UserInfo.objects.get(user_id=maintenance.user_id, status=True)
  196. except UserInfo.DoesNotExist:
  197. return
  198. model = ModelInfo.objects.get(model_id=maintenance.model_id)
  199. user = UserInfo.objects.get(user_id=maintenance.user_id)
  200. # Send template_message
  201. data = {
  202. "first": {
  203. "value": u'您的维修状态已更新',
  204. "color": "#173177"
  205. },
  206. "keyword1": {
  207. "value": model.model_name,
  208. "color": "#173177"
  209. },
  210. "keyword2": {
  211. "value": maintenance.sn,
  212. "color": "#173177"
  213. },
  214. "keyword3": {
  215. "value": maintenance.maintenance_status,
  216. "color": "#173177"
  217. },
  218. "remark": {
  219. "value": u'如您有任何其他疑问,可在腾龙公众号进行留言',
  220. "color": "#173177"
  221. }
  222. }
  223. wxcfg = WECHAT.get('MINIAPP', {})
  224. appid = wxcfg.get('appID')
  225. sendtemplatemessage(openid=user.openid, template_id=settings.TEMPLATE_ID_MAINTENANCE, data=data, miniappid=appid, minipagepath='/pages/index/index')
  226. def is_maintenance_tracking_signed(tracking_info):
  227. if not tracking_info:
  228. return False
  229. items = tracking_info.get('data', [])
  230. if not items:
  231. return False
  232. return items[0].get('status') == u'签收'
  233. def maintenance_tracking_info_update(maintenance, type_, tracking_info):
  234. old_maintenance_status = maintenance.maintenance_status
  235. is_tracking_signed = is_maintenance_tracking_signed(tracking_info)
  236. # 状态流转,TRACKING_TO_DESPATCH -> TRACKING_SIGNED_FIXING -> TRACKING_FIXED_BACK -> TRACKING_BACK_SIGNED
  237. # 需判断快递签收再更新维修状态
  238. maintenance_status = ''
  239. if type_ == 'tracking':
  240. maintenance.tracking_info = tracking_info
  241. maintenance.tracking_signed = is_tracking_signed
  242. if is_tracking_signed and old_maintenance_status == MaintenaceInfo.TRACKING_TO_DESPATCH:
  243. maintenance_status = MaintenaceInfo.TRACKING_SIGNED_FIXING
  244. else:
  245. maintenance.back_tracking_info = tracking_info
  246. maintenance.back_tracking_signed = is_tracking_signed
  247. if is_tracking_signed and old_maintenance_status == MaintenaceInfo.TRACKING_FIXED_BACK:
  248. maintenance_status = MaintenaceInfo.TRACKING_BACK_SIGNED
  249. if maintenance_status:
  250. maintenance.maintenance_status = maintenance_status
  251. maintenance_status_at = maintenance.maintenance_status_at
  252. if maintenance_status not in maintenance_status_at:
  253. maintenance_status_at[maintenance_status] = tc.utc_datetime()
  254. maintenance.maintenance_status_at = maintenance_status_at
  255. maintenance.save()
  256. if maintenance_status and maintenance_status != old_maintenance_status:
  257. maintenance_status_update_sendtemplatemessage(maintenance)
  258. @logit
  259. def maintenance_tracking_info(request):
  260. maintenance_id = request.POST.get('maintenance_id', '')
  261. type_ = request.POST.get('type', 'tracking') # tracking / back_tracking
  262. try:
  263. maintenance = MaintenaceInfo.objects.get(id=maintenance_id, status=True)
  264. except MaintenaceInfo.DoesNotExist:
  265. return response(MaintenanceStatusCode.MAINTENACE_NOT_FOUND)
  266. tracking_info = {}
  267. if type_ == 'tracking':
  268. if maintenance.express_com and maintenance.tracking_number:
  269. tracking_info = KuaiDi100().track(maintenance.express_com, maintenance.tracking_number)
  270. else:
  271. if maintenance.back_express_com and maintenance.back_tracking_number:
  272. tracking_info = KuaiDi100().track(maintenance.back_express_com, maintenance.back_tracking_number)
  273. if tracking_info:
  274. try:
  275. tracking_info = json.loads(tracking_info)
  276. except Exception:
  277. tracking_info = {}
  278. if tracking_info:
  279. maintenance_tracking_info_update(maintenance, type_, tracking_info)
  280. return response(data={
  281. 'type': type_,
  282. 'tracking_info': tracking_info,
  283. })
  284. def maintenance_tracking_info_subscribe(maintenance, type_):
  285. callbackurl = '{}/api/maintenance/tracking/info/callback?maintenance_id={}&type={}'.format(settings.DOMAIN, maintenance.pk, type_)
  286. if type_ == 'tracking':
  287. express_com = maintenance.express_com
  288. tracking_number = maintenance.tracking_number
  289. phone = maintenance.phone
  290. else:
  291. express_com = maintenance.back_express_com
  292. tracking_number = maintenance.back_tracking_number
  293. phone = maintenance.phone
  294. res = KuaiDi100Subscribe().submit(express_com, tracking_number, phone=phone, callbackurl=callbackurl)
  295. @logit(body=True)
  296. def maintenance_tracking_info_callback(request):
  297. maintenance_id = request.GET.get('maintenance_id', '')
  298. type_ = request.GET.get('type', 'tracking') # tracking / back_tracking
  299. param = request.POST.get('param', '')
  300. if not param:
  301. return response(message='Not Param')
  302. try:
  303. callback_json = json.loads(param)
  304. except Exception:
  305. return response(message='JSON Loads Error')
  306. tracking_info = callback_json.get('lastResult', {})
  307. if not tracking_info:
  308. return response(message='Not Tracking Info')
  309. try:
  310. maintenance = MaintenaceInfo.objects.get(id=maintenance_id, status=True)
  311. except MaintenaceInfo.DoesNotExist:
  312. return response(MaintenanceStatusCode.MAINTENACE_NOT_FOUND)
  313. maintenance_tracking_info_update(maintenance, type_, tracking_info)
  314. return response()
  315. @logit
  316. def maintenance_close(request):
  317. brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
  318. maintenance_id = request.POST.get('maintenance_id', '')
  319. admin_id = request.POST.get('admin_id', '')
  320. try:
  321. maintenance = MaintenaceInfo.objects.get(id=maintenance_id, status=True)
  322. except MaintenaceInfo.DoesNotExist:
  323. return response(MaintenanceStatusCode.MAINTENACE_NOT_FOUND)
  324. if not is_admin(brand_id, admin_id):
  325. return response(MaintenanceStatusCode.MAINTENACE_NOT_FOUND)
  326. maintenance.maintenance_status = MaintenaceInfo.TRACKING_BACK_SIGNED
  327. maintenance_status_at = maintenance.maintenance_status_at
  328. maintenance_status_at[MaintenaceInfo.TRACKING_BACK_SIGNED] = tc.utc_datetime()
  329. maintenance.maintenance_status_at = maintenance_status_at
  330. maintenance.save()
  331. return response()