UserManageController.py 56 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236
  1. import datetime
  2. import time
  3. from concurrent.futures import ThreadPoolExecutor
  4. import oss2
  5. import requests
  6. from django.contrib.auth.hashers import make_password, check_password # 对密码加密模块
  7. from django.core.paginator import Paginator
  8. from django.db import transaction
  9. from django.db.models import Q
  10. from django.utils.decorators import method_decorator
  11. from django.utils.timezone import utc
  12. from django.views.decorators.csrf import csrf_exempt
  13. from django.views.generic import TemplateView
  14. from AgentModel.models import AgentCustomerInfo, AgentCustomerCard, AgentCloudServicePackage, AgentCustomerPackage
  15. from Ansjer.config import SERVER_DOMAIN, OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET, AWS_ACCESS_KEY_ID, \
  16. AWS_SECRET_ACCESS_KEY, AWS_SES_ACCESS_REGION, DETECT_PUSH_DOMAINS
  17. from Controller.CheckUserData import DataValid, RandomStr
  18. from Model.models import Device_User, Role, UserExModel, CountryModel, MenuModel, FeedBackModel, StatResModel, \
  19. SysMassModel, App_Info, SysMsgModel, DeviceSuperPassword, CustomizedPush, DeviceTypeModel, CustomCustomerOrderInfo
  20. from Object.AWS.AmazonS3Util import AmazonS3Util
  21. from Object.ApschedulerObject import ApschedulerObject
  22. from Object.RedisObject import RedisObject
  23. from Object.ResponseObject import ResponseObject
  24. from Object.TokenObject import TokenObject
  25. from Service.CommonService import CommonService
  26. from Service.ModelService import ModelService
  27. from django.views.generic import View
  28. # 登录
  29. class LoginView(TemplateView):
  30. @method_decorator(csrf_exempt) # @csrf_exempt
  31. def dispatch(self, *args, **kwargs):
  32. return super(LoginView, self).dispatch(*args, **kwargs)
  33. def post(self, request, *args, **kwargs):
  34. request.encoding = 'utf-8'
  35. request_dict = request.POST
  36. language = request_dict.get('language', 'en')
  37. response = ResponseObject(language, 'pc')
  38. return self.validates(request_dict, response)
  39. def validates(self, request_dict, response):
  40. username = request_dict.get('username', None)
  41. password = request_dict.get('password', None)
  42. password_version = request_dict.get('pwdVersion', 'V1')
  43. if not username or not password:
  44. return response.json(111)
  45. username = username.strip()
  46. password = password.strip()
  47. data_valid = DataValid()
  48. if data_valid.email_validate(username):
  49. return self.do_email_login(username, password, response, password_version)
  50. elif data_valid.mobile_validate(username):
  51. return self.do_phone_login(username, password, response, password_version)
  52. elif data_valid.name_validate(username):
  53. return self.do_name_login(username, password, response, password_version)
  54. else:
  55. return response.json(107)
  56. def do_email_login(self, email, password, response, password_version):
  57. user_qs = Device_User.objects.filter(Q(username=email) | Q(userEmail=email))
  58. return self.valid_login(user_qs, password, response, password_version)
  59. def do_phone_login(self, phone, password, response, password_version):
  60. user_qs = Device_User.objects.filter(Q(phone=phone) | Q(username=phone), is_active=True, user_isValid=True)
  61. return self.valid_login(user_qs, password, response, password_version)
  62. def do_name_login(self, username, password, response, password_version):
  63. user_qs = Device_User.objects.filter(Q(username=username) | Q(phone=username) | Q(userEmail=username),
  64. is_active=True, user_isValid=True)
  65. return self.valid_login(user_qs, password, response, password_version)
  66. def valid_login(self, user_qs, password, response, password_version):
  67. if not user_qs.exists():
  68. return response.json(104)
  69. # users = user_qs.values('role__rid', 'role__roleName', 'userID', 'role', 'NickName', 'username', 'userEmail',
  70. # 'phone', 'password', 'userIconPath', 'user_isValid', 'is_active')[0]
  71. users = user_qs.values('role__rid', 'role__roleName', 'userID', 'NickName', 'username', 'userEmail',
  72. 'phone', 'password', 'userIconPath')[0]
  73. if password_version == 'V1':
  74. check_flag = check_password(password, users['password'])
  75. else:
  76. check_flag = CommonService.check_password(password, users['password'])
  77. if not check_flag:
  78. return response.json(111)
  79. userID = users['userID']
  80. tko = TokenObject(returntpye='pc')
  81. res = tko.generate(
  82. data={'userID': userID, 'lang': response.lang, 'user': users['username'], 'm_code': '123413243214'})
  83. if tko.code == 0:
  84. now_time = datetime.datetime.utcnow().replace(tzinfo=utc).astimezone(utc)
  85. user_qs.update(last_login=now_time, language=response.lang)
  86. res['rid'] = users['role__rid']
  87. res['roleName'] = users['role__roleName']
  88. res['permList'] = ModelService.own_permission(userID)
  89. res['userID'] = userID
  90. # 昵称,邮箱,电话,刷新,头像
  91. userIconPath = str(users['userIconPath'])
  92. if userIconPath and userIconPath.find('static/') != -1:
  93. userIconPath = userIconPath.replace('static/', '').replace('\\', '/')
  94. res['userIconUrl'] = SERVER_DOMAIN + 'account/getAvatar/' + userIconPath
  95. else:
  96. res['userIconUrl'] = ''
  97. res['NickName'] = users['NickName'] if users['NickName'] is not None else ''
  98. res['username'] = users['username'] if users['username'] is not None else ''
  99. res['userEmail'] = users['userEmail'] if users['userEmail'] is not None else ''
  100. res['phone'] = users['phone'] if users['phone'] is not None else ''
  101. return response.json(0, res)
  102. else:
  103. return response.json(tko.code)
  104. # 获取登录权限
  105. class GetPermissions(TemplateView):
  106. @method_decorator(csrf_exempt) # @csrf_exempt
  107. def dispatch(self, *args, **kwargs):
  108. return super(GetPermissions, self).dispatch(*args, **kwargs)
  109. def get(self, request, *args, **kwargs):
  110. token = request.META.get('HTTP_AUTHORIZATION')
  111. request.encoding = 'utf-8'
  112. request_dict = request.GET
  113. language = request_dict.get('language', 'en')
  114. response = ResponseObject(language, 'pc')
  115. return self.validates(request_dict, token, response)
  116. def validates(self, request_dict, token, response):
  117. tko = TokenObject(token, returntpye='pc')
  118. response.lang = tko.lang
  119. if tko.code != 0:
  120. return response.json(tko.code)
  121. userID = tko.userID
  122. user_qs = Device_User.objects.filter(userID=userID)
  123. if not user_qs.exists():
  124. return response.json(104)
  125. # 待补充逻辑
  126. username = user_qs[0].username
  127. userIconPath = user_qs[0].userIconPath.url
  128. if userIconPath:
  129. if userIconPath.find('static/') != -1:
  130. userIconPath = userIconPath.replace('static/', '').replace('\\', '/')
  131. userIconUrl = SERVER_DOMAIN + 'account/getAvatar/' + userIconPath
  132. role_qs = Role.objects.filter(device_user=userID)
  133. menu_qs = MenuModel.objects.filter(role__in=role_qs, menutype=2);
  134. perms = []
  135. for menu in menu_qs:
  136. perms.append(menu.menu_code)
  137. res = {
  138. "code": 200,
  139. "msg": "success",
  140. "data": {
  141. "roles": ["admin"], # 一个用户可包含多个角色如["admin","editor","XXXX"],必须返回,如小项目用不到角色权限请返回 ["admin"]
  142. "ability": ["READ", "WRITE", "DELETE"], # 如果用不到rabc精细化权限可以不返回,建议返回
  143. "username": username, # 用户名,必须返回
  144. "avatar": userIconUrl, # 头像,必须返回
  145. "perms": perms
  146. }
  147. }
  148. return response.json(0, res)
  149. # 获取菜单
  150. class GetList(TemplateView):
  151. @method_decorator(csrf_exempt) # @csrf_exempt
  152. def dispatch(self, *args, **kwargs):
  153. return super(GetList, self).dispatch(*args, **kwargs)
  154. def get(self, request, *args, **kwargs):
  155. token = request.META.get('HTTP_AUTHORIZATION')
  156. request.encoding = 'utf-8'
  157. request_dict = request.GET
  158. language = request_dict.get('language', 'en')
  159. response = ResponseObject(language, 'pc')
  160. return self.validates(request_dict, token, response)
  161. def validates(self, request_dict, token, response):
  162. tko = TokenObject(token, returntpye='pc')
  163. response.lang = tko.lang
  164. if tko.code != 0:
  165. return response.json(tko.code)
  166. userID = tko.userID
  167. role_qs = Role.objects.filter(device_user=userID)
  168. menu_qs = MenuModel.objects.filter(parentId=0, role__in=role_qs, menutype=1);
  169. list = []
  170. for menu in menu_qs:
  171. list.append(
  172. {
  173. 'id': menu.id,
  174. 'parentId': menu.parentId,
  175. 'path': menu.path,
  176. 'name': menu.name,
  177. 'component': menu.component,
  178. 'meta': {
  179. 'hidden': menu.hidden,
  180. 'levelHidden': menu.levelHidden,
  181. 'title': menu.title,
  182. 'icon': menu.icon,
  183. 'isCustomSvg': menu.isCustomSvg,
  184. 'noKeepAlive': menu.noKeepAlive,
  185. 'noClosable': menu.noClosable,
  186. 'badge': menu.badge,
  187. 'tabHidden': menu.tabHidden,
  188. 'activeMenu': menu.activeMenu,
  189. 'dot': menu.dot,
  190. 'dynamicNewTab': menu.dynamicNewTab,
  191. 'sort': menu.sort
  192. }
  193. }
  194. )
  195. menu_qs = MenuModel.objects.filter(role__in=role_qs, menutype=1)
  196. menulist = []
  197. for objlist in list:
  198. menulist.append(self.menulist(menu_qs, objlist))
  199. return response.json(0, {'list': menulist})
  200. def menulist(self, menu_qs, objlist):
  201. if objlist is None:
  202. return
  203. for menu in menu_qs:
  204. if objlist['id'] == menu.parentId:
  205. if 'children' not in objlist:
  206. objlist['children'] = []
  207. obj = {
  208. 'id': menu.id,
  209. 'parentId': menu.parentId,
  210. 'path': menu.path,
  211. 'name': menu.name,
  212. 'component': menu.component,
  213. 'menutype': menu.menutype,
  214. 'menu_code': menu.menu_code,
  215. 'meta': {
  216. 'hidden': menu.hidden,
  217. 'levelHidden': menu.levelHidden,
  218. 'title': menu.title,
  219. 'icon': menu.icon,
  220. 'isCustomSvg': menu.isCustomSvg,
  221. 'noKeepAlive': menu.noKeepAlive,
  222. 'noClosable': menu.noClosable,
  223. 'badge': menu.badge,
  224. 'tabHidden': menu.tabHidden,
  225. 'activeMenu': menu.activeMenu,
  226. 'dot': menu.dot,
  227. 'dynamicNewTab': menu.dynamicNewTab,
  228. 'sort': menu.sort
  229. }
  230. }
  231. objlist['children'].append(
  232. obj
  233. )
  234. self.menulist(menu_qs, obj)
  235. return objlist
  236. class UserManagement(View):
  237. def get(self, request, *args, **kwargs):
  238. request.encoding = 'utf-8'
  239. operation = kwargs.get('operation')
  240. return self.validation(request.GET, request, operation)
  241. def post(self, request, *args, **kwargs):
  242. request.encoding = 'utf-8'
  243. operation = kwargs.get('operation')
  244. return self.validation(request.POST, request, operation)
  245. def validation(self, request_dict, request, operation):
  246. language = request_dict.get('language', 'en')
  247. response = ResponseObject(language, 'pc')
  248. if operation == 'sendSysMessage':
  249. return self.sendSysMessage(request_dict, response)
  250. elif operation == 'getAppDataList':
  251. return self.getAppDataList(request_dict, response)
  252. elif operation == 'replyFeedBack':
  253. return self.replyFeedBack(request_dict, response)
  254. elif operation == 'sendSysMsgToUser':
  255. return self.sendSysMsgToUser(request_dict, response)
  256. elif operation == 'getCountryList': # 查询国家列表
  257. return self.getCountryList(response)
  258. elif operation == 'getDeviceTypeList': # 查询设备型号列表
  259. return self.getDeviceTypeList(response)
  260. else:
  261. tko = TokenObject(request.META.get('HTTP_AUTHORIZATION'), returntpye='pc')
  262. # if tko.code != 0:
  263. # return response.json(tko.code)
  264. response.lang = tko.lang
  265. userID = tko.userID
  266. if operation == 'getUserInfo':
  267. return self.getUserInfo(userID, request_dict, response)
  268. elif operation == 'AddOrEditAccount':
  269. return self.AddOrEditAccount(userID, request_dict, response)
  270. elif operation == 'doDelete':
  271. return self.doDelete(request_dict, response)
  272. elif operation == 'resetPassword':
  273. return self.resetPassword(request_dict, response)
  274. elif operation == 'getFeedbackList':
  275. return self.getFeedbackList(request_dict, response)
  276. elif operation == 'deleteFeedBack':
  277. return self.deleteFeedBack(request_dict, response)
  278. elif operation == 'getSysMessageList':
  279. return self.getSysMessageList(request_dict, response)
  280. elif operation == 'collectFeedBack':
  281. return self.collectFeedBack(request_dict, response)
  282. elif operation == 'exportFeedBack':
  283. return self.exportFeedBack(request_dict, response)
  284. elif operation == 'customerServiceManagement': # 审核用户请求/生成超级密码
  285. return self.customerServiceManagement(request_dict, response)
  286. elif operation == 'getDeviceSuperPassword': # 查询超级密码请求表
  287. return self.getDeviceSuperPassword(request_dict, response)
  288. elif operation == 'deleteInformation': # 删除超级密码请求表
  289. return self.deleteInformation(request_dict, response)
  290. # 定制推送
  291. elif operation == 'getCustomizedPushList': # 查询定制推送列表
  292. return self.getCustomizedPushList(request_dict, response)
  293. elif operation == 'addOrEditCustomizedPush': # 新增/编辑推送内容
  294. return self.addOrEditCustomizedPush(request, request_dict, response)
  295. elif operation == 'delCustomizedPush': # 删除定制推送
  296. return self.delCustomizedPush(request_dict, response)
  297. if operation == 'getCustomCustomerList': # 查詢定制客户信息
  298. return self.get_custom_customer_list(request_dict, response)
  299. elif operation == 'addCustomCustomer': # 添加定制客户信息接口
  300. return self.add_custom_customer(request_dict, response)
  301. elif operation == 'delCustomCustomer': # 查询定制客户设备列表
  302. return self.del_custom_customer(request_dict, response)
  303. else:
  304. return response.json(414)
  305. def getUserInfo(self, userID, request_dict, response):
  306. """
  307. @param userID:用户ID
  308. @param request_dict:请求参数
  309. @param response:响应对象
  310. @param username:用户名
  311. @param NickName:用户昵称
  312. @param phone:电话号
  313. @param userEmail:用户邮箱
  314. @return:
  315. """
  316. print('request_dict: ', request_dict)
  317. user_id = request_dict.get('userId', '').strip()
  318. username = request_dict.get('username', '').strip() # 移除字符串头尾的空格
  319. NickName = request_dict.get('NickName', '').strip()
  320. phone = request_dict.get('phone', '').strip()
  321. userEmail = request_dict.get('userEmail', '').strip()
  322. countryName = request_dict.get('countryName', '').strip()
  323. pageNo = request_dict.get('pageNo', None)
  324. pageSize = request_dict.get('pageSize', None)
  325. if not all([pageNo, pageSize]):
  326. return response.json(444)
  327. page = int(pageNo)
  328. line = int(pageSize)
  329. try:
  330. device_user_qs = Device_User.objects.all()
  331. # 条件查询
  332. if user_id:
  333. device_user_qs = device_user_qs.filter(userID=user_id)
  334. if username:
  335. device_user_qs = device_user_qs.filter(username__icontains=username)
  336. if NickName:
  337. device_user_qs = device_user_qs.filter(NickName__icontains=NickName)
  338. if phone:
  339. device_user_qs = device_user_qs.filter(phone__icontains=phone)
  340. if userEmail:
  341. device_user_qs = device_user_qs.filter(userEmail__icontains=userEmail)
  342. if countryName:
  343. country_qs = CountryModel.objects.filter(country_name=countryName).values('id')
  344. if not country_qs:
  345. return response.json(10, '国家不存在')
  346. device_user_qs = device_user_qs.filter(region_country=country_qs[0]['id'])
  347. if not device_user_qs.exists():
  348. return response.json(0)
  349. total = device_user_qs.count()
  350. device_users = device_user_qs[(page - 1) * line:page * line]
  351. user_list = []
  352. for device_user in device_users:
  353. role = device_user.role.first()
  354. rid = role.rid if role else 1 # 不存在角色默认分配为'Users'
  355. user_ex_qs = UserExModel.objects.filter(userID_id=device_user.userID).values('appBundleId')
  356. app_bundle_id = user_ex_qs[0]['appBundleId'] if user_ex_qs.exists() else ''
  357. country_qs = CountryModel.objects.filter(id=device_user.region_country).values('country_name')
  358. countryName = country_qs[0]['country_name'] if country_qs.exists() else '未知国家'
  359. user_list.append({
  360. 'userID': device_user.userID,
  361. 'username': device_user.username,
  362. 'NickName': device_user.NickName,
  363. 'role': Role.objects.get(rid=rid).roleName,
  364. 'phone': device_user.phone,
  365. 'userEmail': device_user.userEmail,
  366. 'data_joined': device_user.data_joined.strftime("%Y-%m-%d %H:%M:%S"),
  367. 'last_login': device_user.last_login.strftime("%Y-%m-%d %H:%M:%S"),
  368. 'appBundleId': app_bundle_id,
  369. 'countryName': countryName
  370. })
  371. print('user_list: ', user_list)
  372. return response.json(0, {'list': user_list, 'total': total})
  373. except Exception as e:
  374. print(e)
  375. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  376. def AddOrEditAccount(self, userID, request_dict, response):
  377. """
  378. 添加/编辑用户
  379. @param userID:用户ID
  380. @param request_dict:请求参数
  381. @param response:响应对象
  382. @param roleName:用户角色
  383. @param isEdit:添加用户需要输入密码
  384. @return:
  385. """
  386. print('request_dict: ', request_dict)
  387. username = request_dict.get('username', '').strip() # 移除字符串头尾的空格
  388. userEmail = request_dict.get('userEmail', '').strip()
  389. roleName = request_dict.get('role', None)
  390. password = request_dict.get('password', None)
  391. isEdit = request_dict.get('isEdit', None)
  392. password_version = request_dict.get('pwdVersion', 'V1')
  393. # 添加代理商字段
  394. isAgent = request_dict.get('isAgent', None)
  395. agent_company_name = request_dict.get('agent_company_name', None)
  396. card_name = request_dict.get('card_name', None)
  397. card_no = request_dict.get('card_no', "")
  398. card_address = request_dict.get('card_address', "")
  399. phone = request_dict.get('phone', "")
  400. # 校验用户名,邮箱,密码是否符合规则
  401. dataValid = DataValid()
  402. if not username or not dataValid.name_validate(username):
  403. return response.json(444, {'Parameter error': 'username'})
  404. if userEmail and not dataValid.email_validate(userEmail):
  405. return response.json(444, {'Parameter error': 'userEmail'})
  406. if not isEdit: # 添加用户需要输入密码
  407. if not password or not dataValid.password_validate(password):
  408. return response.json(444, {'Parameter error': 'password'})
  409. if password_version == 'V1':
  410. password = make_password(password)
  411. try:
  412. if isEdit: # 编辑用户信息
  413. userID = request_dict.get('userID')
  414. user_data = {
  415. "username": username,
  416. "NickName": username,
  417. "userEmail": userEmail,
  418. }
  419. device_user_qs = Device_User.objects.filter(userID=userID)
  420. device_user_qs.update(**user_data)
  421. # 如果角色改变,修改用户角色
  422. device_user_role = device_user_qs[0].role
  423. user_role = device_user_role.first()
  424. if not user_role or roleName != user_role.roleName:
  425. device_user_role.clear()
  426. role_qs = Role.objects.filter(roleName=roleName) # 账号角色
  427. device_user_qs[0].role.set(role_qs)
  428. else: # 添加用户
  429. if isAgent and not all([agent_company_name, card_name, phone]):
  430. return response.json(444)
  431. # 查询邮箱是否已注册
  432. if Device_User.objects.filter(userEmail=userEmail).exists():
  433. return response.json(103)
  434. role_qs = Role.objects.filter(roleName=roleName) # 账号角色
  435. # 创建用户
  436. new_userID = CommonService.getUserID(μs=False, setOTAID=True)
  437. user_data = {
  438. "username": username,
  439. "NickName": username,
  440. "userEmail": userEmail,
  441. "password": password,
  442. "userID": new_userID,
  443. "phone": phone,
  444. "is_active": True,
  445. "user_isValid": True,
  446. }
  447. Device_User.objects.create(**user_data).role.set(role_qs)
  448. if isAgent:
  449. agent_customer_info = AgentCustomerInfo.objects.create(user_id=new_userID, company_name=agent_company_name, status=1, created_time=int(time.time()),
  450. updated_time=int(time.time()), created_by=userID, updated_by=userID)
  451. AgentCustomerCard.objects.create(ac_id=agent_customer_info.id, name=card_name, card_no=card_no, card_address=card_address, status=1,
  452. created_time=int(time.time()), updated_time=int(time.time()), created_by=userID, updated_by=userID)
  453. # 绑定所有代理套餐
  454. all_service_packages = AgentCloudServicePackage.objects.filter(status=1)
  455. for package in all_service_packages:
  456. AgentCustomerPackage.objects.create(
  457. ac_id=agent_customer_info.id,
  458. cs_id=package.id,
  459. created_time=int(time.time()),
  460. updated_time=int(time.time()),
  461. created_by=userID, # 假设 userID 是创建这个记录的用户ID
  462. updated_by=userID
  463. )
  464. return response.json(0)
  465. except Exception as e:
  466. print(e)
  467. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  468. def doDelete(self, request_dict, response):
  469. userID = request_dict.get('userID', '')
  470. if not userID:
  471. return response.json(444)
  472. try:
  473. Device_User.objects.filter(userID=userID).delete()
  474. return response.json(0)
  475. except Exception as e:
  476. print(e)
  477. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  478. def resetPassword(self, request_dict, response):
  479. userID = request_dict.get('userID', None)
  480. if not userID:
  481. return response.json(444)
  482. try:
  483. password = '123456'
  484. is_update = Device_User.objects.filter(userID=userID).update(password=make_password(password))
  485. if is_update:
  486. return response.json(0)
  487. else:
  488. return response.json(177)
  489. except Exception as e:
  490. print(e)
  491. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  492. def getFeedbackList(self, request_dict, response):
  493. """
  494. 用户反馈查询
  495. @param request_dict:请求参数
  496. @param response:响应对象
  497. @param status:回复状态
  498. @param collectStatus:收藏状态1
  499. @return:
  500. """
  501. status = request_dict.get('status', 0)
  502. username = request_dict.get('username', None)
  503. collectStatus = request_dict.get('collectStatus', None)
  504. pageNo = request_dict.get('pageNo', None)
  505. pageSize = request_dict.get('pageSize', None)
  506. if not all([pageNo, pageSize]):
  507. return response.json(444)
  508. page = int(pageNo)
  509. line = int(pageSize)
  510. try:
  511. filter_data = {}
  512. if status or username or collectStatus:
  513. if status:
  514. filter_data['status'] = int(status)
  515. if username:
  516. filter_data['userID_id'] = ModelService.get_userID_byname(username)
  517. if collectStatus:
  518. filter_data['collect_status'] = int(collectStatus)
  519. feed_back_qs = FeedBackModel.objects.filter()
  520. if filter_data:
  521. feed_back_qs = feed_back_qs.filter(**filter_data).values()
  522. total = feed_back_qs.count()
  523. feed_backs = feed_back_qs.values(
  524. 'id',
  525. 'userID__username',
  526. 'userID__phone',
  527. 'userID__userEmail',
  528. 'content',
  529. 'addTime',
  530. 'status',
  531. 'type',
  532. 'app',
  533. 'app_version',
  534. 'phone_model',
  535. 'os_version',
  536. 'uid',
  537. 'appBundleId',
  538. 'score',
  539. 'collect_status'
  540. )
  541. feed_backs = feed_backs[(page - 1) * line: page * line]
  542. feed_back_id_list = [feed_back['id'] for feed_back in feed_backs]
  543. stat_res_qs = StatResModel.objects.filter(
  544. feedbackmodel__id__in=feed_back_id_list).values(
  545. 'name', 'feedbackmodel__id')
  546. auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
  547. bucket = oss2.Bucket(
  548. auth, 'oss-cn-hongkong.aliyuncs.com', 'statres')
  549. feed_back_list = []
  550. for feed_back in feed_backs:
  551. feed_back['img_url'] = []
  552. for stat_res in stat_res_qs:
  553. if stat_res['feedbackmodel__id'] == feed_back['id']:
  554. obj = 'feedback/' + stat_res['name']
  555. img_url = bucket.sign_url('GET', obj, 3600)
  556. feed_back['img_url'].append(img_url)
  557. if not feed_back['userID__username']:
  558. feed_back['userID__username'] = feed_back['userID__userEmail'] if feed_back[
  559. 'userID__userEmail'] else feed_back['userID__phone']
  560. feed_back_list.append(feed_back)
  561. return response.json(0, {'list': feed_back_list, 'total': total})
  562. except Exception as e:
  563. print(e)
  564. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  565. def replyFeedBack(self, request_dict, response):
  566. feedBackID = request_dict.get('feedBackID', None)
  567. msg = request_dict.get('msg', None)
  568. uid = request_dict.get('uid', None)
  569. if not all([feedBackID, msg]):
  570. return response.json(444)
  571. try:
  572. nowTime = int(time.time())
  573. feed_back_qs = FeedBackModel.objects.filter(id=feedBackID)
  574. if not feed_back_qs.exists():
  575. return response.json(173)
  576. with transaction.atomic():
  577. SysMsgModel.objects.create(userID_id=feed_back_qs.first().userID_id, msg=msg, uid=uid,
  578. addTime=nowTime, updTime=nowTime) # 创建系统消息
  579. feed_back_qs.update(status=1) # 更新状态为已回复
  580. return response.json(0)
  581. except Exception as e:
  582. print(e)
  583. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  584. def sendSysMsgToUser(self, request_dict, response):
  585. """
  586. 发送系统消息至用户
  587. @param request_dict:请求参数
  588. @param response:响应对象
  589. @param userID:用户ID
  590. @param msg:发送内容
  591. @return:
  592. """
  593. userID = request_dict.get('userID', None)
  594. msg = request_dict.get('msg', None)
  595. if not all([userID, msg]):
  596. return response.json(444)
  597. try:
  598. nowTime = int(time.time())
  599. SysMsgModel.objects.create(userID_id=userID, msg=msg, addTime=nowTime, updTime=nowTime)
  600. return response.json(0)
  601. except Exception as e:
  602. print(e)
  603. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  604. def deleteFeedBack(self, request_dict, response):
  605. feedBackID = request_dict.get('feedBackID', None)
  606. if not feedBackID:
  607. return response.json(444)
  608. try:
  609. feed_back = FeedBackModel.objects.get(id=feedBackID)
  610. sr_id_list = feed_back.FS.values_list('id', flat=True)
  611. StatResModel.objects.filter(id__in=sr_id_list).delete()
  612. feed_back.delete()
  613. return response.json(0)
  614. except Exception as e:
  615. print(e)
  616. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  617. def getSysMessageList(self, request_dict, response):
  618. # 功能群发查询
  619. print('request_dict: ', request_dict)
  620. pageNo = request_dict.get('pageNo', None)
  621. pageSize = request_dict.get('pageSize', None)
  622. if not all([pageNo, pageSize]):
  623. return response.json(444)
  624. page = int(pageNo)
  625. line = int(pageSize)
  626. try:
  627. sys_mass_qs = SysMassModel.objects.filter()
  628. total = sys_mass_qs.count()
  629. sys_mass_qs = sys_mass_qs.values('id', 'sender__username', 'addTime', 'updTime', 'lang', 'recever', 'msg',
  630. 'platform')
  631. sys_mass_qs = sys_mass_qs[(page - 1) * line:page * line]
  632. return response.json(0, {'list': list(sys_mass_qs), 'total': total})
  633. except Exception as e:
  634. print(e)
  635. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  636. def getAppDataList(self, request_dict, response):
  637. print('request_dict: ', request_dict)
  638. platform = request_dict.get('platform', None)
  639. if platform == 'ios':
  640. app_type = [1]
  641. elif platform == 'android':
  642. app_type = [2]
  643. else:
  644. app_type = [1, 2]
  645. try:
  646. app_info_qs = App_Info.objects.filter(app_type__in=app_type).values('appBundleId', 'appName').distinct()
  647. appBundleId_list = []
  648. for app_info in app_info_qs:
  649. appBundleId_list.append(app_info['appBundleId'])
  650. return response.json(0, {'appBundleId_list': appBundleId_list})
  651. except Exception as e:
  652. print(e)
  653. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  654. def sendSysMessage(self, request_dict, response):
  655. print('request_dict: ', request_dict)
  656. lang = request_dict.get('lang', None)
  657. platform = request_dict.get('platform', None)
  658. recever = request_dict.get('app_list', None)
  659. msg = request_dict.get('msg', None)
  660. if not all([lang, platform, recever, msg]):
  661. return response.json(444)
  662. try:
  663. # SysMassModel表创建群发消息记录数据
  664. now_time = int(time.time())
  665. sender_id = Device_User.objects.filter(username='13800138001').values('userID').first()['userID']
  666. SysMassModel.objects.create(
  667. sender_id=sender_id,
  668. lang=lang,
  669. platform=platform,
  670. recever=recever,
  671. msg=msg,
  672. addTime=now_time,
  673. updTime=now_time,
  674. )
  675. # 查询并处理数据
  676. self.process_sys_messages(lang, recever, msg, now_time)
  677. return response.json(0)
  678. except Exception as e:
  679. print(e)
  680. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  681. def collectFeedBack(self, request_dict, response):
  682. """收藏或取消收藏用户反馈信息"""
  683. feedBackID = request_dict.get('feedBackID', None)
  684. collect_status = request_dict.get('collectStatus', None)
  685. if not all([feedBackID, collect_status]):
  686. return response.json(444)
  687. feedBackID = int(feedBackID)
  688. collect_status = int(collect_status)
  689. feed_back_qs = FeedBackModel.objects.filter(id=feedBackID, collect_status=collect_status)
  690. if feed_back_qs.exists(): # 判断是否已收藏
  691. feed_qs = feed_back_qs.first()
  692. feed_qs.collect_status = 0
  693. feed_qs.save()
  694. else:
  695. FeedBackModel.objects.filter(id=feedBackID).update(collect_status=collect_status)
  696. return response.json(0)
  697. def exportFeedBack(self, request_dict, response):
  698. status = request_dict.get('status', None)
  699. collectStatus = request_dict.get('collectStatus', None)
  700. try:
  701. with transaction.atomic():
  702. filter_data = {}
  703. if status or collectStatus:
  704. if status:
  705. filter_data['status'] = int(status)
  706. if collectStatus:
  707. filter_data['collect_status'] = int(collectStatus)
  708. feed_back_qs = FeedBackModel.objects.filter()
  709. if filter_data:
  710. feed_back_qs = feed_back_qs.filter(**filter_data)
  711. feed_backs = feed_back_qs.values(
  712. 'id',
  713. 'userID__username',
  714. 'userID__phone',
  715. 'userID__userEmail',
  716. 'content',
  717. 'addTime',
  718. 'status',
  719. 'type',
  720. 'app',
  721. 'app_version',
  722. 'phone_model',
  723. 'os_version',
  724. 'uid',
  725. 'appBundleId',
  726. 'score',
  727. 'collect_status'
  728. )
  729. feed_back_id_list = [feed_back['id'] for feed_back in feed_backs]
  730. stat_res_qs = StatResModel.objects.filter(
  731. feedbackmodel__id__in=feed_back_id_list).values(
  732. 'name', 'feedbackmodel__id')
  733. auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
  734. bucket = oss2.Bucket(
  735. auth, 'oss-cn-hongkong.aliyuncs.com', 'statres')
  736. feed_back_list = []
  737. for feed_back in feed_backs:
  738. feed_back['img_url'] = []
  739. for stat_res in stat_res_qs:
  740. if stat_res['feedbackmodel__id'] == feed_back['id']:
  741. obj = 'feedback/' + stat_res['name']
  742. img_url = bucket.sign_url('GET', obj, 3600)
  743. feed_back['img_url'].append(img_url)
  744. if not feed_back['userID__username']:
  745. feed_back['userID__username'] = feed_back['userID__userEmail'] if feed_back[
  746. 'userID__userEmail'] else feed_back['userID__phone']
  747. feed_back_list.append(feed_back)
  748. return response.json(0, {'list': feed_back_list})
  749. except Exception as e:
  750. print(e)
  751. def customerServiceManagement(self, request_dict, response):
  752. """
  753. 审核用户请求/生成超级密码
  754. @param request_dict:请求参数
  755. @param response:响应对象
  756. @request_dict status: 0:未通过,1:通过
  757. @request_dict hint: 温馨提示
  758. @return:
  759. """
  760. ID = request_dict.get('ID', None)
  761. userID = request_dict.get('userID', None)
  762. uid = request_dict.get('uid', None)
  763. status = request_dict.get('status', None)
  764. hint = request_dict.get('hint', None)
  765. lang = request_dict.get('lang', 'en')
  766. if not all({ID, uid, userID}):
  767. return response.json(444, 'ID, uid, userID')
  768. now = int(time.time())
  769. try:
  770. with transaction.atomic():
  771. device_super_password_qs = DeviceSuperPassword.objects.filter(id=ID, uid=uid, userID=userID)
  772. if not device_super_password_qs.exists():
  773. return response.json(173)
  774. status = int(status)
  775. if status == 1:
  776. # 验证码生成
  777. super_code = RandomStr(6, True)
  778. super_password_id = "super_password_%s" % userID
  779. redisObj = RedisObject()
  780. redis = redisObj.set_data(key=super_password_id, val=super_code, expire=86400)
  781. if redis is False:
  782. return response.json(121)
  783. device_super_password_qs.update(status=status)
  784. if lang == 'en':
  785. msg = "Your authorization code is " + super_code + ",valid within 24 hours"
  786. else:
  787. msg = "您的授权代码:" + super_code + ",24小时内有效"
  788. # eventType: 0系统消息,1 ipcamera消息,2 超级密码
  789. SysMsgModel.objects.create(userID_id=userID, msg=msg, addTime=now, updTime=now, uid=uid,
  790. eventType=2)
  791. return response.json(0)
  792. if status == 0 and len(hint) > 1:
  793. device_super_password_qs.update(status=status, hint=hint)
  794. SysMsgModel.objects.create(userID_id=userID, msg=hint, addTime=now, updTime=now, uid=uid,
  795. eventType=2)
  796. return response.json(0)
  797. return response.json(177)
  798. except Exception as e:
  799. print('修改状态异常,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  800. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  801. def getDeviceSuperPassword(self, request_dict, response):
  802. """
  803. 查询用户请求表
  804. @param request_dict:请求参数
  805. @param response:响应对象
  806. @return:
  807. """
  808. pageNo = request_dict.get('pageNo', None)
  809. pageSize = request_dict.get('pageSize', None)
  810. status = request_dict.get('status', None)
  811. userID = request_dict.get('userID', None)
  812. uid = request_dict.get('uid', None)
  813. if not all([pageNo, pageSize]):
  814. return response.json(444)
  815. page = int(pageNo)
  816. line = int(pageSize)
  817. try:
  818. device_super_password_qs = DeviceSuperPassword.objects.all()
  819. if status:
  820. device_super_password_qs = device_super_password_qs.filter(status=status)
  821. if userID:
  822. device_super_password_qs = device_super_password_qs.filter(userID=userID)
  823. if uid:
  824. device_super_password_qs = device_super_password_qs.filter(uid=uid)
  825. if not device_super_password_qs.exists():
  826. return response.json(0, [])
  827. count = device_super_password_qs.count()
  828. device_super_password_qs = device_super_password_qs.values('id',
  829. 'uid',
  830. 'userID',
  831. 'orderID',
  832. 'describe',
  833. 'purchase_channel',
  834. 'addTime',
  835. 'status',
  836. 'buyTime',
  837. 'hint',
  838. 'lang',
  839. 'userID__username')
  840. device_super_password_qs = device_super_password_qs.order_by('-addTime')[
  841. (page - 1) * line:page * line]
  842. return response.json(0, {'list': list(device_super_password_qs), 'count': count})
  843. except Exception as e:
  844. print('查询异常,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  845. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  846. def deleteInformation(self, request_dict, response):
  847. """
  848. 删除信息
  849. @param request_dict:请求参数
  850. @param response:响应对象
  851. """
  852. ID = request_dict.get('id', None)
  853. if not ID:
  854. return response.json(444)
  855. device_super_password_qs = DeviceSuperPassword.objects.filter(id=ID)
  856. if not device_super_password_qs.exists():
  857. return response.json(173)
  858. device_super_password_qs.delete()
  859. return response.json(0)
  860. @staticmethod
  861. def getCustomizedPushList(request_dict, response):
  862. title = request_dict.get('title', None)
  863. country = request_dict.get('country', None)
  864. device_type = request_dict.get('device_type', None)
  865. push_satus = request_dict.get('push_satus', None)
  866. page = request_dict.get('pageNo', None)
  867. line = request_dict.get('pageSize', None)
  868. if not all([page, line]):
  869. return response.json(444)
  870. page = int(page)
  871. line = int(line)
  872. try:
  873. customized_push_qs = CustomizedPush.objects.all().order_by('-push_timestamp')
  874. if title:
  875. customized_push_qs = customized_push_qs.filter(title=title)
  876. if country:
  877. customized_push_qs = customized_push_qs.filter(country=country)
  878. if device_type:
  879. customized_push_qs = customized_push_qs.filter(device_type__contains=device_type)
  880. if push_satus:
  881. customized_push_qs = customized_push_qs.filter(push_satus=push_satus)
  882. if not customized_push_qs.exists():
  883. return response.json(0, [])
  884. total = customized_push_qs.count()
  885. customized_push_qs = customized_push_qs.\
  886. values('id', 'title', 'msg', 'link', 'icon_link', 'country', 'device_type', 'register_period',
  887. 'time_zone', 'push_time', 'push_app', 'push_satus')
  888. customized_push_qs = customized_push_qs[(page - 1) * line:page * line]
  889. customized_push_list = []
  890. for customized_push in customized_push_qs:
  891. # 格式化数据
  892. register_period = customized_push['register_period'] + '年'
  893. time_zone = 'UTC ' + customized_push['time_zone']
  894. customized_push_list.append({
  895. 'customized_push_id': customized_push['id'],
  896. 'title': customized_push['title'],
  897. 'msg': customized_push['msg'],
  898. 'link': customized_push['link'],
  899. 'icon_link': customized_push['icon_link'],
  900. 'country': customized_push['country'],
  901. 'device_type': customized_push['device_type'],
  902. 'register_period': register_period,
  903. 'time_zone': time_zone,
  904. 'push_time': customized_push['push_time'],
  905. 'push_app': customized_push['push_app'],
  906. 'push_satus': customized_push['push_satus']
  907. })
  908. return response.json(0, {'list': customized_push_list, 'total': total})
  909. except Exception as e:
  910. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  911. @classmethod
  912. def addOrEditCustomizedPush(cls, request, request_dict, response):
  913. title = request_dict.get('title', None)
  914. msg = request_dict.get('msg', None)
  915. link = request_dict.get('link', None)
  916. icon = request.FILES.get('icon', None)
  917. country = request_dict.get('country', None)
  918. device_type = request_dict.get('deviceType', None)
  919. register_period = request_dict.get('registerPeriod', None)
  920. time_zone = request_dict.get('timeZone', None)
  921. push_time = request_dict.get('pushTime', None)
  922. push_app = request_dict.get('pushApp', None)
  923. is_edit = request_dict.get('isEdit', None)
  924. if not all([title, msg, link, country, device_type, register_period, time_zone, push_time, push_app]):
  925. return response.json(444)
  926. # 截掉UTC和空格
  927. time_zone = time_zone[4:]
  928. try:
  929. push_timestamp = CommonService.convert_to_timestamp(float(time_zone), push_time)
  930. if push_timestamp <= int(time.time()):
  931. return response.json(806)
  932. customized_push_data = {
  933. 'title': title,
  934. 'msg': msg,
  935. 'link': link,
  936. 'country': country,
  937. 'device_type': device_type,
  938. 'register_period': register_period,
  939. 'time_zone': time_zone,
  940. 'push_time': push_time,
  941. 'push_timestamp': push_timestamp,
  942. 'push_app': push_app
  943. }
  944. icon_link = ''
  945. if icon is not None:
  946. icon_name = icon.name
  947. icon_link = 'https://ansjerfilemanager.s3.amazonaws.com/customized-push/' + icon_name
  948. customized_push_data['icon_link'] = icon_link
  949. if icon_link:
  950. # 上传没有上传过的图片到S3
  951. customized_push_qs = CustomizedPush.objects.filter(icon_link=icon_link)
  952. if not customized_push_qs.exists():
  953. bucket = 'ansjerfilemanager'
  954. file_key = 'customized-push/' + icon_name
  955. s3 = AmazonS3Util(AWS_ACCESS_KEY_ID[1], AWS_SECRET_ACCESS_KEY[1], AWS_SES_ACCESS_REGION)
  956. s3.upload_file_obj(
  957. bucket,
  958. file_key,
  959. icon,
  960. {'ContentType': icon.content_type, 'ACL': 'public-read'})
  961. apscheduler_obj = ApschedulerObject()
  962. if is_edit: # 编辑
  963. customized_push_id = request_dict.get('customizedPushId', None)
  964. if not customized_push_id:
  965. return response.json(444)
  966. customized_push_data['push_satus'] = False
  967. CustomizedPush.objects.filter(id=customized_push_id).update(**customized_push_data)
  968. apscheduler_obj.del_job('customized_push_id_{}'.format(customized_push_id)) # 删除旧定时任务
  969. else: # 新增
  970. customized_push = CustomizedPush.objects.create(**customized_push_data)
  971. customized_push_id = customized_push.id
  972. # 创建定时任务
  973. task_id = 'customized_push_id_{}'.format(customized_push_id)
  974. apscheduler_obj.create_date_job(func=cls.req_customized_push, task_id=task_id, time_stamp=push_timestamp,
  975. args=(customized_push_id,))
  976. return response.json(0)
  977. except Exception as e:
  978. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  979. @staticmethod
  980. def req_customized_push(customized_push_id):
  981. """
  982. 请求定制化推送
  983. @param customized_push_id:
  984. @return:
  985. """
  986. data = {'customized_push_id': customized_push_id}
  987. url = DETECT_PUSH_DOMAINS + 'customized_push/start'
  988. req = requests.post(url=url, data=data, timeout=8)
  989. @staticmethod
  990. def delCustomizedPush(request_dict, response):
  991. customized_push_id = request_dict.get('customizedPushId', None)
  992. if not customized_push_id:
  993. return response.json(444)
  994. try:
  995. CustomizedPush.objects.filter(id=customized_push_id).delete()
  996. # 删除定时任务
  997. apscheduler_obj = ApschedulerObject()
  998. apscheduler_obj.del_job('customized_push_id_{}'.format(customized_push_id))
  999. return response.json(0)
  1000. except Exception as e:
  1001. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  1002. @staticmethod
  1003. def getCountryList(response):
  1004. try:
  1005. country_qs = CountryModel.objects.filter().values('country_name')
  1006. if not country_qs.exists():
  1007. return response.json(173)
  1008. country_list = []
  1009. for country in country_qs:
  1010. country_list.append(country['country_name'])
  1011. return response.json(0, {'list': country_list})
  1012. except Exception as e:
  1013. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  1014. @staticmethod
  1015. def getDeviceTypeList(response):
  1016. try:
  1017. device_type_qs = DeviceTypeModel.objects.filter().values('name')
  1018. if not device_type_qs.exists():
  1019. return response.json(173)
  1020. device_type_list = []
  1021. for device_type in device_type_qs:
  1022. device_type_list.append(device_type['name'])
  1023. return response.json(0, {'list': device_type_list})
  1024. except Exception as e:
  1025. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  1026. @staticmethod
  1027. def get_custom_customer_list(request_dict, response):
  1028. """
  1029. 查询定制客户信息
  1030. :param request_dict:
  1031. :param response:
  1032. :return:
  1033. """
  1034. order_number = request_dict.get('orderNumber', None)
  1035. name = request_dict.get('name', None)
  1036. email = request_dict.get('email', None)
  1037. page = request_dict.get('pageNo', 1)
  1038. page_size = request_dict.get('pageSize', 10)
  1039. try:
  1040. # 初始化查询集
  1041. custom_customer_qs = CustomCustomerOrderInfo.objects.all()
  1042. if order_number:
  1043. custom_customer_qs = custom_customer_qs.filter(order_number__icontains=order_number)
  1044. if name:
  1045. custom_customer_qs = custom_customer_qs.filter(name__icontains=name)
  1046. if email:
  1047. custom_customer_qs = custom_customer_qs.filter(email__icontains=email)
  1048. paginator = Paginator(custom_customer_qs.order_by('id'), page_size)
  1049. customers = paginator.page(page)
  1050. # 批量查询所有相关的国家信息
  1051. country_ids = custom_customer_qs.values_list('country_id', flat=True).distinct()
  1052. country_qs = CountryModel.objects.filter(id__in=country_ids)
  1053. country_map = {country.id: country.country_name for country in country_qs}
  1054. customer_list = []
  1055. for customer in customers.object_list:
  1056. country_name = country_map.get(customer.country_id, '')
  1057. customer_list.append({
  1058. 'cId': customer.id,
  1059. 'orderNumber': customer.order_number,
  1060. 'name': customer.name,
  1061. 'email': customer.email,
  1062. 'countryName': country_name,
  1063. 'quantity': customer.quantity,
  1064. 'createdTime': customer.created_time,
  1065. })
  1066. # 返回分页结果
  1067. data = {
  1068. 'total': paginator.count,
  1069. 'list': list(customer_list), # 当前页的记录列表
  1070. }
  1071. return response.json(0, data)
  1072. except Exception as e:
  1073. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  1074. @staticmethod
  1075. def add_custom_customer(request_dict, response):
  1076. """
  1077. 添加定制客户生产编号信息
  1078. :param request_dict: 请求字典
  1079. :param response: 响应对象
  1080. :return: 响应对象
  1081. """
  1082. order_number = request_dict.get('orderNumber', None)
  1083. name = request_dict.get('name', None)
  1084. quantity = int(request_dict.get('quantity', 0))
  1085. email = request_dict.get('email', None)
  1086. country_code = request_dict.get('countryCode', "en")
  1087. if not all([order_number, name, email, quantity]):
  1088. return response.json(444)
  1089. custom_customer_qs = CustomCustomerOrderInfo.objects.filter(order_number=order_number)
  1090. if custom_customer_qs.exists():
  1091. return response.json(174)
  1092. try:
  1093. country_code = country_code.upper()
  1094. country_qs = CountryModel.objects.filter(country_code=country_code)
  1095. country_id = 0
  1096. if country_qs.exists():
  1097. country_id = country_qs.first().id
  1098. CustomCustomerOrderInfo.objects.create(
  1099. order_number=order_number,
  1100. name=name,
  1101. email=email,
  1102. country_id=country_id,
  1103. quantity=quantity,
  1104. created_time=int(time.time()),
  1105. updated_time=int(time.time())
  1106. )
  1107. return response.json(0)
  1108. except Exception as e:
  1109. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  1110. @staticmethod
  1111. def del_custom_customer(request_dict, response):
  1112. pass
  1113. def process_sys_messages(self, lang, recever, msg, now_time):
  1114. """分页查询数据并分批保存系统消息"""
  1115. region_list = lang.split(',')
  1116. appBundleId_list = recever.split(',')
  1117. # 查询符合条件的用户ID
  1118. user_queryset = UserExModel.objects.filter(appBundleId__in=appBundleId_list,
  1119. region__in=region_list).values_list('userID_id', flat=True)
  1120. paginator = Paginator(user_queryset, 10000) # 每次查询10000条
  1121. # 创建线程池用于并发保存
  1122. with ThreadPoolExecutor(max_workers=5) as executor:
  1123. for page_num in paginator.page_range:
  1124. user_ids = paginator.page(page_num).object_list
  1125. # 提交保存任务到线程池
  1126. executor.submit(self.save_sys_messages_in_batches, user_ids, msg, now_time)
  1127. def save_sys_messages_in_batches(self, user_ids, msg, now_time):
  1128. """分批保存系统消息,每次最多5000条"""
  1129. sys_msg_list = []
  1130. for user_id in user_ids:
  1131. sys_msg_list.append(SysMsgModel(userID_id=user_id, msg=msg, addTime=now_time, updTime=now_time))
  1132. if len(sys_msg_list) >= 5000:
  1133. SysMsgModel.objects.bulk_create(sys_msg_list)
  1134. sys_msg_list = []
  1135. # 保存剩余的消息
  1136. if sys_msg_list:
  1137. SysMsgModel.objects.bulk_create(sys_msg_list)