Procházet zdrojové kódy

优化重置流量、加入生成免费订单记录逻辑

zhangdongming před 2 roky
rodič
revize
58921327b5

+ 75 - 27
Controller/UnicomCombo/UnicomComboController.py

@@ -52,15 +52,15 @@ class UnicomComboView(View):
             return HttpResponse('SUCCESS')
         elif operation == 'device-queue-monitoring':
             return self.device_queue_monitoring_push(request_dict, request)
-        elif operation == 'device-status-change':
+        elif operation == 'device-status-change':  # SIM卡修改状态,异步通知接口
             return self.device_status_change_push(request_dict, request)
-        elif operation == 'device-bind':
+        elif operation == 'device-bind':  # 服务器保存设备的ICCID
             return self.device_add(request_dict, response)
-        elif operation == 'device-status':
+        elif operation == 'device-status':  # PC调用解绑SIM卡用户,清除套餐数据
             return self.update_device_status(request_dict, response)
-        elif operation == 'update-card':
+        elif operation == 'update-card':  # 更新SIM类型
             return self.update_device_card_type(request_dict, response)
-        elif operation == 'xxx-sign':
+        elif operation == 'xxx-sign':  # 获取签名用于测试
             return self.get_test_sign(request_dict, response)
         else:
             token = TokenObject(request.META.get('HTTP_AUTHORIZATION'))
@@ -69,16 +69,18 @@ class UnicomComboView(View):
             if token.code != 0:
                 return response.json(token.code)
             user_id = token.userID
-            if operation == 'combo-save':
+            if operation == 'combo-save':  # 创建套餐
                 return self.save_unicom_combo(request_dict, response)
-            elif operation == 'combo-pay':
+            elif operation == 'combo-pay':  # 套餐支付
                 return self.buy_unicom_combo(user_id, request_dict, request, response)
-            elif operation == 'combo-list':
+            elif operation == 'combo-list':  # 获取套餐列表
                 return self.query_package_list(response)
-            elif operation == 'get-device-info':
+            elif operation == 'get-device-info':  # 获取SIM卡信息
                 return self.get_device_info(request_dict, response)
-            elif operation == 'user-combo-query':
+            elif operation == 'user-combo-query':  # 用户套餐信息查询
                 return self.user_combo_query(user_id, request_dict, response)
+            else:
+                return response.json(0)
 
     @classmethod
     def user_combo_query(cls, user_id, request_dict, response):
@@ -96,9 +98,9 @@ class UnicomComboView(View):
             unicom_device_info_qs = UnicomDeviceInfo.objects.filter(iccid=iccid)
             if not unicom_device_info_qs.exists():
                 return response.json(173)
