123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441 |
- # -*- encoding: utf-8 -*-
- """
- @File : AgentCustomerController.py
- @Time : 2024/3/7 16:56
- @Author : stephen
- @Email : zhangdongming@asj6.wecom.work
- @Software: PyCharm
- """
- import time
- import json
- from django.http import QueryDict
- from django.views import View
- from django.core.paginator import Paginator
- from datetime import datetime
- from AgentModel.models import AgentCustomerInfo, AgentCustomerCard, AgentCustomerPackage, AgentCloudServicePackage, \
- AgentDeviceOrder
- from Model.models import UnicomCombo, Store_Meal, Device_User
- from Object.ResponseObject import ResponseObject
- from Object.TokenObject import TokenObject
- class AgentCustomerView(View):
- def get(self, request, *args, **kwargs):
- request.encoding = 'utf-8'
- operation = kwargs.get('operation')
- return self.validation(request.GET, request, operation)
- def post(self, request, *args, **kwargs):
- request.encoding = 'utf-8'
- operation = kwargs.get('operation')
- return self.validation(request.POST, request, operation)
- def delete(self, request, *args, **kwargs):
- request.encoding = 'utf-8'
- operation = kwargs.get('operation')
- delete = QueryDict(request.body)
- if not delete:
- delete = request.GET
- return self.validation(delete, request, operation)
- def put(self, request, *args, **kwargs):
- request.encoding = 'utf-8'
- operation = kwargs.get('operation')
- put = QueryDict(request.body)
- return self.validation(put, request, operation)
- def validation(self, request_dict, request, operation):
- AgentCustomerInfo.objects.filter()
- language = request_dict.get('language', 'en')
- response = ResponseObject(language, 'pc')
- if operation == 'getUnicomAndIcloud':
- return self.get_unicom_and_icloud(response)
- else:
- tko = TokenObject(
- request.META.get('HTTP_AUTHORIZATION'),
- returntpye='pc')
- if tko.code != 0:
- return response.json(tko.code)
- response.lang = tko.lang
- userID = tko.userID
- # 代理用户界面(代理顾客个人信息)
- if operation == 'getAgentInfo':
- return self.get_agent_info(userID, response)
- # 代理云存套餐
- elif operation == 'getAgentServicePackage':
- return self.get_agent_service_package(request_dict, response)
- elif operation == 'addAgentServicePackage':
- return self.add_agent_service_package(userID, request_dict, response)
- elif operation == 'updateAgentServicePackage':
- return self.update_agent_service_package(userID, request_dict, response)
- elif operation == 'delAgentServicePackage':
- return self.del_agent_service_package(request_dict, response)
- # 代理客户绑定套餐
- elif operation == 'getCustomerList':
- return self.get_customer_list(request_dict, response)
- elif operation == 'getCustomerPackageList':
- return self.get_cumstomer_package_list(request_dict, response)
- elif operation == 'batchRebindCustomerPackage':
- return self.batch_rebind_customer_packages(userID, request_dict, response)
- elif operation == 'getAgentServicePackageList':
- return self.get_agent_service_package_list(response)
- else:
- return response.json(444, 'operation')
- def get_unicom_and_icloud(self, response):
- """
- 查询云存储套餐和物联网卡套餐列表
- @param response: 响应对象
- @return:
- """
- try:
- # 云存储套餐查询,只包括is_show=1的记录
- store_meals = Store_Meal.objects.filter(is_show=1).values('id', 'bucket__bucket').distinct()
- # 联通套餐查询,只包括is_show=1且未被删除的记录
- unicom_combos = UnicomCombo.objects.filter(is_show=1, is_del=False).values('id', 'combo_name').distinct()
- # 将查询结果转换为列表
- store_meal_list = [{'id': meal['id'], 'name': meal['bucket__bucket']} for meal in store_meals]
- unicom_combo_list = [{'id': combo['id'], 'name': combo['combo_name']} for combo in unicom_combos]
- # 合并结果并返回
- return response.json(0, {
- 'storeMeals': store_meal_list,
- 'unicomCombos': unicom_combo_list,
- })
- except Exception as e:
- print(e)
- return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
- def get_agent_info(self, userID, response):
- """
- 查询用户信息
- @param userID: userID
- @param response: 响应对象
- @return:
- """
- try:
- # 使用userID查询AgentCustomerInfo获取基本信息
- agent_info = AgentCustomerInfo.objects.filter(user_id=userID, status=1).first()
- if not agent_info:
- return response.json(444, {'error': '没有找到这个代理用户'})
- # userID查询用户电话
- device_user_qs = Device_User.objects.filter(userID=userID).first()
- # 代理客户ID(ac_id)查询AgentCustomerCard获取银行卡信息。
- card_details = AgentCustomerCard.objects.filter(ac_id=agent_info.id, status=1).first()
- # ac_id查询AgentCustomerPackage来找到关联的云服务套餐ID(cs_id)
- package_ids = AgentCustomerPackage.objects.filter(ac_id=agent_info.id).values_list('cs_id',
- flat=True)
- # cs_id查询AgentCloudServicePackage获取服务套餐详情。
- service_packages = AgentCloudServicePackage.objects.filter(id__in=package_ids, status=1).values()
- result = {
- 'agent_info': {
- 'ac_id': agent_info.id,
- 'company_name': agent_info.company_name,
- 'phone': device_user_qs.phone,
- 'created_time': agent_info.created_time,
- 'service_packages': list(service_packages),
- }
- }
- if card_details:
- result['agent_info'].update({
- 'card_name': card_details.name,
- 'card_no': card_details.card_no,
- 'card_address': card_details.card_address,
- })
- return response.json(0, result)
- except Exception as e:
- return response.json({'error': str(e)}, status=500)
- def get_agent_service_package(self, request_dict, response):
- """
- 查询所有代理云服务套餐
- @param request_dict: 请求参数
- @request_dict page: 页码
- @request_dict page_size: 查询分页数
- @param response: 响应对象
- @return:
- """
- page = int(request_dict.get('page', 1))
- page_size = int(request_dict.get('page_size', 10))
- try:
- # 查询所有有效的代理云服务套餐
- all_packages = AgentCloudServicePackage.objects.filter(status=1).order_by('type', '-created_time')
- # 创建分页对象
- paginator = Paginator(all_packages, page_size)
- # 获取请求页的数据
- packages_page = paginator.page(page)
- # 准备响应数据,转换查询集为列表形式
- packages_list = list(packages_page.object_list.values(
- 'id', 'service_name', 'package_id', 'type',
- 'profit_type', 'cost', 'profit', 'status',
- 'created_time'
- ))
- # 返回分页数据
- return response.json(0, {
- 'page': page,
- 'page_size': page_size,
- 'total': paginator.count,
- 'num_pages': paginator.num_pages,
- 'list': packages_list
- })
- except Exception as e:
- # 出错时返回错误信息
- return response.json({'error': str(e)}, status=500)
- def add_agent_service_package(self, userID, request_dict, response):
- """
- 添加代理云服务套餐
- @param request_dict: 请求参数
- @request_dict package_id: 代理服务id
- @request_dict service_name: 代理服务名称
- @request_dict package_type: 套餐类型 1:云存,2:4G
- @response_dict profit_type: 利润分配类型 1:固定值,2:百分比
- @response_dict cost: 成本
- @response_dict profit: 利润值
- @param response: 响应对象
- @return:
- """
- package_id = request_dict.get('package_id', None)
- service_name = request_dict.get('service_name', None)
- package_type = int(request_dict.get('package_type', 0)) # 默认为0,确保类型安全
- profit_type = int(request_dict.get('profit_type', 1)) # 默认值为1
- profit = request_dict.get('profit', 0)
- cost = request_dict.get('cost', 0)
- try:
- # 创建AgentCloudServicePackage实例并保存
- if not all([package_id, service_name]):
- return response.json(444)
- if package_type == 1:
- query_set = Store_Meal.objects.filter(is_show=1, id=package_id)
- elif package_type == 2:
- query_set = UnicomCombo.objects.filter(is_show=1, is_del=False, id=package_id)
- else:
- return response.json(444, 'error package_type')
- if not query_set.exists():
- return response.json(173)
- AgentCloudServicePackage.objects.create(
- service_name=service_name,
- package_id=package_id,
- type=package_type,
- profit_type=profit_type,
- profit=profit,
- status=1,
- cost=cost,
- created_by=userID,
- created_time=int(time.time()),
- updated_by=userID,
- updated_time=int(time.time())
- )
- return response.json(0)
- except Exception as e:
- return response.json({'error': str(e)}, status=500)
- def update_agent_service_package(self, userID, request_dict, response):
- """
- 更新代理云服务套餐
- @param request_dict: 请求参数
- @request_dict package_id: 代理服务id
- @request_dict service_name: 代理服务名称
- @response_dict profit_type: 利润分配类型 1:固定值,2:百分比
- @response_dict cost: 成本
- @response_dict profit: 利润值
- @param response: 响应对象
- @return:
- """
- id = request_dict.get('id', None)
- service_name = request_dict.get('service_name', None)
- profit_type = request_dict.get('profit_type', None)
- cost = request_dict.get('cost', None)
- profit = request_dict.get('profit', None)
- if not all([id, service_name, profit_type, cost, profit]):
- return response.json(444)
- try:
- ac_service_package = AgentCloudServicePackage.objects.get(pk=id)
- ac_service_package.service_name = service_name
- ac_service_package.profit_type = profit_type
- ac_service_package.cost = cost
- ac_service_package.profit = profit
- ac_service_package.updated_time = int(time.time())
- ac_service_package.updated_by = userID
- ac_service_package.save()
- return response.json(0)
- except AgentCloudServicePackage.DoesNotExist:
- return response.json(173)
- except Exception as e:
- return response.json({'error': str(e)}, status=500)
- def del_agent_service_package(self, request_dict, response):
- """
- 删除代理云服务套餐
- @param userID: 用户ID(执行删除操作的用户)
- @param request_dict: 请求参数
- @request_dict package_id: 代理服务id
- @param response: 响应对象
- @return:
- """
- id = request_dict.get('id', None)
- if not id:
- return response.json(444, 'Missing package_id')
- try:
- ac_service_package = AgentCloudServicePackage.objects.get(pk=id)
- #假删除,否则查利润会出问题
- ac_service_package.status=0
- ac_service_package.save()
- return response.json(0)
- except AgentCloudServicePackage.DoesNotExist:
- return response.json(173, 'Package does not exist.')
- except Exception as e:
- return response.json(500, {'error': str(e)})
- def get_customer_list(self, request_dict, response):
- """
- 查询代理商信息,并进行分页处理
- @param request_dict: 请求对象,用于接收分页参数
- @param response: 响应对象
- @return:
- """
- # 接收分页参数
- page = int(request_dict.get('page', 1))
- page_size = int(request_dict.get('page_size', 10))
- # 查询AgentCustomerInfo表以获取代理商基本信息
- agent_infos = AgentCustomerInfo.objects.filter(status=1).values(
- 'id', 'user_id', 'company_name'
- ).order_by('id')
- try:
- # 使用Paginator进行分页处理
- paginator = Paginator(agent_infos, page_size)
- # 获取请求页的数据
- packages_page = paginator.page(page)
- # 准备最终的代理商列表
- agents_list = []
- for agent_info in packages_page:
- # 查询Device_User表获取用户信息
- user_info = Device_User.objects.filter(userID=agent_info['user_id']).values('phone',
- 'userEmail').first()
- # 查询AgentCustomerCard表获取卡信息
- card_info = AgentCustomerCard.objects.filter(ac_id=agent_info['id']).values('name', 'card_no',
- 'card_address').first()
- # 组合信息
- agent_record = {
- 'id': agent_info['id'],
- 'company_name': agent_info['company_name'],
- 'user_id': agent_info['user_id'],
- 'phone': user_info.get('phone') if user_info else None,
- 'userEmail': user_info.get('userEmail') if user_info else None,
- 'card_name': card_info.get('name') if card_info else None,
- 'card_no': card_info.get('card_no') if card_info else None,
- 'card_address': card_info.get('card_address') if card_info else None,
- }
- agents_list.append(agent_record)
- return response.json(0, {'page': page, 'page_size': page_size, 'total': paginator.count,
- 'num_pages': paginator.num_pages, 'list': agents_list})
- except Exception as e:
- print(e)
- return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
- def get_cumstomer_package_list(self, request_dict, response):
- """
- 查询代理商服务套餐列表
- @param response: 响应对象
- @return:
- """
- ac_id = request_dict.get('id', None)
- try:
- if ac_id is None:
- return response.json(444, 'Missing ac_id')
- # ac_id查询AgentCustomerPackage来找到关联的云服务套餐ID(cs_id)
- package_ids = AgentCustomerPackage.objects.filter(ac_id=ac_id).values_list('cs_id', flat=True)
- # cs_id查询AgentCloudServicePackage获取服务套餐详情。
- service_packages = AgentCloudServicePackage.objects.filter(id__in=package_ids, status=1).values(
- 'id', 'service_name', 'type'
- )
- service_packages_list = list(service_packages)
- return response.json(0, {'service_packages': service_packages_list})
- except Exception as e:
- print(e)
- return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
- def batch_rebind_customer_packages(self, userID, request_dict, response):
- """
- 清空并重新绑定代理商服务套餐
- @param userID: 操作用户的ID
- @param request_dict: 请求参数,包含代理商ID和新的服务套餐ID列表
- @param response: 响应对象
- @return:
- """
- ac_id = request_dict.get('ac_id', None) # 代理客户ID
- new_cs_ids = json.loads(request_dict.get('cs_ids', '[]')) # 新的服务套餐ID列表
- if not ac_id:
- return response.json(444, 'Missing agent customer ID.')
- if not new_cs_ids:
- return response.json(444, 'Service package IDs are required.')
- try:
- # 删除该代理客户的所有现有绑定
- AgentCustomerPackage.objects.filter(ac_id=ac_id).delete()
- # 过滤出存在且状态为有效的套餐ID
- valid_new_cs_ids = AgentCloudServicePackage.objects.filter(id__in=new_cs_ids, status=1).values_list('id',
- flat=True)
- # 准备批量创建的数据
- packages_to_bind = [
- AgentCustomerPackage(
- ac_id=ac_id,
- cs_id=cs_id,
- created_by=userID,
- updated_by=userID,
- created_time=int(time.time()),
- updated_time=int(time.time())
- )
- for cs_id in valid_new_cs_ids
- ]
- # 批量创建新的绑定关系
- AgentCustomerPackage.objects.bulk_create(packages_to_bind)
- return response.json(0)
- except Exception as e:
- print(e)
- return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
- def get_agent_service_package_list(self, response):
- """
- 查询云服务套餐列表 id + service_name
- @param response: 响应对象
- @return:
- """
- try:
- # 查询所有有效的代理云服务套餐
- all_packages = AgentCloudServicePackage.objects.filter(status=1).order_by('-created_time').values('id',
- 'service_name')
- # 转换查询集为列表形式
- packages_list = list(all_packages)
- # 返回数据
- return response.json(0, {'packages': packages_list})
- except Exception as e:
- # 出错时返回错误信息
- return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
|