Browse Source

修改绑定/解绑uid事务方式

locky 4 years ago
parent
commit
e985f6b6d6
1 changed files with 131 additions and 140 deletions
  1. 131 140
      Controller/SerialNumberController.py

+ 131 - 140
Controller/SerialNumberController.py

@@ -182,7 +182,6 @@ class SerialNumberView(View):
         else:
             return response.json(444)
 
-    @transaction.atomic
     def do_attach_uid(self, request_dict, response, request):
         serial_number = request_dict.get('serial_number', None)
         country_id = request_dict.get('country_id', None)
@@ -203,7 +202,6 @@ class SerialNumberView(View):
         if token != time_stamp or distance > 60000 or distance < -60000:  # 为了全球化时间控制在一天内
             return response.json(404)
 
-        mark = serial_number[6:9]
         serial = serial_number[0:6]
 
         try:
@@ -222,98 +220,97 @@ class SerialNumberView(View):
             if company_serial.status == 0:  # 该序列号未绑定企业
                 return response.json(173)
             elif company_serial.status == 1:    # 绑定uid
-                save_point = transaction.savepoint()    # 设置事务保存点
-                count = 0
-                # 获取序列号的p2p类型
-                p2p = SerialNumberModel.objects.filter(serial_number=serial).values('p2p')[0]['p2p']
-                while count < 3:
-                    # 查询是否存在未绑定序列号的uid
-                    uid_qs = UIDModel.objects.filter(vpg__company_id=company_serial.company.id,
-                                                     vpg__region_id=country_id, status=0, p2p_type=p2p). \
-                                                     order_by('id')
-                    if not uid_qs.exists():
-                        return response.json(173)
-
-                    uid = uid_qs[0]
-
-                    if DeviceSubType:
-                        # 获取最新的mac,判断分配到哪里,且进行绑定
-                        mac = MacModel.objects.filter().values('id', 'value', 'is_active')[0]
-                        current_mac = mac['value']
-                        username = 'cspublic@ansjer.com'
-                        if current_mac[-8:] == '1F:42:40':  # 一组一共1048576个,此mac是第100w个时
-                            sys_msg_text = "当前国外uid管理系统mac地址已分配到" + current_mac + ",此mac地址是当前组的第100w个,还剩下48576个可分配,mac地址即将用完。"
-                            S3Email().faEmail(sys_msg_text, username)
-                        elif current_mac[-8:] == '1F:90:60':  # 此mac是第102w个时
-                            sys_msg_text = "当前国外uid管理系统mac地址已分配到" + current_mac + ",此mac地址是当前组的第102w个,还剩下28576个可分配,mac地址即将用完。"
-                            S3Email().faEmail(sys_msg_text, username)
-                        elif not mac['is_active']:
-                            return response.json(175)
-                        elif current_mac[-8:] == '1F:FF:FF':
-                            MacModel.objects.filter().update(is_active=False)  # 更改mac可使用的状态,当再此调用接口时使用上面条件进行阻止
-                            sys_msg_text = "当前国外uid管理系统mac地址已分配到" + current_mac + ",mac地址已分配使用完,请更换分组。"
-                            S3Email().faEmail(sys_msg_text, username)
-                            return response.json(175)
-                        UIDModel.objects.filter(id=uid.id).update(mac=current_mac)  # 更新绑定uid的mac值
-                        # 绑定mac地址成功后更新mac表
-                        temp_mac = CommonService.updateMac(current_mac)  # mac地址值+1;后3个字节为FF时返回None
-                        if temp_mac:
-                            current_mac = temp_mac  # 更新赋值写入uid表
-                        else:
-                            temp_mac = current_mac  # 赋值为FF写入mac表
-                        MacModel.objects.filter().update(value=temp_mac, add_time=now_time,
-                                                         update_time=now_time)  # 更新mac表的mac地址值
-
-                    result = UIDModel.objects.filter(id=uid.id, status=0).\
-                        update(status=2, update_time=now_time)
-
-                    if int(result) <= 0:    # 更新失败
-                        count += 1
-                        continue
-
-                    # UID关联【企业关联序列号】表创建数据
-                    UIDCompanySerialModel.objects.create(uid_id=uid.id, company_serial_id=company_serial.id,
-                                                         add_time=now_time, update_time=now_time)
-
-                    company_serial.status = 2
-                    company_serial.save()
-
-                    dev = Device_Info.objects.filter(UID=uid.uid)
-                    if dev.exists():
-                        dev.update(serial_number=serial_number)
-
-                    full_uid_code = uid.full_uid_code
-                    if uid.platform in CRCKey.keys():
-                        full_uid_code += ':'+CRCKey[uid.platform]
-
-                    res = {
-                        'full_uid_code': CommonService.encode_data(full_uid_code),
-                        'uid': CommonService.encode_data(uid.uid),
-                        'mac': CommonService.encode_data(uid.mac),
-                        'extra': uid.uid_extra,
-                        'platform': uid.platform,
-                        'initString': uid.init_string,
-                        'initStringApp': uid.init_string_app,
-                    }
-
-                    # 记录操作日志
-                    ip = CommonService.get_ip_address(request)
-                    content = json.loads(json.dumps(request_dict))
-                    log = {
-                        'ip': ip,
-                        'user_id': 1,
-                        'status': 200,
-                        'time': now_time,
-                        'content': json.dumps(content),
-                        'url': 'serialNumber/attachUID',
-                        'operation': '序列号{}绑定uid: {}'.format(serial, uid.uid),
-                    }
-                    LogModel.objects.create(**log)
-
-                    transaction.savepoint_commit(save_point)    # 提交事务
-                    return response.json(0, res)
-                return response.json(5)
-            else:
+                with transaction.atomic():
+                    count = 0
+                    # 获取序列号的p2p类型
+                    p2p = SerialNumberModel.objects.filter(serial_number=serial).values('p2p')[0]['p2p']
+                    while count < 3:
+                        # 查询是否存在未绑定序列号的uid
+                        uid_qs = UIDModel.objects.filter(vpg__company_id=company_serial.company.id,
+                                                         vpg__region_id=country_id, status=0, p2p_type=p2p). \
+                                                         order_by('id')
+                        if not uid_qs.exists():
+                            return response.json(173)
+
+                        uid = uid_qs[0]
+
+                        if DeviceSubType:
+                            # 获取最新的mac,判断分配到哪里,且进行绑定
+                            mac = MacModel.objects.filter().values('id', 'value', 'is_active')[0]
+                            current_mac = mac['value']
+                            username = 'cspublic@ansjer.com'
+                            if current_mac[-8:] == '1F:42:40':  # 一组一共1048576个,此mac是第100w个时
+                                sys_msg_text = "当前国外uid管理系统mac地址已分配到" + current_mac + ",此mac地址是当前组的第100w个,还剩下48576个可分配,mac地址即将用完。"
+                                S3Email().faEmail(sys_msg_text, username)
+                            elif current_mac[-8:] == '1F:90:60':  # 此mac是第102w个时
+                                sys_msg_text = "当前国外uid管理系统mac地址已分配到" + current_mac + ",此mac地址是当前组的第102w个,还剩下28576个可分配,mac地址即将用完。"
+                                S3Email().faEmail(sys_msg_text, username)
+                            elif not mac['is_active']:
+                                return response.json(175)
+                            elif current_mac[-8:] == '1F:FF:FF':
+                                MacModel.objects.filter().update(is_active=False)  # 更改mac可使用的状态,当再此调用接口时使用上面条件进行阻止
+                                sys_msg_text = "当前国外uid管理系统mac地址已分配到" + current_mac + ",mac地址已分配使用完,请更换分组。"
+                                S3Email().faEmail(sys_msg_text, username)
+                                return response.json(175)
+                            UIDModel.objects.filter(id=uid.id).update(mac=current_mac)  # 更新绑定uid的mac值
+                            # 绑定mac地址成功后更新mac表
+                            temp_mac = CommonService.updateMac(current_mac)  # mac地址值+1;后3个字节为FF时返回None
+                            if temp_mac:
+                                current_mac = temp_mac  # 更新赋值写入uid表
+                            else:
+                                temp_mac = current_mac  # 赋值为FF写入mac表
+                            MacModel.objects.filter().update(value=temp_mac, add_time=now_time,
+                                                             update_time=now_time)  # 更新mac表的mac地址值
+
+                        result = UIDModel.objects.filter(id=uid.id, status=0).\
+                            update(status=2, update_time=now_time)
+
+                        if int(result) <= 0:    # 更新失败
+                            count += 1
+                            continue
+
+                        # UID关联【企业关联序列号】表创建数据
+                        UIDCompanySerialModel.objects.create(uid_id=uid.id, company_serial_id=company_serial.id,
+                                                             add_time=now_time, update_time=now_time)
+
+                        company_serial.status = 2
+                        company_serial.save()
+
+                        dev = Device_Info.objects.filter(UID=uid.uid)
+                        if dev.exists():
+                            dev.update(serial_number=serial_number)
+
+                        full_uid_code = uid.full_uid_code
+                        if uid.platform in CRCKey.keys():
+                            full_uid_code += ':'+CRCKey[uid.platform]
+
+                        res = {
+                            'full_uid_code': CommonService.encode_data(full_uid_code),
+                            'uid': CommonService.encode_data(uid.uid),
+                            'mac': CommonService.encode_data(uid.mac),
+                            'extra': uid.uid_extra,
+                            'platform': uid.platform,
+                            'initString': uid.init_string,
+                            'initStringApp': uid.init_string_app,
+                        }
+
+                        # 记录操作日志
+                        ip = CommonService.get_ip_address(request)
+                        content = json.loads(json.dumps(request_dict))
+                        log = {
+                            'ip': ip,
+                            'user_id': 1,
+                            'status': 200,
+                            'time': now_time,
+                            'content': json.dumps(content),
+                            'url': 'serialNumber/attachUID',
+                            'operation': '序列号{}绑定uid: {}'.format(serial, uid.uid),
+                        }
+                        LogModel.objects.create(**log)
+                        return response.json(0, res)
+
+                    return response.json(5)
+            else:   # 返回uid
                 uid_qs = UIDCompanySerialModel.objects.filter(company_serial_id=company_serial.id)
                 if not uid_qs.exists():
                     return response.json(173)