-            now_time = int(time.time())
-            if not unicom_device_info_qs[0].user_id:
-                unicom_device_info_qs.update(user_id=user_id, updated_time=now_time)
+            if not unicom_device_info_qs[0].user_id:  # 用户SIM卡未绑定用户则进行自动绑定
+                serial_no = unicom_device_info_qs[0].serial_no
+                cls.experience_order_4G(iccid, serial_no, user_id)  # 生成4G体验订单
             unicom_api = UnicomObjeect()
             combo_order_qs = UnicomComboOrderInfo.objects.filter(iccid=iccid, status=1, is_del=False) \
                 .values('iccid', 'status', 'combo__status', 'combo__combo_name', 'combo__combo_type',
@@ -141,10 +143,54 @@ class UnicomComboView(View):
                 cls.update_combo_order_sort(iccid)
                 return response.json(0, flow_details)
         except Exception as e:
-            print(e.args)
-            ex = traceback.format_exc()
-            print(ex)
-            return response.json(177, ex)
+            logging.info('异常错误,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return response.json(177, e)
+
+    @classmethod
+    def experience_order_4G(cls, icc_id, serial_no, user_id):
+        """
+        保存订单信息
+        @param icc_id: SIM卡20位iccid
+        @param serial_no: 序列号
+        @param user_id: userID
+        @return: True | False
+        """
+        try:
+            while transaction.atomic():
+                n_time = int(time.time())
+                # 获取套餐信息
+                combo_info_qs = UnicomCombo.objects.filter(combo_type=1, status=0, is_del=False) \
+                    .values('id', 'combo_name', 'price', 'virtual_price', 'remark').order_by('sort')
+                if not combo_info_qs.exists():
+                    return False
+                combo_info_vo = combo_info_qs[0]
+                # 获取套餐订单信息
+                combo_order_qs = UnicomComboOrderInfo.objects.filter(iccid=icc_id, combo_id=combo_info_vo['id'])
+                if not combo_order_qs.exists():
+                    return False
+                c_time = combo_order_qs[0].created_time
+                # 根据序列号获取UID
+                uid = CommonService.query_uid_with_serial(serial_no)
+                order_id = CommonService.createOrderID()
+                rank_id, ai_rank_id = cls.get_cloud_or_ai_combo()  # 生成订单必须添加该字段
+                order_dict = {'orderID': order_id, 'UID': uid, 'rank_id': rank_id, 'ai_rank_id': ai_rank_id,
+                              'userID_id': user_id, 'desc': combo_info_vo['combo_name'], 'payType': 10,
+                              'payTime': c_time, 'price': combo_info_vo['price'], 'addTime': c_time,
+                              'updTime': c_time, 'status': 1,
+                              'unify_combo_id': str(combo_info_vo['id']), 'order_type': 2,
+                              'store_meal_name': combo_info_vo['combo_name']
+                              }
+                order_qs = Order_Model.objects.filter(UID=uid, userID=user_id, order_type=2,
+                                                      unify_combo_id=str(combo_info_vo['id']))
+                if not order_qs.exists():
+                    Order_Model.objects.create(**order_dict)
+                    combo_order_qs.update(order_id=order_id)
+                UnicomDeviceInfo.objects.filter(iccid=icc_id).update(user_id=user_id, updated_time=n_time)
+                return True
+        except Exception as e:
+            print('生成4G体验订单异常,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            logging.info('生成4G体验订单异常,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+            return False
 
     @classmethod
     def get_combo_order_list(cls, iccid):
@@ -196,19 +242,15 @@ class UnicomComboView(View):
     @classmethod
     def update_device_status(cls, request_dict, response):
         """
-        修改绑定设备状态,如产生免费套餐用量则删除
-        @param request_dict:
-        @param response:
-        @return:
+        重置SIM卡绑定状态修改为测试完成,以及重置流量,删除订单信息、删除系统消息
         """
         logger = logging.getLogger('info')
-
         serial_no = request_dict.get('serialNo', None)
         time_stamp = request_dict.get('timeStamp', None)
         sign = request_dict.get('sign', None)
         if not all([serial_no, sign, time_stamp]):
             return response.json(444)
-        logger.info('PC工具进入重置ICCID{}'.format(serial_no))
+        logger.info('PC工具进入重置SIM卡{}'.format(serial_no))
         try:
             if not CommonService.check_time_stamp_token(sign, time_stamp):
                 return response.json(13)
@@ -216,7 +258,7 @@ class UnicomComboView(View):
             redis = RedisObject()
             with transaction.atomic():
                 device_info_qs = UnicomDeviceInfo.objects.filter(serial_no=serial_no)
-                if device_info_qs.exists():
+                if device_info_qs.exists():  # 首先查询SIM卡绑定信息是否存在
                     iccid = device_info_qs.first().iccid
                     if device_info_qs.first().card_type == 1:
                         cls.reset_telecom_user(serial_no)
@@ -224,19 +266,25 @@ class UnicomComboView(View):
                         return response.json(0)
                     key = 'ASJ:UNICOM:RESET:{}'.format(serial_no)
                     flow_push_qs = UnicomFlowPush.objects.filter(serial_no=serial_no)
-                    if flow_push_qs.exists():
+                    if flow_push_qs.exists():  # 删除流量预警推送
                         flow_push_qs.delete()
                     sys_msg_qs = SysMsgModel.objects.filter(uid=serial_no)
-                    if sys_msg_qs.exists():
+                    if sys_msg_qs.exists():  # 删除有关系统消息数据
                         sys_msg_qs.delete()
                     device_info_qs.update(status=1, updated_time=now_time, user_id='')
                     combo_order_qs = UnicomComboOrderInfo.objects.filter(iccid=iccid)
+                    order_list = []
                     if combo_order_qs.exists():
+                        for item in combo_order_qs:
+                            if item.order_id:
+                                order_list.append(item.order_id)
                         combo_order_qs.delete()
                     combo_experience_history_qs = UnicomComboExperienceHistory.objects.filter(iccid=iccid)
                     if combo_experience_history_qs.exists():
                         combo_experience_history_qs.delete()
-                    redis.set_data(key, iccid, 60 * 30)
+                    # 删除4G套餐订单
+                    Order_Model.objects.filter(orderID__in=order_list).delete()
+                    redis.set_data(key, iccid, 60 * 30)  # 缓存当前SIM卡,记录为半个小时内无法赠送免费流量套餐。
                     UnicomObjeect().change_device_to_activate(iccid)
                 return response.json(0)
         except Exception as e:

+ 20 - 16
Object/UnicomObject.py

@@ -308,21 +308,25 @@ class UnicomObjeect:
             return True
         return None
 
+    @staticmethod
+    def current_sim_traffic_usage_details(icc_id):
+        """
+        当前sim卡流量使用详情
+        @param icc_id:20位数字iccid
+        @return: traffic
+        """
+        redis = RedisObject()
+        traffic_key = 'ASJ:UNICOM:FLOW:{}'.format(icc_id)
+        traffic_sys = 'ASJ:SIM:TRAFFIC:{}'.format(icc_id)
+        traffic_val = redis.get_data(traffic_key)
+        if traffic_val:
+            traffic_dict = json.loads(traffic_val)
+            redis.set_data(key=traffic_sys, val=traffic_val, expire=60 * 60 * 24)
+        else:
+            traffic_val = redis.get_data(traffic_sys)
+            if not traffic_val:
+                return 0
+            traffic_dict = json.loads(traffic_val)
+        return traffic_dict['data']['flowTotalUsage']
 
-if __name__ == '__main__':
-    unicom_api = UnicomObjeect()
-    # result = unicom_api.generate_token()
-    # result = unicom_api.refresh_token('5d0c0f30-99bd-4f17-9614-3524495b05d4')
-    params = {'iccid': '89860620170009631443', 'status': 1}
-    # response = unicom_api.verify_device(**params)
-    # response = unicom_api.query_device_status(**params)
-    response = unicom_api.update_device_state(**params)
-    # response = unicom_api.query_device_usage_history(**params)
-    # response = unicom_api.query_current_renew_list_usage_details(**params)
-    # unicom_api.get_device_batch_detail()
-    # response = unicom_api.query_package_list(**params)
-    # response = unicom_api.query_renewal_list(**params)
 
-    if response.status_code == 200:
-        res = json.loads(response.text)
-        print(res)