:art: KuaiDi100Subscribe for tenancy

huangqimin001 2 years ago
parent
commit
fd8d621642
6 changed files with 97 additions and 3 deletions
  1. 1 1
      api/maintenance_views.py
  2. 9 0
      api/tenancy_admin_views.py
  3. 79 1
      api/tenancy_views.py
  4. 1 0
      api/urls.py
  5. 5 0
      tenancy/models.py
  6. 2 1
      utils/kuaidi/subscribe.py

+ 1 - 1
api/maintenance_views.py

@@ -357,7 +357,7 @@ def maintenance_tracking_info_subscribe(maintenance, type_):
357 357
         express_com = maintenance.back_express_com
358 358
         tracking_number = maintenance.back_tracking_number
359 359
         phone = maintenance.phone
360
-    res = KuaiDi100Subscribe().submit(express_com, tracking_number, phone=phone, callbackurl=callbackurl)
360
+    return KuaiDi100Subscribe().submit(express_com, tracking_number, phone=phone, callbackurl=callbackurl)
361 361
 
362 362
 
363 363
 @logit(body=True)

+ 9 - 0
api/tenancy_admin_views.py

@@ -8,6 +8,7 @@ from django_response import response
8 8
 from paginator import pagination
9 9
 from TimeConvert import TimeConvert as tc
10 10
 
11
+from api.tenancy_views import tenancy_tracking_info_subscribe
11 12
 from kodo.decorators import check_admin
12 13
 from tenancy.models import TenancyShotInfo, TenancyShotRequestInfo
13 14
 from utils.error.errno_utils import TenancyStatusCode
@@ -137,6 +138,9 @@ def shot_request_update(request, administrator):
137 138
     except TenancyShotRequestInfo.DoesNotExist:
138 139
         return response(TenancyStatusCode.TENANCY_SHOT_REQUEST_NOT_FOUND)
139 140
 
141
+    old_tracking_number = req.tracking_number
142
+    old_back_tracking_number = req.back_tracking_number
143
+
140 144
     if shot_id:
141 145
         req.shot_id = shot_id
142 146
     if name:
@@ -159,6 +163,11 @@ def shot_request_update(request, administrator):
159 163
         req.back_tracking_number = back_tracking_number
160 164
     req.save()
161 165
 
166
+    if tracking_number and tracking_number != old_tracking_number:
167
+        tenancy_tracking_info_subscribe(req, 'tracking')
168
+    if back_tracking_number and back_tracking_number != old_back_tracking_number:
169
+        tenancy_tracking_info_subscribe(req, 'back_tracking')
170
+
162 171
     return response(data={
163 172
         'req': req.data,
164 173
     })

+ 79 - 1
api/tenancy_views.py

@@ -2,16 +2,20 @@
2 2
 
3 3
 from __future__ import division
4 4
 
5
+import json
6
+
5 7
 from django.conf import settings
6 8
 from django.db import transaction
7 9
 from django_logit import logit
8 10
 from django_query import get_query_value
9 11
 from django_response import response
12
+from json_response import JsonResponse
10 13
 from paginator import pagination
11 14
 from TimeConvert import TimeConvert as tc
12 15
 
13 16
 from tenancy.models import TenancyShotInfo, TenancyShotRequestInfo
14 17
 from utils.error.errno_utils import TenancyStatusCode
18
+from utils.kuaidi.subscribe import KuaiDi100 as KuaiDi100Subscribe
15 19
 
16 20
 
17 21
 @logit
@@ -134,10 +138,84 @@ def shot_request_sendback(request):
134 138
     except TenancyShotRequestInfo.DoesNotExist:
135 139
         return response(TenancyStatusCode.TENANCY_SHOT_REQUEST_NOT_FOUND)
136 140
 
141
+    old_back_tracking_number = req.back_tracking_number
142
+
137 143
     req.back_tracking_number = back_tracking_number
138
-    req.request_status = '寄出已签收'
144
+    req.request_status = '寄回'
139 145
     req.save()
140 146
 
147
+    if back_tracking_number and back_tracking_number != old_back_tracking_number:
148
+        tenancy_tracking_info_subscribe(req, 'back_tracking')
149
+
141 150
     return response(data={
142 151
         'req': req.data,
143 152
     })