@@ -333,8 +330,6 @@ class SerialNumberView(View):
                 }
                 return response.json(0, res)
         except Exception as e:
-            if save_point:
-                transaction.savepoint_rollback(save_point)  # 事务回滚
             djangoLogger = logging.getLogger('django')
             djangoLogger.exception(repr(e))
             return response.json(176, str(e))
@@ -374,7 +369,6 @@ class SerialNumberView(View):
         else:
             return response.json(444)
 
-    @transaction.atomic
     def do_detach_uid(self, request, request_dict, response):
         token = request_dict.get('token', None)
         time_stamp = request_dict.get('time_stamp', None)
@@ -398,51 +392,48 @@ class SerialNumberView(View):
         uid_serial = uid_serial_qs[0]
 
         try:
-            save_point = transaction.savepoint()  # 设置事务保存点
-            # 删除iot设备信息表数据
-            iot = iotdeviceInfoModel.objects.filter(serial_number=serial)
-            if iot.exists():
-                iot.delete()
-
-            uid = uid_serial.uid.uid
-            company_serial_qs = CompanySerialModel.objects.filter(id=uid_serial.company_serial.id)
-            if company_serial_qs.exists():
-                company_serial = company_serial_qs[0]
-                company_serial.status = 1
-                company_serial.save()
-                dv_qs = Device_Info.objects.filter(UID=uid)
-                if dv_qs.exists():
-                    # 删除设备
-                    dv_qs.delete()
-                    # 删除设备影子信息uid_set   外键关联删除设备推送配置信息 uid_push
-                    up_qs = UidPushModel.objects.filter(uid_set__uid=uid)
-                    DetectControllerView().do_delete_redis(uid)
-                    if up_qs.count() > 1:
-                        UidPushModel.objects.filter(uid_set__uid=uid).delete()
-                    else:
-                        up_qs.delete()
-
-            UIDModel.objects.filter(uid=uid).update(status=0, mac='')    # 重置uid的使用状态为未分配
-            uid_serial.delete()
-
-            # 记录操作日志
-            ip = CommonService.get_ip_address(request)
-            content = json.loads(json.dumps(request_dict))
-            log = {
-                'ip': ip,
-                'user_id': 1,
-                'status': 200,
-                'time': now_time,
-                'content': json.dumps(content),
-                'url': 'serialNumber/detachUID',
-                'operation': '序列号{}解绑uid: {}'.format(serial, uid),
-            }
-            LogModel.objects.create(**log)
-            transaction.savepoint_commit(save_point)  # 提交事务
+            with transaction.atomic():
+                # 删除iot设备信息表数据
+                iot = iotdeviceInfoModel.objects.filter(serial_number=serial)
+                if iot.exists():
+                    iot.delete()
+
+                uid = uid_serial.uid.uid
+                company_serial_qs = CompanySerialModel.objects.filter(id=uid_serial.company_serial.id)
+                if company_serial_qs.exists():
+                    company_serial = company_serial_qs[0]
+                    company_serial.status = 1
+                    company_serial.save()
+                    dv_qs = Device_Info.objects.filter(UID=uid)
+                    if dv_qs.exists():
+                        # 删除设备
+                        dv_qs.delete()
+                        # 删除设备影子信息uid_set   外键关联删除设备推送配置信息 uid_push
+                        up_qs = UidPushModel.objects.filter(uid_set__uid=uid)
+                        DetectControllerView().do_delete_redis(uid)
+                        if up_qs.count() > 1:
+                            UidPushModel.objects.filter(uid_set__uid=uid).delete()
+                        else:
+                            up_qs.delete()
+
+                UIDModel.objects.filter(uid=uid).update(status=0, mac='')    # 重置uid的使用状态为未分配
+                uid_serial.delete()
+
+                # 记录操作日志
+                ip = CommonService.get_ip_address(request)
+                content = json.loads(json.dumps(request_dict))
+                log = {
+                    'ip': ip,
+                    'user_id': 1,
+                    'status': 200,
+                    'time': now_time,
+                    'content': json.dumps(content),
+                    'url': 'serialNumber/detachUID',
+                    'operation': '序列号{}解绑uid: {}'.format(serial, uid),
+                }
+                LogModel.objects.create(**log)
             return response.json(0)
         except Exception as e:
-            if save_point:
-                transaction.savepoint_rollback(save_point)  # 事务回滚
             djangoLogger = logging.getLogger('django')
             djangoLogger.exception(repr(e))
             return response.json(176, str(e))