123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413 |
- 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') or 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') or 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
-
- 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') or 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
-
- data = {
- "first": {
- "value": u'您的维修状态已更新',
- },
- "keyword1": {
- "value": model.model_name,
- },
- "keyword2": {
- "value": maintenance.sn,
- },
- "keyword3": {
- "value": maintenance.maintenance_status,
- },
- "remark": {
- "value": u'如您有任何其他疑问,可在腾龙公众号进行留言',
- }
- }
- 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)
-
-
- 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')
- 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, phone=maintenance.phone)
- else:
- if maintenance.back_express_com and maintenance.back_tracking_number:
- tracking_info = KuaiDi100().track(maintenance.back_express_com, maintenance.back_tracking_number, phone=maintenance.phone)
- 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')
- 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') or 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()
|