153
+
154
+
155
+def is_tenancy_tracking_signed(tracking_info):
156
+    if not tracking_info:
157
+        return False
158
+    items = tracking_info.get('data', [])
159
+    if not items:
160
+        return False
161
+    return items[0].get('status') == u'签收'
162
+
163
+
164
+@transaction.atomic
165
+def tenancy_tracking_info_update(req, type_, tracking_info):
166
+    is_tracking_signed = is_tenancy_tracking_signed(tracking_info)
167
+    if type_ == 'tracking':
168
+        req.tracking_info = tracking_info
169
+        req.tracking_signed = is_tracking_signed
170
+    else:
171
+        req.back_tracking_info = tracking_info
172
+        req.back_tracking_signed = is_tracking_signed
173
+    req.save()
174
+
175
+
176
+def tenancy_tracking_info_subscribe(req, type_):
177
+    callbackurl = '{}/api/tenancy/tracking/info/callback?reqpk={}&type={}'.format(settings.DOMAIN, req.pk, type_)
178
+    if type_ == 'tracking':
179
+        express_com = req.express_com
180
+        tracking_number = req.tracking_number
181
+        phone = req.phone
182
+    else:
183
+        express_com = req.back_express_com
184
+        tracking_number = req.back_tracking_number
185
+        phone = req.phone
186
+    return KuaiDi100Subscribe().submit(express_com, tracking_number, phone=phone, callbackurl=callbackurl)
187
+
188
+
189
+@logit(body=True)
190
+@transaction.atomic
191
+def tenancy_tracking_info_callback(request):
192
+    reqpk = request.GET.get('reqpk', '')
193
+    type_ = request.GET.get('type', 'tracking')  # tracking / back_tracking
194
+
195
+    param = request.POST.get('param', '')
196
+
197
+    if not param:
198
+        return response(message='Not Param')
199
+
200
+    try:
201
+        callback_json = json.loads(param)
202
+    except Exception:
203
+        return response(message='JSON Loads Error')
204
+
205
+    tracking_info = callback_json.get('lastResult', {})
206
+
207
+    if not tracking_info:
208
+        return response(message='Not Tracking Info')
209
+
210
+    try:
211
+        req = TenancyShotRequestInfo.objects.select_for_update().get(pk=reqpk, status=True)
212
+    except TenancyShotRequestInfo.DoesNotExist:
213
+        return response(TenancyStatusCode.TENANCY_SHOT_REQUEST_NOT_FOUND)
214
+
215
+    tenancy_tracking_info_update(req, type_, tracking_info)
216
+
217
+    return JsonResponse({
218
+        'result': True,
219
+        'returnCode': '200',
220
+        'message': '成功'
221
+    }, safe=False)

+ 1 - 0
api/urls.py

@@ -356,6 +356,7 @@ urlpatterns += [
356 356
     url(r'^admin/tenancy/shot/request/signed$', tenancy_admin_views.shot_request_signed, name='admin_tenancy_shot_request_signed'),
357 357
 
358 358
     # 快递信息回调接口
359
+    url(r'^tenancy/tracking/info/callback$', tenancy_views.tenancy_tracking_info_callback, name='tenancy_tracking_info_callback'),
359 360
 ]
360 361
 
361 362
 # 腾讯云

+ 5 - 0
tenancy/models.py

@@ -52,6 +52,11 @@ class TenancyShotInfo(BaseModelMixin):
52 52
 
53 53
 
54 54
 class TenancyShotRequestInfo(BaseModelMixin):
55
+    TRACKING_TO_DESPATCH = u'寄出'
56
+    TRACKING_SIGNED_FIXING = u'寄出已签收'
57
+    TRACKING_FIXED_BACK = u'寄回'
58
+    TRACKING_BACK_SIGNED = u'寄回已签收并检查无损坏'
59
+
55 60
     AUDIT_PASS = 1
56 61
     AUDIT_STATUS = (
57 62
         (0, u'未审批'),

+ 2 - 1
utils/kuaidi/subscribe.py

@@ -21,6 +21,7 @@ class KuaiDi100:
21 21
         :param ship_to: 目的地城市,省-市-区,非必填,填了有助于提升签收状态的判断的准确率,且到达目的地后会加大监控频率,请尽量提供
22 22
         :return: requests.Response.text
23 23
         """
24
+        autoCom = '0' if com else '1'
24 25
         param = {
25 26
             'company': com,
26 27
             'number': num,
@@ -32,7 +33,7 @@ class KuaiDi100:
32 33
                 # 'callbackurl': 'https://www.baidu.com/kd100/callback',  # 回调接口的地址。如果需要在推送信息回传自己业务参数,可以在回调地址URL后面拼接上去,例如:https://www.baidu.com/kd100/callback?orderId=123
33 34
                 'salt': None,  # 签名用随机字符串。32位自定义字符串。添加该参数,则推送的时候会增加sign给贵司校验消息的可靠性
34 35
                 'resultv2': '1',  # 添加此字段表示开通行政区域解析功能。0:关闭(默认),1:开通行政区域解析功能
35
-                'autoCom': '0',  # 添加此字段且将此值设为1,则表示开始智能判断单号所属公司的功能,开启后,company字段可为空,即只传运单号(number字段),我方收到后会根据单号判断出其所属的快递公司(即company字段)。建议只有在无法知道单号对应的快递公司(即company的值)的情况下才开启此功能
36
+                'autoCom': autoCom,  # 添加此字段且将此值设为1,则表示开始智能判断单号所属公司的功能,开启后,company字段可为空,即只传运单号(number字段),我方收到后会根据单号判断出其所属的快递公司(即company字段)。建议只有在无法知道单号对应的快递公司(即company的值)的情况下才开启此功能
36 37
                 'interCom': '0',  # 添加此字段且将此值设为1,则表示开启国际版,开启后,若订阅的单号(即number字段)属于国际单号,会返回出发国与目的国两个国家的跟踪信息,本功能暂时只支持邮政体系(国际类的邮政小包、EMS)内的快递公司,若单号我方识别为非国际单,即使添加本字段,也不会返回destResult元素组
37 38
                 'departureCountry': '',  # 出发国家编码,interCom=1的国际单号最好提供该值
38 39
                 'departureCom': '',  # 出发国家快递公司的编码,interCom=1的国际单号最好提供该值