暂无描述

maintenance_views.py 15KB

    # -*- coding: utf-8 -*- from __future__ import division import json from django.conf import settings from django.db.models.query_utils import Q from django_logit import logit from django_response import response from json_response import JsonResponse from paginator import pagination from TimeConvert import TimeConvert as tc from account.models import UserInfo from maintenance.models import ExpressCompanyInfo, MaintenaceInfo from mch.models import ModelInfo from pre.custom_message import sendtemplatemessage from utils.admin_utils import is_admin, is_maintenanceman from utils.error.errno_utils import MaintenanceStatusCode from utils.kuaidi.subscribe import KuaiDi100 as KuaiDi100Subscribe from utils.kuaidi.synquery import KuaiDi100 WECHAT = settings.WECHAT @logit def maintenance_add(request): user_id = request.POST.get('user_id', '') name = request.POST.get('name', '') phone = request.POST.get('phone', '') address = request.POST.get('address', '') model_id = request.POST.get('model_id', '') log_id = request.POST.get('log_id', '') sn = request.POST.get('sn', '') desc = request.POST.get('desc', '') point_id = request.POST.get('point_id', '') point_name = request.POST.get('point_name', '') express_name = request.POST.get('express_name', '') tracking_number = request.POST.get('tracking_number', '') maintenance_status = request.POST.get('maintenance_status', MaintenaceInfo.TRACKING_TO_DESPATCH) try: company = ExpressCompanyInfo.objects.get(name=express_name, status=True) except ExpressCompanyInfo.DoesNotExist: company = None maintenance = MaintenaceInfo.objects.create( user_id=user_id, name=name, phone=phone, address=address, model_id=model_id, log_id=log_id, sn=sn, desc=desc, point_id=point_id, point_name=point_name, express_name=express_name, express_com=company.com if company else '', tracking_number=tracking_number, maintenance_status=maintenance_status, maintenance_status_at={maintenance_status: tc.utc_datetime()} ) maintenance_tracking_info_subscribe(maintenance, 'tracking') return response(data={ 'maintenance_id': maintenance.id, }) @logit def maintenance_delete(request): brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID) maintenance_id = request.POST.get('maintenance_id', '') user_id = request.POST.get('user_id', '') try: maintenance = MaintenaceInfo.objects.get(pk=maintenance_id, status=True) except MaintenaceInfo.DoesNotExist: return response(MaintenanceStatusCode.MAINTENACE_NOT_FOUND) if user_id != maintenance.user_id and not is_maintenanceman(brand_id, user_id): return response(MaintenanceStatusCode.MAINTENACE_PERMISSION_DENIED) maintenance.status = False maintenance.save() return response() @logit def maintenance_update(request): brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID) maintenance_id = request.POST.get('maintenance_id', '') admin_id = request.POST.get('admin_id', '') user_id = request.POST.get('user_id', '') name = request.POST.get('name', '') phone = request.POST.get('phone', '') address = request.POST.get('address', '') model_id = request.POST.get('model_id', '') log_id = request.POST.get('log_id', '') sn = request.POST.get('sn', '') desc = request.POST.get('desc', '') point_id = request.POST.get('point_id', '') point_name = request.POST.get('point_name', '') express_name = request.POST.get('express_name', '') tracking_number = request.POST.get('tracking_number', '') back_express_name = request.POST.get('back_express_name', '') back_tracking_number = request.POST.get('back_tracking_number', '') try: maintenance = MaintenaceInfo.objects.get(pk=maintenance_id, status=True) except MaintenaceInfo.DoesNotExist: return response(MaintenanceStatusCode.MAINTENACE_NOT_FOUND) if user_id != maintenance.user_id and not is_admin(brand_id, admin_id): return response(MaintenanceStatusCode.MAINTENACE_PERMISSION_DENIED) old_tracking_number = maintenance.tracking_number old_back_tracking_number = maintenance.back_tracking_number # 新增 `back_tracking_number` 之后,更新维修状态 if not old_back_tracking_number and back_tracking_number: maintenance.maintenance_status = MaintenaceInfo.TRACKING_FIXED_BACK maintenance_status_at = maintenance.maintenance_status_at maintenance_status_at[MaintenaceInfo.TRACKING_FIXED_BACK] = tc.utc_datetime() maintenance.maintenance_status_at = maintenance.maintenance_status_at maintenance_status_update_sendtemplatemessage(maintenance) if name: maintenance.name = name if phone: maintenance.phone = phone if address: maintenance.address = address if log_id: maintenance.log_id = log_id if model_id: maintenance.model_id = model_id if sn: maintenance.sn = sn if desc: maintenance.desc = desc if point_id: maintenance.point_id = point_id if point_name: maintenance.point_name = point_name if express_name: try: company = ExpressCompanyInfo.objects.get(name=express_name, status=True) except ExpressCompanyInfo.DoesNotExist: company = None maintenance.express_name = express_name maintenance.express_com = company.com if company else '' if tracking_number: maintenance.tracking_number = tracking_number if back_express_name: try: company = ExpressCompanyInfo.objects.get(name=back_express_name, status=True) except ExpressCompanyInfo.DoesNotExist: company = None maintenance.back_express_name = back_express_name maintenance.back_express_com = company.com if company else '' if back_tracking_number: maintenance.back_tracking_number = back_tracking_number maintenance.save() if tracking_number and tracking_number != old_tracking_number: maintenance_tracking_info_subscribe(maintenance, 'tracking') if back_tracking_number and back_tracking_number != old_back_tracking_number: maintenance_tracking_info_subscribe(maintenance, 'back_tracking') return response() @logit def maintenance_list(request): brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID) admin_id = request.POST.get('admin_id', '') user_id = request.POST.get('user_id', '') page = request.POST.get('page', 1) num = request.POST.get('num', 20) maintenance_status = request.POST.get('maintenance_status', 'all') query = request.POST.get('query', '') start_time = request.POST.get('start_time', '') end_time = request.POST.get('end_time', '') point_id = request.POST.get('point_id', '') maintenances = MaintenaceInfo.objects.filter(status=True) if not is_admin(brand_id, admin_id): maintenances = maintenances.filter(user_id=user_id) if maintenance_status and maintenance_status != 'all': maintenances = maintenances.filter(maintenance_status=maintenance_status) if query: maintenances = maintenances.filter(Q(phone=query) | Q(name__icontains=query) | Q(sn=query)) if start_time and end_time: start_time = tc.string_to_utc_datetime(start_time, format='%Y%m%d') end_time = tc.string_to_utc_datetime(end_time + ' 23:59:59', format='%Y%m%d %H:%M:%S') maintenances = maintenances.filter(created_at__range=(start_time, end_time)) if point_id: maintenances = maintenances.filter(point_id=point_id) count = maintenances.count() maintenances = maintenances.order_by('-pk') maintenances = [maintenance.data for maintenance in maintenances] maintenances, left = pagination(maintenances, page, num) return response(data={ 'maintenaces': maintenances, 'count': count, 'left': left, }) @logit def maintenance_detail(request): maintenance_id = request.POST.get('maintenance_id', '') try: maintenance = MaintenaceInfo.objects.get(pk=maintenance_id, status=True) except MaintenaceInfo.DoesNotExist: return response(MaintenanceStatusCode.MAINTENACE_NOT_FOUND) return response(data={ 'maintenace': maintenance.data, }) def maintenance_status_update_sendtemplatemessage(maintenance): try: user = UserInfo.objects.get(user_id=maintenance.user_id, status=True) except UserInfo.DoesNotExist: return try: model = ModelInfo.objects.get(model_id=maintenance.model_id) except ModelInfo.DoesNotExist: return # Send template_message data = { "first": { "value": u'您的维修状态已更新', "color": "#173177" }, "keyword1": { "value": model.model_name, "color": "#173177" }, "keyword2": { "value": maintenance.sn, "color": "#173177" }, "keyword3": { "value": maintenance.maintenance_status, "color": "#173177" }, "remark": { "value": u'如您有任何其他疑问,可在腾龙公众号进行留言', "color": "#173177" } } wxcfg = WECHAT.get('MINIAPP', {}) appid = wxcfg.get('appID') sendtemplatemessage(openid=user.openid, template_id=settings.TEMPLATE_ID_MAINTENANCE, data=data, miniappid=appid, minipagepath='/pages/index/index') def is_maintenance_tracking_signed(tracking_info): if not tracking_info: return False items = tracking_info.get('data', []) if not items: return False return items[0].get('status') == u'签收' def maintenance_tracking_info_update(maintenance, type_, tracking_info): old_maintenance_status = maintenance.maintenance_status is_tracking_signed = is_maintenance_tracking_signed(tracking_info) # 状态流转,TRACKING_TO_DESPATCH -> TRACKING_SIGNED_FIXING -> TRACKING_FIXED_BACK -> TRACKING_BACK_SIGNED # 需判断快递签收再更新维修状态 maintenance_status = '' if type_ == 'tracking': maintenance.tracking_info = tracking_info maintenance.tracking_signed = is_tracking_signed if is_tracking_signed and old_maintenance_status == MaintenaceInfo.TRACKING_TO_DESPATCH: maintenance_status = MaintenaceInfo.TRACKING_SIGNED_FIXING else: maintenance.back_tracking_info = tracking_info maintenance.back_tracking_signed = is_tracking_signed if is_tracking_signed and old_maintenance_status == MaintenaceInfo.TRACKING_FIXED_BACK: maintenance_status = MaintenaceInfo.TRACKING_BACK_SIGNED if maintenance_status: maintenance.maintenance_status = maintenance_status maintenance_status_at = maintenance.maintenance_status_at if maintenance_status not in maintenance_status_at: maintenance_status_at[maintenance_status] = tc.utc_datetime() maintenance.maintenance_status_at = maintenance_status_at maintenance.save() if maintenance_status and maintenance_status != old_maintenance_status: maintenance_status_update_sendtemplatemessage(maintenance) @logit def maintenance_tracking_info(request): maintenance_id = request.POST.get('maintenance_id', '') type_ = request.POST.get('type', 'tracking') # tracking / back_tracking try: maintenance = MaintenaceInfo.objects.get(pk=maintenance_id, status=True) except MaintenaceInfo.DoesNotExist: return response(MaintenanceStatusCode.MAINTENACE_NOT_FOUND) tracking_info = {} if type_ == 'tracking': if maintenance.express_com and maintenance.tracking_number: tracking_info = KuaiDi100().track(maintenance.express_com, maintenance.tracking_number) else: if maintenance.back_express_com and maintenance.back_tracking_number: tracking_info = KuaiDi100().track(maintenance.back_express_com, maintenance.back_tracking_number) if tracking_info: try: tracking_info = json.loads(tracking_info) except Exception: tracking_info = {} if tracking_info: maintenance_tracking_info_update(maintenance, type_, tracking_info) return response(data={ 'type': type_, 'tracking_info': tracking_info, }) def maintenance_tracking_info_subscribe(maintenance, type_): callbackurl = '{}/api/maintenance/tracking/info/callback?maintenance_id={}&type={}'.format(settings.DOMAIN, maintenance.pk, type_) if type_ == 'tracking': express_com = maintenance.express_com tracking_number = maintenance.tracking_number phone = maintenance.phone else: express_com = maintenance.back_express_com tracking_number = maintenance.back_tracking_number phone = maintenance.phone return KuaiDi100Subscribe().submit(express_com, tracking_number, phone=phone, callbackurl=callbackurl) @logit(body=True) def maintenance_tracking_info_callback(request): maintenance_id = request.GET.get('maintenance_id', '') type_ = request.GET.get('type', 'tracking') # tracking / back_tracking param = request.POST.get('param', '') if not param: return response(message='Not Param') try: callback_json = json.loads(param) except Exception: return response(message='JSON Loads Error') tracking_info = callback_json.get('lastResult', {}) if not tracking_info: return response(message='Not Tracking Info') try: maintenance = MaintenaceInfo.objects.get(pk=maintenance_id, status=True) except MaintenaceInfo.DoesNotExist: return response(MaintenanceStatusCode.MAINTENACE_NOT_FOUND) maintenance_tracking_info_update(maintenance, type_, tracking_info) return JsonResponse({ 'result': True, 'returnCode': '200', 'message': '成功' }, safe=False) @logit def maintenance_close(request): brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID) maintenance_id = request.POST.get('maintenance_id', '') admin_id = request.POST.get('admin_id', '') try: maintenance = MaintenaceInfo.objects.get(pk=maintenance_id, status=True) except MaintenaceInfo.DoesNotExist: return response(MaintenanceStatusCode.MAINTENACE_NOT_FOUND) if not is_admin(brand_id, admin_id): return response(MaintenanceStatusCode.MAINTENACE_NOT_FOUND) maintenance.maintenance_status = MaintenaceInfo.TRACKING_BACK_SIGNED maintenance_status_at = maintenance.maintenance_status_at maintenance_status_at[MaintenaceInfo.TRACKING_BACK_SIGNED] = tc.utc_datetime() maintenance.maintenance_status_at = maintenance_status_at maintenance.save() return response()