@@ -7,11 +7,14 @@ from django_logit import logit |
||
7 | 7 |
from django_response import response |
8 | 8 |
from paginator import pagination |
9 | 9 |
from TimeConvert import TimeConvert as tc |
10 |
+from django.db.models import Q |
|
11 |
+ |
|
10 | 12 |
|
11 | 13 |
from api.tenancy_views import tenancy_tracking_info_subscribe |
12 | 14 |
from kodo.decorators import check_admin |
13 | 15 |
from tenancy.models import TenancyShotInfo, TenancyShotRequestInfo |
14 | 16 |
from utils.error.errno_utils import TenancyStatusCode |
17 |
+from utils.kuaidi.synquery import KuaiDi100 |
|
15 | 18 |
|
16 | 19 |
|
17 | 20 |
@logit |
@@ -19,14 +22,19 @@ from utils.error.errno_utils import TenancyStatusCode |
||
19 | 22 |
def shot_list(request, administrator): |
20 | 23 |
page = request.POST.get('page', 1) |
21 | 24 |
num = request.POST.get('num', 20) |
25 |
+ query = request.POST.get('query', '') |
|
22 | 26 |
|
23 | 27 |
shots = TenancyShotInfo.objects.filter(status=True).order_by('-pk') |
28 |
+ if query: |
|
29 |
+ shots = shots.filter(Q(sn__icontains=query)) |
|
30 |
+ count = shots.count() |
|
24 | 31 |
shots = [shot.data for shot in shots] |
25 | 32 |
shots, left = pagination(shots, page, num) |
26 | 33 |
|
27 | 34 |
return response(data={ |
28 | 35 |
'shots': shots, |
29 | 36 |
'left': left, |
37 |
+ 'count': count, |
|
30 | 38 |
}) |
31 | 39 |
|
32 | 40 |
|
@@ -111,14 +119,32 @@ def shot_update(request, administrator): |
||
111 | 119 |
def shot_request_list(request, administrator): |
112 | 120 |
page = request.POST.get('page', 1) |
113 | 121 |
num = request.POST.get('num', 20) |
122 |
+ query = request.POST.get('query', '') |
|
123 |
+ start_time = request.POST.get('start_time', '') |
|
124 |
+ end_time = request.POST.get('end_time', '') |
|
125 |
+ request_status = request.POST.get('request_status', 'all') |
|
114 | 126 |
|
115 | 127 |
reqs = TenancyShotRequestInfo.objects.filter(status=True).order_by('-pk') |
116 |
- reqs = [req.data for req in reqs] |
|
128 |
+ |
|
129 |
+ if query: |
|
130 |
+ reqs = reqs.filter(Q(phone__icontains=query), Q(name__icontains=query)) |
|
131 |
+ |
|
132 |
+ if request_status != 'all': |
|
133 |
+ reqs = reqs.filter(request_status=request_status) |
|
134 |
+ |
|
135 |
+ if start_time and end_time: |
|
136 |
+ start_time = tc.string_to_utc_datetime(start_time, format='%Y%m%d') |
|
137 |
+ end_time = tc.string_to_utc_datetime(end_time + ' 23:59:59', format='%Y%m%d %H:%M:%S') |
|
138 |
+ maintenances = maintenances.filter(created_at__range=(start_time, end_time)) |
|
139 |
+ |
|
140 |
+ count = reqs.count() |
|
141 |
+ reqs = [req.admindata for req in reqs] |
|
117 | 142 |
reqs, left = pagination(reqs, page, num) |
118 | 143 |
|
119 | 144 |
return response(data={ |
120 | 145 |
'reqs': reqs, |
121 | 146 |
'left': left, |
147 |
+ 'count': count, |
|
122 | 148 |
}) |
123 | 149 |
|
124 | 150 |
|
@@ -133,7 +159,7 @@ def shot_request_detail(request, administrator): |
||
133 | 159 |
return response(TenancyStatusCode.TENANCY_SHOT_REQUEST_NOT_FOUND) |
134 | 160 |
|
135 | 161 |
return response(data={ |
136 |
- 'req': req.data, |
|
162 |
+ 'req': req.admindata, |
|
137 | 163 |
}) |
138 | 164 |
|
139 | 165 |
|
@@ -150,7 +176,11 @@ def shot_request_update(request, administrator): |
||
150 | 176 |
purpose = request.POST.get('purpose', '') |
151 | 177 |
return_date = request.POST.get('return_date', '') |
152 | 178 |
request_status = request.POST.get('request_status', '') |
179 |
+ express_name = request.POST.get('express_name', '') |
|
180 |
+ express_com = request.POST.get('express_com', '') |
|
153 | 181 |
tracking_number = request.POST.get('tracking_number', '') |
182 |
+ back_express_name = request.POST.get('back_express_name', '') |
|
183 |
+ back_express_com = request.POST.get('back_express_com', '') |
|
154 | 184 |
back_tracking_number = request.POST.get('back_tracking_number', '') |
155 | 185 |
|
156 | 186 |
try: |
@@ -177,8 +207,16 @@ def shot_request_update(request, administrator): |
||
177 | 207 |
req.return_date = tc.to_date(return_date) |
178 | 208 |
if request_status: |
179 | 209 |
req.request_status = request_status |
210 |
+ if express_name: |
|
211 |
+ req.express_name = express_name |
|
212 |
+ if express_com: |
|
213 |
+ req.express_com = express_com |
|
180 | 214 |
if tracking_number: |
181 | 215 |
req.tracking_number = tracking_number |
216 |
+ if back_express_name: |
|
217 |
+ req.back_express_name = back_express_name |
|
218 |
+ if back_express_com: |
|
219 |
+ req.back_express_com = back_express_com |
|
182 | 220 |
if back_tracking_number: |
183 | 221 |
req.back_tracking_number = back_tracking_number |
184 | 222 |
req.save() |
@@ -189,7 +227,7 @@ def shot_request_update(request, administrator): |
||
189 | 227 |
tenancy_tracking_info_subscribe(req, 'back_tracking') |
190 | 228 |
|
191 | 229 |
return response(data={ |
192 |
- 'req': req.data, |
|
230 |
+ 'req': req.admindata, |
|
193 | 231 |
}) |
194 | 232 |
|
195 | 233 |
|
@@ -209,7 +247,7 @@ def shot_request_audit(request, administrator): |
||
209 | 247 |
req.save() |
210 | 248 |
|
211 | 249 |
return response(data={ |
212 |
- 'req': req.data, |
|
250 |
+ 'req': req.admindata, |
|
213 | 251 |
}) |
214 | 252 |
|
215 | 253 |
|
@@ -218,6 +256,8 @@ def shot_request_audit(request, administrator): |
||
218 | 256 |
@transaction.atomic |
219 | 257 |
def shot_request_send(request, administrator): |
220 | 258 |
req_id = request.POST.get('req_id') or request.POST.get('request_id') |
259 |
+ express_name = request.POST.get('express_name', '') |
|
260 |
+ express_com = request.POST.get('express_com', '') |
|
221 | 261 |
tracking_number = request.POST.get('tracking_number', '') |
222 | 262 |
|
223 | 263 |
try: |
@@ -225,11 +265,20 @@ def shot_request_send(request, administrator): |
||
225 | 265 |
except TenancyShotRequestInfo.DoesNotExist: |
226 | 266 |
return response(TenancyStatusCode.TENANCY_SHOT_REQUEST_NOT_FOUND) |
227 | 267 |
|
268 |
+ old_tracking_number = req.tracking_number |
|
269 |
+ |
|
270 |
+ req.express_name = express_name |
|
271 |
+ req.express_com = express_com |
|
228 | 272 |
req.tracking_number = tracking_number |
273 |
+ req.request_status = TenancyShotRequestInfo.TENANCY_TRACKING_SEND |
|
274 |
+ req.request_status_at = {TenancyShotRequestInfo.TENANCY_TRACKING_SEND: tc.utc_datetime()} |
|
229 | 275 |
req.save() |
230 | 276 |
|
277 |
+ if tracking_number and tracking_number != old_tracking_number: |
|
278 |
+ tenancy_tracking_info_subscribe(req, 'tracking') |
|
279 |
+ |
|
231 | 280 |
return response(data={ |
232 |
- 'req': req.data, |
|
281 |
+ 'req': req.admindata, |
|
233 | 282 |
}) |
234 | 283 |
|
235 | 284 |
|
@@ -245,8 +294,49 @@ def shot_request_signed(request, administrator): |
||
245 | 294 |
return response(TenancyStatusCode.TENANCY_SHOT_REQUEST_NOT_FOUND) |
246 | 295 |
|
247 | 296 |
req.request_status = TenancyShotRequestInfo.TENANCY_TRACKING_BACK_SIGNED |
297 |
+ request_status_at = req.request_status_at |
|
298 |
+ request_status_at[TenancyShotRequestInfo.TENANCY_TRACKING_BACK_SIGNED] = tc.utc_datetime() |
|
299 |
+ req.request_status_at = request_status_at |
|
248 | 300 |
req.save() |
249 | 301 |
|
250 | 302 |
return response(data={ |
251 |
- 'req': req.data, |
|
303 |
+ 'req': req.admindata, |
|
304 |
+ }) |
|
305 |
+ |
|
306 |
+ |
|
307 |
+@logit |
|
308 |
+@check_admin |
|
309 |
+def shot_request_tracking_info(request): |
|
310 |
+ request_id = request.POST.get('request_id', '') |
|
311 |
+ type_ = request.POST.get('type', 'tracking') # tracking / back_tracking |
|
312 |
+ |
|
313 |
+ try: |
|
314 |
+ req = TenancyShotRequestInfo.objects.get(pk=maintenance_id, status=True) |
|
315 |
+ except TenancyShotRequestInfo.DoesNotExist: |
|
316 |
+ return response(TenancyStatusCode.TENANCY_SHOT_REQUEST_NOT_FOUND) |
|
317 |
+ |
|
318 |
+ tracking_info = {} |
|
319 |
+ if type_ == 'tracking': |
|
320 |
+ if req.express_com and req.tracking_number: |
|
321 |
+ tracking_info = KuaiDi100().track(req.express_com, req.tracking_number) |
|
322 |
+ req.tracking_info = tracking_info |
|
323 |
+ req.save() |
|
324 |
+ else: |
|
325 |
+ if req.back_express_com and req.back_tracking_number: |
|
326 |
+ tracking_info = KuaiDi100().track(req.back_express_com, req.back_tracking_number) |
|
327 |
+ req.back_tracking_info = tracking_info |
|
328 |
+ req.save() |
|
329 |
+ |
|
330 |
+ if tracking_info: |
|
331 |
+ try: |
|
332 |
+ tracking_info = json.loads(tracking_info) |
|
333 |
+ except Exception: |
|
334 |
+ tracking_info = {} |
|
335 |
+ |
|
336 |
+ if tracking_info: |
|
337 |
+ tenancy_tracking_info_subscribe(req, 'tracking') |
|
338 |
+ |
|
339 |
+ return response(data={ |
|
340 |
+ 'type': type_, |
|
341 |
+ 'tracking_info': tracking_info, |
|
252 | 342 |
}) |
@@ -23,7 +23,7 @@ def shot_list(request): |
||
23 | 23 |
page = request.POST.get('page', 1) |
24 | 24 |
num = request.POST.get('num', 20) |
25 | 25 |
|
26 |
- shots = TenancyShotInfo.objects.filter(status=True).order_by('-pk') |
|
26 |
+ shots = TenancyShotInfo.objects.filter(tenancy_status=0, status=True).order_by('-pk') |
|
27 | 27 |
shots = [shot.data for shot in shots] |
28 | 28 |
shots, left = pagination(shots, page, num) |
29 | 29 |
|
@@ -119,6 +119,9 @@ def shot_request_signed(request): |
||
119 | 119 |
|
120 | 120 |
req.tracking_signed_images = signed_images |
121 | 121 |
req.request_status = TenancyShotRequestInfo.TENANCY_TRACKING_SEND_SIGNED |
122 |
+ request_status_at = req.request_status_at |
|
123 |
+ request_status_at[TenancyShotRequestInfo.TENANCY_TRACKING_SEND_SIGNED] = tc.utc_datetime() |
|
124 |
+ req.request_status_at = request_status_at |
|
122 | 125 |
req.save() |
123 | 126 |
|
124 | 127 |
return response(data={ |
@@ -131,6 +134,8 @@ def shot_request_signed(request): |
||
131 | 134 |
def shot_request_sendback(request): |
132 | 135 |
req_id = request.POST.get('req_id') or request.POST.get('request_id') |
133 | 136 |
user_id = request.POST.get('user_id', '') |
137 |
+ back_express_com = request.POST.get('back_express_com', '') |
|
138 |
+ back_express_name = request.POST.get('back_express_name', '') |
|
134 | 139 |
back_tracking_number = request.POST.get('back_tracking_number', '') |
135 | 140 |
|
136 | 141 |
try: |
@@ -140,8 +145,13 @@ def shot_request_sendback(request): |
||
140 | 145 |
|
141 | 146 |
old_back_tracking_number = req.back_tracking_number |
142 | 147 |
|
148 |
+ req.back_express_com = back_express_com |
|
149 |
+ req.back_express_name = back_express_name |
|
143 | 150 |
req.back_tracking_number = back_tracking_number |
144 | 151 |
req.request_status = TenancyShotRequestInfo.TENANCY_TRACKING_BACK |
152 |
+ request_status_at = req.request_status_at |
|
153 |
+ request_status_at[TenancyShotRequestInfo.TENANCY_TRACKING_BACK] = tc.utc_datetime() |
|
154 |
+ req.request_status_at = request_status_at |
|
145 | 155 |
req.save() |
146 | 156 |
|
147 | 157 |
if back_tracking_number and back_tracking_number != old_back_tracking_number: |
@@ -355,6 +355,8 @@ urlpatterns += [ |
||
355 | 355 |
url(r'^admin/tenancy/shot/request/send$', tenancy_admin_views.shot_request_send, name='admin_tenancy_shot_request_send'), |
356 | 356 |
url(r'^admin/tenancy/shot/request/signed$', tenancy_admin_views.shot_request_signed, name='admin_tenancy_shot_request_signed'), |
357 | 357 |
|
358 |
+ url(r'^admin/tenancy/tracking/info$', tenancy_admin_views.shot_request_tracking_info, name='admin_shot_request_tracking_info'), |
|
359 |
+ |
|
358 | 360 |
# 快递信息回调接口 |
359 | 361 |
url(r'^tenancy/tracking/info/callback$', tenancy_views.tenancy_tracking_info_callback, name='tenancy_tracking_info_callback'), |
360 | 362 |
] |
@@ -57,10 +57,10 @@ class TenancyShotInfo(BaseModelMixin): |
||
57 | 57 |
|
58 | 58 |
|
59 | 59 |
class TenancyShotRequestInfo(BaseModelMixin): |
60 |
- TENANCY_TRACKING_SEND = u'寄出' |
|
61 |
- TENANCY_TRACKING_SEND_SIGNED = u'寄出已签收' |
|
62 |
- TENANCY_TRACKING_BACK = u'寄回' |
|
63 |
- TENANCY_TRACKING_BACK_SIGNED = u'寄回已签收并检查无损坏' |
|
60 |
+ TENANCY_TRACKING_SEND = u'寄出运送中' |
|
61 |
+ TENANCY_TRACKING_SEND_SIGNED = u'寄出签收' |
|
62 |
+ TENANCY_TRACKING_BACK = u'寄回运送中' |
|
63 |
+ TENANCY_TRACKING_BACK_SIGNED = u'寄回签收' |
|
64 | 64 |
|
65 | 65 |
AUDIT_PASS = 1 |
66 | 66 |
AUDIT_STATUS = ( |
@@ -152,7 +152,41 @@ class TenancyShotRequestInfo(BaseModelMixin): |
||
152 | 152 |
'back_tracking_signed': self.back_tracking_signed, |
153 | 153 |
'audit_status': self.audit_status, |
154 | 154 |
'request_status': self.request_status, |
155 |
- 'request_status_at': {k: tc.local_string(utc_dt=tc.string_to_utc_datetime(v, format='%Y-%m-%dT%H:%M:%S.%fZ')) for k, v in self.request_status_at.items()}, |
|
155 |
+ 'request_status_at': {k: tc.local_string(utc_dt=tc.string_to_utc_datetime(v, format='%Y-%m-%d')) for k, v in self.request_status_at.items()}, |
|
156 |
+ 'created_at': tc.local_string(tc.string_to_utc_datetime(self.created_at, format='%Y-%m-%d')), |
|
157 |
+ } |
|
158 |
+ |
|
159 |
+ @property |
|
160 |
+ def admindata(self): |
|
161 |
+ try: |
|
162 |
+ shot = TenancyShotInfo.objects.get(shot_id=self.shot_id) |
|
163 |
+ except TenancyShotInfo.DoesNotExist: |
|
164 |
+ shot = None |
|
165 |
+ return { |
|
166 |
+ 'req_id': self.request_id, |
|
167 |
+ 'request_id': self.request_id, |
|
168 |
+ 'shot_id': self.shot_id, |
|
169 |
+ 'shot_info': shot.data if shot else {}, |
|
170 |
+ 'user_id': self.user_id, |
|
171 |
+ 'name': self.name, |
|
172 |
+ 'phone': self.phone, |
|
173 |
+ 'location': self.location, |
|
174 |
+ 'postcode': self.postcode, |
|
175 |
+ 'purpose': self.purpose, |
|
176 |
+ 'return_date': tc.local_date_string(self.return_date), |
|
177 |
+ 'express_name': self.express_name, |
|
178 |
+ 'express_com': self.express_com, |
|
179 |
+ 'tracking_number': self.tracking_number, |
|
180 |
+ 'tracking_info': self.tracking_info, |
|
181 |
+ 'tracking_signed': self.tracking_signed, |
|
182 |
+ 'tracking_signed_images': self.tracking_signed_images, |
|
183 |
+ 'back_express_name': self.back_express_name, |
|
184 |
+ 'back_express_com': self.back_express_com, |
|
185 |
+ 'back_tracking_number': self.back_tracking_number, |
|
186 |
+ 'back_tracking_info': self.back_tracking_info, |
|
187 |
+ 'back_tracking_signed': self.back_tracking_signed, |
|
188 |
+ 'audit_status': self.audit_status, |
|
189 |
+ 'request_status': self.request_status, |
|
190 |
+ 'request_status_at': {k: tc.local_string(utc_dt=tc.string_to_utc_datetime(v, format='%Y-%m-%d %H:%M:%S')) for k, v in self.request_status_at.items()}, |
|
156 | 191 |
'created_at': tc.local_string(utc_dt=self.created_at), |
157 |
- 'updated_at': tc.local_string(utc_dt=self.updated_at), |
|
158 | 192 |
} |