No Description

maintenance_views.py 15KB

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