AgentCustomerController.py 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462
  1. # -*- encoding: utf-8 -*-
  2. """
  3. @File : AgentCustomerController.py
  4. @Time : 2024/3/7 16:56
  5. @Author : stephen
  6. @Email : zhangdongming@asj6.wecom.work
  7. @Software: PyCharm
  8. """
  9. import time
  10. import json
  11. from django.http import QueryDict
  12. from django.views import View
  13. from django.core.paginator import Paginator
  14. from datetime import datetime
  15. from AgentModel.models import AgentCustomerInfo, AgentCustomerCard, AgentCustomerPackage, AgentCloudServicePackage, \
  16. AgentDeviceOrder
  17. from Model.models import UnicomCombo, Store_Meal, Device_User
  18. from Object.ResponseObject import ResponseObject
  19. from Object.TokenObject import TokenObject
  20. class AgentCustomerView(View):
  21. def get(self, request, *args, **kwargs):
  22. request.encoding = 'utf-8'
  23. operation = kwargs.get('operation')
  24. return self.validation(request.GET, request, operation)
  25. def post(self, request, *args, **kwargs):
  26. request.encoding = 'utf-8'
  27. operation = kwargs.get('operation')
  28. return self.validation(request.POST, request, operation)
  29. def delete(self, request, *args, **kwargs):
  30. request.encoding = 'utf-8'
  31. operation = kwargs.get('operation')
  32. delete = QueryDict(request.body)
  33. if not delete:
  34. delete = request.GET
  35. return self.validation(delete, request, operation)
  36. def put(self, request, *args, **kwargs):
  37. request.encoding = 'utf-8'
  38. operation = kwargs.get('operation')
  39. put = QueryDict(request.body)
  40. return self.validation(put, request, operation)
  41. def validation(self, request_dict, request, operation):
  42. AgentCustomerInfo.objects.filter()
  43. language = request_dict.get('language', 'en')
  44. response = ResponseObject(language, 'pc')
  45. if operation == 'getUnicomAndIcloud':
  46. return self.get_unicom_and_icloud(response)
  47. else:
  48. tko = TokenObject(
  49. request.META.get('HTTP_AUTHORIZATION'),
  50. returntpye='pc')
  51. if tko.code != 0:
  52. return response.json(tko.code)
  53. response.lang = tko.lang
  54. userID = tko.userID
  55. # 代理用户界面(代理顾客个人信息)
  56. if operation == 'getAgentInfo':
  57. return self.get_agent_info(userID, response)
  58. # 代理云存套餐
  59. elif operation == 'getAgentServicePackage':
  60. return self.get_agent_service_package(request_dict, response)
  61. elif operation == 'addAgentServicePackage':
  62. return self.add_agent_service_package(userID, request_dict, response)
  63. elif operation == 'updateAgentServicePackage':
  64. return self.update_agent_service_package(userID, request_dict, response)
  65. elif operation == 'delAgentServicePackage':
  66. return self.del_agent_service_package(request_dict, response)
  67. # 代理客户绑定套餐
  68. elif operation == 'getCustomerList':
  69. return self.get_customer_list(request_dict, response)
  70. elif operation == 'getCustomerPackageList':
  71. return self.get_cumstomer_package_list(request_dict, response)
  72. elif operation == 'batchAddCustomerPackage':
  73. return self.batch_add_customer_package(userID, request_dict, response)
  74. elif operation == 'batchDeleteCustomerPackage':
  75. return self.batch_del_cumstomer_package(request_dict, response)
  76. elif operation == 'getAgentServicePackageList':
  77. return self.get_agent_service_package_list(response)
  78. else:
  79. return response.json(444, 'operation')
  80. def get_unicom_and_icloud(self, response):
  81. """
  82. 查询云存储套餐和物联网卡套餐列表
  83. @param response: 响应对象
  84. @return:
  85. """
  86. try:
  87. # 云存储套餐查询,只包括is_show=1的记录
  88. store_meals = Store_Meal.objects.filter(is_show=1).values('id', 'bucket__bucket').distinct()
  89. # 联通套餐查询,只包括is_show=1且未被删除的记录
  90. unicom_combos = UnicomCombo.objects.filter(is_show=1, is_del=False).values('id', 'combo_name').distinct()
  91. # 将查询结果转换为列表
  92. store_meal_list = [{'id': meal['id'], 'name': meal['bucket__bucket']} for meal in store_meals]
  93. unicom_combo_list = [{'id': combo['id'], 'name': combo['combo_name']} for combo in unicom_combos]
  94. # 合并结果并返回
  95. return response.json(0, {
  96. 'storeMeals': store_meal_list,
  97. 'unicomCombos': unicom_combo_list,
  98. })
  99. except Exception as e:
  100. print(e)
  101. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  102. def get_agent_info(self, userID, response):
  103. """
  104. 查询用户信息
  105. @param userID: userID
  106. @param response: 响应对象
  107. @return:
  108. """
  109. try:
  110. # 使用userID查询AgentCustomerInfo获取基本信息
  111. agent_info = AgentCustomerInfo.objects.filter(user_id=userID, status=1).first()
  112. if not agent_info:
  113. return response.json(444, {'error': '没有找到这个代理用户'})
  114. # userID查询用户电话
  115. device_user_qs = Device_User.objects.filter(userID=userID).first()
  116. # 代理客户ID(ac_id)查询AgentCustomerCard获取银行卡信息。
  117. card_details = AgentCustomerCard.objects.filter(ac_id=agent_info.id, status=1).first()
  118. # ac_id查询AgentCustomerPackage来找到关联的云服务套餐ID(cs_id)
  119. package_ids = AgentCustomerPackage.objects.filter(ac_id=agent_info.id).values_list('cs_id',
  120. flat=True)
  121. # cs_id查询AgentCloudServicePackage获取服务套餐详情。
  122. service_packages = AgentCloudServicePackage.objects.filter(id__in=package_ids, status=1).values()
  123. result = {
  124. 'agent_info': {
  125. 'ac_id': agent_info.id,
  126. 'company_name': agent_info.company_name,
  127. 'phone': device_user_qs.phone,
  128. 'created_time': agent_info.created_time,
  129. 'service_packages': list(service_packages),
  130. }
  131. }
  132. if card_details:
  133. result['agent_info'].update({
  134. 'card_name': card_details.name,
  135. 'card_no': card_details.card_no,
  136. 'card_address': card_details.card_address,
  137. })
  138. return response.json(0, result)
  139. except Exception as e:
  140. return response.json({'error': str(e)}, status=500)
  141. def get_agent_service_package(self, request_dict, response):
  142. """
  143. 查询所有代理云服务套餐
  144. @param request_dict: 请求参数
  145. @request_dict page: 页码
  146. @request_dict page_size: 查询分页数
  147. @param response: 响应对象
  148. @return:
  149. """
  150. page = int(request_dict.get('page', 1))
  151. page_size = int(request_dict.get('page_size', 10))
  152. try:
  153. # 查询所有有效的代理云服务套餐
  154. all_packages = AgentCloudServicePackage.objects.filter(status=1).order_by('-created_time')
  155. # 创建分页对象
  156. paginator = Paginator(all_packages, page_size)
  157. # 获取请求页的数据
  158. packages_page = paginator.page(page)
  159. # 准备响应数据,转换查询集为列表形式
  160. packages_list = list(packages_page.object_list.values(
  161. 'id', 'service_name', 'package_id', 'type',
  162. 'profit_type', 'cost', 'profit', 'status',
  163. 'created_time', 'updated_time'
  164. ))
  165. # 返回分页数据
  166. return response.json(0, {
  167. 'page': page,
  168. 'page_size': page_size,
  169. 'total': paginator.count,
  170. 'num_pages': paginator.num_pages,
  171. 'list': packages_list
  172. })
  173. except Exception as e:
  174. # 出错时返回错误信息
  175. return response.json({'error': str(e)}, status=500)
  176. def add_agent_service_package(self, userID, request_dict, response):
  177. """
  178. 添加代理云服务套餐
  179. @param request_dict: 请求参数
  180. @request_dict package_id: 代理服务id
  181. @request_dict service_name: 代理服务名称
  182. @request_dict package_type: 套餐类型 1:云存,2:4G
  183. @response_dict profit_type: 利润分配类型 1:固定值,2:百分比
  184. @response_dict cost: 成本
  185. @response_dict profit: 利润值
  186. @param response: 响应对象
  187. @return:
  188. """
  189. package_id = request_dict.get('package_id', None)
  190. service_name = request_dict.get('service_name', None)
  191. package_type = int(request_dict.get('package_type', 0)) # 默认为0,确保类型安全
  192. profit_type = int(request_dict.get('profit_type', 1)) # 默认值为1
  193. profit = request_dict.get('profit', 0)
  194. cost = request_dict.get('cost', 0)
  195. try:
  196. # 创建AgentCloudServicePackage实例并保存
  197. if not all([package_id, service_name]):
  198. return response.json(444)
  199. if package_type == 1:
  200. query_set = Store_Meal.objects.filter(is_show=1, id=package_id)
  201. elif package_type == 2:
  202. query_set = UnicomCombo.objects.filter(is_show=1, is_del=False, id=package_id)
  203. else:
  204. return response.json(444, 'error package_type')
  205. if not query_set.exists():
  206. return response.json(173)
  207. AgentCloudServicePackage.objects.create(
  208. service_name=service_name,
  209. package_id=package_id,
  210. type=package_type,
  211. profit_type=profit_type,
  212. profit=profit,
  213. status=1,
  214. cost=cost,
  215. created_by=userID,
  216. created_time=int(time.time()),
  217. updated_by=userID,
  218. updated_time=int(time.time())
  219. )
  220. return response.json(0)
  221. except Exception as e:
  222. return response.json({'error': str(e)}, status=500)
  223. def update_agent_service_package(self, userID, request_dict, response):
  224. """
  225. 更新代理云服务套餐
  226. @param request_dict: 请求参数
  227. @request_dict package_id: 代理服务id
  228. @request_dict service_name: 代理服务名称
  229. @response_dict profit_type: 利润分配类型 1:固定值,2:百分比
  230. @response_dict cost: 成本
  231. @response_dict profit: 利润值
  232. @param response: 响应对象
  233. @return:
  234. """
  235. id = request_dict.get('id', None)
  236. service_name = request_dict.get('service_name', None)
  237. profit_type = request_dict.get('profit_type', None)
  238. cost = request_dict.get('cost', None)
  239. profit = request_dict.get('profit', None)
  240. if not all([id, service_name, profit_type, cost, profit]):
  241. return response.json(444)
  242. try:
  243. ac_service_package = AgentCloudServicePackage.objects.get(pk=id)
  244. ac_service_package.service_name = service_name
  245. ac_service_package.profit_type = profit_type
  246. ac_service_package.cost = cost
  247. ac_service_package.profit = profit
  248. ac_service_package.updated_time = int(time.time())
  249. ac_service_package.updated_by = userID
  250. ac_service_package.save()
  251. return response.json(0)
  252. except AgentCloudServicePackage.DoesNotExist:
  253. return response.json(173)
  254. except Exception as e:
  255. return response.json({'error': str(e)}, status=500)
  256. def del_agent_service_package(self, request_dict, response):
  257. """
  258. 删除代理云服务套餐
  259. @param userID: 用户ID(执行删除操作的用户)
  260. @param request_dict: 请求参数
  261. @request_dict package_id: 代理服务id
  262. @param response: 响应对象
  263. @return:
  264. """
  265. id = request_dict.get('id', None)
  266. if not id:
  267. return response.json(444, 'Missing package_id')
  268. try:
  269. ac_service_package = AgentCloudServicePackage.objects.get(pk=id)
  270. #假删除,否则查利润会出问题
  271. ac_service_package.status=0
  272. ac_service_package.save()
  273. return response.json(0)
  274. except AgentCloudServicePackage.DoesNotExist:
  275. return response.json(173, 'Package does not exist.')
  276. except Exception as e:
  277. return response.json(500, {'error': str(e)})
  278. def get_customer_list(self, request_dict, response):
  279. """
  280. 查询代理商信息,并进行分页处理
  281. @param request_dict: 请求对象,用于接收分页参数
  282. @param response: 响应对象
  283. @return:
  284. """
  285. # 接收分页参数
  286. page = int(request_dict.get('page', 1))
  287. page_size = int(request_dict.get('page_size', 10))
  288. # 查询AgentCustomerInfo表以获取代理商基本信息
  289. agent_infos = AgentCustomerInfo.objects.filter(status=1).values(
  290. 'id', 'user_id', 'company_name'
  291. ).order_by('id')
  292. try:
  293. # 使用Paginator进行分页处理
  294. paginator = Paginator(agent_infos, page_size)
  295. # 获取请求页的数据
  296. packages_page = paginator.page(page)
  297. # 准备最终的代理商列表
  298. agents_list = []
  299. for agent_info in packages_page:
  300. # 查询Device_User表获取用户信息
  301. user_info = Device_User.objects.filter(userID=agent_info['user_id']).values('phone',
  302. 'userEmail').first()
  303. # 查询AgentCustomerCard表获取卡信息
  304. card_info = AgentCustomerCard.objects.filter(ac_id=agent_info['id']).values('name', 'card_no',
  305. 'card_address').first()
  306. # 组合信息
  307. agent_record = {
  308. 'id': agent_info['id'],
  309. 'company_name': agent_info['company_name'],
  310. 'user_id': agent_info['user_id'],
  311. 'phone': user_info.get('phone') if user_info else None,
  312. 'userEmail': user_info.get('userEmail') if user_info else None,
  313. 'card_name': card_info.get('name') if card_info else None,
  314. 'card_no': card_info.get('card_no') if card_info else None,
  315. 'card_address': card_info.get('card_address') if card_info else None,
  316. }
  317. agents_list.append(agent_record)
  318. return response.json(0, {'page': page, 'page_size': page_size, 'total': paginator.count,
  319. 'num_pages': paginator.num_pages, 'list': agents_list})
  320. except Exception as e:
  321. print(e)
  322. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  323. def get_cumstomer_package_list(self, request_dict, response):
  324. """
  325. 查询代理商服务套餐列表
  326. @param response: 响应对象
  327. @return:
  328. """
  329. ac_id = request_dict.get('id', None)
  330. try:
  331. if ac_id is None:
  332. return response.json(444, 'Missing ac_id')
  333. # ac_id查询AgentCustomerPackage来找到关联的云服务套餐ID(cs_id)
  334. package_ids = AgentCustomerPackage.objects.filter(ac_id=ac_id).values_list('cs_id', flat=True)
  335. # cs_id查询AgentCloudServicePackage获取服务套餐详情。
  336. service_packages = AgentCloudServicePackage.objects.filter(id__in=package_ids, status=1).values()
  337. service_packages_list = list(service_packages)
  338. return response.json(0, {'service_packages': service_packages_list})
  339. except Exception as e:
  340. print(e)
  341. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  342. def batch_add_customer_package(self, userID, request_dict, response):
  343. """
  344. 代理商批量绑定服务套餐
  345. @param userID: 操作用户的ID
  346. @param request_dict: 请求参数,包含代理商ID和服务套餐ID列表
  347. @param response: 响应对象
  348. @return:
  349. """
  350. ac_id = request_dict.get('ac_id', None) # 代理客户ID
  351. cs_ids = json.loads(request_dict.get('cs_ids', '[]')) # 服务套餐ID列表
  352. # 校验输入
  353. if not ac_id:
  354. return response.json(444, 'Missing agent customer ID.')
  355. try:
  356. # 查询该代理客户已经绑定的服务套餐ID
  357. existing_cs_ids = AgentCustomerPackage.objects.filter(ac_id=ac_id).values_list('cs_id', flat=True)
  358. # 确定尚未绑定的服务套餐ID
  359. new_cs_ids = [cs_id for cs_id in cs_ids if cs_id not in existing_cs_ids]
  360. if not new_cs_ids:
  361. return response.json(444)
  362. # 过滤出存在且状态为有效的套餐ID
  363. valid_new_cs_ids = AgentCloudServicePackage.objects.filter(id__in=new_cs_ids, status=1).values_list('id',
  364. flat=True)
  365. # 准备批量创建的数据
  366. packages_to_bind = [
  367. AgentCustomerPackage(
  368. ac_id=ac_id,
  369. cs_id=cs_id,
  370. created_by=userID,
  371. updated_by=userID,
  372. created_time=int(time.time()),
  373. updated_time=int(time.time())
  374. )
  375. for cs_id in valid_new_cs_ids
  376. ]
  377. # 批量创建绑定关系
  378. AgentCustomerPackage.objects.bulk_create(packages_to_bind)
  379. return response.json(0)
  380. except Exception as e:
  381. print(e)
  382. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  383. def batch_del_cumstomer_package(self, request_dict, response):
  384. """
  385. 代理商解绑服务套餐
  386. @param request_dict: 请求参数
  387. @param request_dict ac_id: 代理客户id
  388. @param request_dict cs_ids: 代理套餐id表
  389. @param response: 响应对象
  390. @return:
  391. """
  392. ac_id = request_dict.get('ac_id', None)
  393. cs_ids = json.loads(request_dict.get('cs_id', '[]'))
  394. if ac_id is None or not cs_ids:
  395. return response.json(444)
  396. try:
  397. AgentCustomerPackage.objects.filter(ac_id=ac_id, cs_id__in=cs_ids).delete()
  398. return response.json(0)
  399. except Exception as e:
  400. print(e)
  401. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  402. def get_agent_service_package_list(self, response):
  403. """
  404. 查询云服务套餐列表 id + service_name
  405. @param response: 响应对象
  406. @return:
  407. """
  408. try:
  409. # 查询所有有效的代理云服务套餐
  410. all_packages = AgentCloudServicePackage.objects.filter(status=1).order_by('-created_time').values('id',
  411. 'service_name')
  412. # 转换查询集为列表形式
  413. packages_list = list(all_packages)
  414. # 返回数据
  415. return response.json(0, {'packages': packages_list})
  416. except Exception as e:
  417. # 出错时返回错误信息
  418. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))