BatchProcessingDatabase.py 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. import traceback
  4. from Ansjer.settings import *
  5. from django.views.generic.base import View
  6. from django.views.decorators.csrf import csrf_exempt
  7. from openpyxl import load_workbook
  8. from openpyxl.compat import range
  9. import xlrd
  10. from Service.ResponseService import *
  11. from Service.CommonService import CommonService
  12. from Model.models import Device_Info, Device_User
  13. class batchAddEquipmentView(View):
  14. @csrf_exempt
  15. def post(self, request, *args, **kwargs):
  16. request.encoding = 'utf-8'
  17. fileType = request.POST.get('fileType', None)
  18. fileName = request.FILES.get('fileName', None)
  19. if fileName != None and fileType != None:
  20. return self.batchAddEquipment(fileType, fileName)
  21. else:
  22. return ResponseJSON(800)
  23. @csrf_exempt
  24. def get(self, request, *args, **kwargs):
  25. request.encoding = 'gb2312'
  26. fileType = request.GET.get('fileType', None)
  27. fileName = request.FILES.get('fileName', None)
  28. if fileName != None and fileType != None:
  29. return self.batchAddEquipment(fileType, fileName)
  30. else:
  31. return ResponseJSON(800)
  32. #return HttpResponse(self.batchAddEquipmentfromTXTDict('D://1.txt'))
  33. #return HttpResponse(self.batchAddEquipmentfromExecl2('D:/2.xlsx'))
  34. def batchAddEquipment(self, fileType, fileName):
  35. filename = fileName.name
  36. filename = filename.replace(' ', '+')
  37. try:
  38. filePath = '/'.join((BASE_DIR, "static/SysFile", fileType)).replace('\\', '/') + '/'
  39. if not os.path.exists(filePath):
  40. os.makedirs(filePath)
  41. fullPath = filePath + filename
  42. if os.path.exists(fullPath):
  43. os.remove(fullPath)
  44. destination = open(fullPath, 'wb+')
  45. for chunk in fileName.chunks():
  46. destination.write(chunk)
  47. destination.close()
  48. else:
  49. fullPath = filePath + filename
  50. if os.path.exists(fullPath):
  51. os.remove(fullPath)
  52. destination = open(fullPath, 'wb+')
  53. for chunk in fileName.chunks():
  54. destination.write(chunk)
  55. destination.close()
  56. except Exception as e:
  57. errorInfo = traceback.format_exc()
  58. print('上传文件错误: %s' % errorInfo)
  59. return ResponseJSON(700, {
  60. 'details': repr(e)
  61. })
  62. if fileType == 'TXT':
  63. response = HttpResponse(self.batchAddEquipmentfromTXT(fullPath))
  64. return response
  65. elif fileType == 'Excel':
  66. response = HttpResponse(self.batchAddEquipmentfromExecl(fullPath))
  67. return response
  68. def batchAddEquipmentfromExecl(self, filePath):
  69. if not os.path.isfile(filePath):
  70. return ResponseJSON(701)
  71. else:
  72. try:
  73. xlsData = xlrd.open_workbook(filename = filePath)
  74. except Exception as e:
  75. errorInfo = traceback.format_exc()
  76. print('Open the Excel file error: %s' % errorInfo)
  77. return ResponseJSON(702, {
  78. 'details': repr(e)
  79. })
  80. else:
  81. sheetsCount = len(xlsData.sheets())
  82. table = xlsData.sheets()[0] # 打开第一张表
  83. nrows = table.nrows # 获取表的行数
  84. eInfo = []
  85. error_list = []
  86. error_msg = {}
  87. errorCount = addCount = 0
  88. for index in range(nrows): # 循环逐行添加
  89. eInfo = table.row_values(index)
  90. try:
  91. User = Device_User.objects.filter(userID = eInfo[0])
  92. except Exception as e:
  93. errorCount += 1
  94. errorInfo = traceback.format_exc()
  95. print('error message: %s' % errorInfo)
  96. errorDict = {'UID': eInfo[2], 'error_msg': u'error message: {0}'.format(repr(e))}
  97. error_list.append(errorDict)
  98. continue
  99. if not User:
  100. errorCount += 1
  101. errorDict = {'UID': eInfo[2], 'error_msg': u'error message: The UserID {0} does not exist!'.format(eInfo[0])}
  102. error_list.append(errorDict)
  103. continue
  104. try:
  105. tupleInfo = Device_Info.objects.get_or_create(userID_id=eInfo[0],
  106. NickName=eInfo[1],
  107. UID=eInfo[2], SID=eInfo[3],
  108. View_Account=eInfo[4],
  109. View_Password=eInfo[5],
  110. AudioFormat=eInfo[6],
  111. EventNotification=eInfo[7],
  112. ChannelIndex=eInfo[8],
  113. Online=eInfo[9],
  114. mMonitorIndex=eInfo[10],
  115. Type=eInfo[11],
  116. DebugMode=eInfo[12],
  117. NotificationMode=eInfo[13],
  118. qvgaLevel=eInfo[14],
  119. defaults={'id': CommonService.getUserID(getUser=False)})
  120. except Exception as e:
  121. errorCount += 1
  122. errorInfo = traceback.format_exc()
  123. print('error message: %s' % errorInfo)
  124. errorDict = {'UID': eInfo[2], 'error_msg': u'error message: {0}'.format(repr(e))}
  125. error_list.append(errorDict)
  126. continue
  127. else:
  128. if tupleInfo[1] == True:
  129. addCount += 1
  130. else:
  131. errorCount += 1
  132. if len(error_list) > 0:
  133. error_msg['error'] = error_list
  134. xlsData.release_resources()
  135. if xlsData:
  136. del xlsData
  137. resultDict = { "result_code": 0, "reason": u'Success'}
  138. if errorCount > 0:
  139. if len(error_msg) > 0:
  140. if sheetsCount > 1:
  141. resultDict.update({
  142. "result": {'appending': addCount, 'errorCount': errorCount, 'error_msg': error_msg,
  143. 'sheetsCount': 'The Execl contains {0} tables!'.format(sheetsCount)},
  144. "error_code": 704
  145. })
  146. else:
  147. resultDict.update({
  148. "result": {'appending': addCount, 'errorCount': errorCount, 'error_msg': error_msg},
  149. "error_code": 705
  150. })
  151. errorJSON = json.dumps(resultDict, ensure_ascii=False)
  152. return errorJSON
  153. else:
  154. if sheetsCount > 1:
  155. resultDict.update({
  156. "result": {'appending': addCount, 'appended': errorCount,
  157. 'sheetsCount': 'The Execl contains {0} tables!'.format(sheetsCount)},
  158. "error_code": 704,
  159. })
  160. else:
  161. resultDict.update({
  162. "result": {'appending': addCount, 'appended': errorCount},
  163. "error_code": 705,
  164. })
  165. errorJSON = json.dumps(resultDict, ensure_ascii=False)
  166. return errorJSON
  167. else:
  168. if sheetsCount > 1:
  169. resultDict.update({
  170. "result": {'appending': addCount,
  171. 'sheetsCount': 'The Execl contains {0} tables!'.format(sheetsCount)},
  172. "error_code": 704,
  173. })
  174. else:
  175. resultDict.update({
  176. "result": {'appending': addCount},
  177. "error_code": 0,
  178. })
  179. JSON = json.dumps(resultDict, ensure_ascii=False)
  180. return JSON
  181. def batchAddEquipmentfromExecl2(self, filePath):
  182. '''
  183. :param filePath:
  184. :return:
  185. :remarks: 不支持旧版xls
  186. '''
  187. #filePath = 'D:/2.xlsx'
  188. try:
  189. wb = load_workbook(filename = filePath)
  190. ws = wb.get_sheet_names()
  191. ws = wb.get_sheet_by_name(ws[0])
  192. rows = ws.iter_rows()
  193. #cols = ws.iter_cols()
  194. #rows = ws.rows # 行数
  195. #columns = ws.columns # 列数
  196. except Exception as e:
  197. errorInfo = traceback.format_exc()
  198. print('error message: %s' % errorInfo)
  199. return ResponseFormal(702,repr(e))
  200. error_list = []
  201. error_msg = {}
  202. equipmentlists = []
  203. errorCount = addCount = 0
  204. for row in rows:
  205. eInfo = []
  206. for cell in row:
  207. #print(cell.coordinate, cell.value)
  208. if cell.value == None:
  209. cell.value = ''
  210. eInfo.append(cell.value)
  211. try:
  212. User = Device_User.objects.filter(userID = eInfo[0])
  213. except Exception as e:
  214. errorCount += 1
  215. errorInfo = traceback.format_exc()
  216. print('error message: %s' % errorInfo)
  217. errorDict = {'UID': eInfo[2], 'error_msg': u'error message: {0}'.format(repr(e))}
  218. error_list.append(errorDict)
  219. continue
  220. if not User:
  221. errorCount += 1
  222. errorDict = {'UID': eInfo[2],
  223. 'error_msg': u'error message: The UserID {0} does not exist!'.format(eInfo[0])}
  224. error_list.append(errorDict)
  225. continue
  226. eqValid = Device_Info.objects.filter(userID_id = eInfo[0], UID=eInfo[2])
  227. if eqValid:
  228. errorCount += 1
  229. errorDict = {'UID': eInfo[2], 'error_msg': u'The UID has already existed!'}
  230. error_list.append(errorDict)
  231. continue
  232. equipment = Device_Info(id=CommonService.getUserID(getUser=False), userID_id=eInfo[0],
  233. NickName=eInfo[1], UID=eInfo[2], SID=eInfo[3],
  234. View_Account=eInfo[4], View_Password=eInfo[5],
  235. AudioFormat=eInfo[6], EventNotification=eInfo[7],
  236. ChannelIndex=eInfo[8], Online=eInfo[9], mMonitorIndex=eInfo[10],
  237. Type=eInfo[11], DebugMode=eInfo[12], NotificationMode=eInfo[13],
  238. qvgaLevel=eInfo[14], )
  239. equipmentlists.append(equipment)
  240. try:
  241. elists = Device_Info.objects.bulk_create(equipmentlists)
  242. except Exception as e:
  243. errorCount += 1
  244. errorInfo = traceback.format_exc()
  245. print('error message: %s' % errorInfo)
  246. errorDict = {'UID': eInfo[2], 'error_msg': u'error message: {0}'.format(repr(e))}
  247. error_list.append(errorDict)
  248. else:
  249. if len(equipmentlists) != len(elists):
  250. addCount += len(elists)
  251. errorCount += (len(equipmentlists) - len(elists))
  252. else:
  253. addCount += len(elists)
  254. if len(error_list) > 0:
  255. error_msg['error'] = error_list
  256. if errorCount == 0:
  257. return ResponseFormal(0, {
  258. 'appending': addCount
  259. })
  260. else:
  261. return ResponseFormal(0, {
  262. 'appending': addCount,
  263. 'errorCount': errorCount,
  264. 'error_msg': error_msg,
  265. })
  266. def batchAddEquipmentfromTXT(self, filePath):
  267. '''
  268. txt文件批量导入数据库,通过list方式
  269. :param filePath:
  270. :return:
  271. '''
  272. if os.path.isfile(filePath):
  273. file = open(filePath, encoding='utf-8')
  274. eInfo = []
  275. error_list = []
  276. error_msg = errorDict = {}
  277. errorCount = addCount = 0
  278. for line in file:
  279. eInfo = line.split(';')
  280. for index in range(len(eInfo)):
  281. if index > 5:
  282. eInfo[index] = int(eInfo[index])
  283. else:
  284. continue
  285. dUser = Device_User.objects.filter(userID = eInfo[0])
  286. if not dUser:
  287. errorCount += 1
  288. errorDict = {"userID": eInfo[0], "error_msg'": u"The userID_id is no exist!"}
  289. error_list.append(errorDict)
  290. continue
  291. try:
  292. tupleInfo = Device_Info.objects.get_or_create(userID_id=eInfo[0], NickName=eInfo[1],
  293. UID=eInfo[2], SID=eInfo[3], View_Account=eInfo[4],
  294. View_Password=eInfo[5], AudioFormat=eInfo[6],
  295. EventNotification=eInfo[7], ChannelIndex=eInfo[8],
  296. Online=eInfo[9], mMonitorIndex=eInfo[10],
  297. Type=eInfo[11], DebugMode=eInfo[12],
  298. NotificationMode=eInfo[13], qvgaLevel=eInfo[14],
  299. defaults={'id': CommonService.getUserID(getUser=False)})
  300. except Exception as e:
  301. errorCount += 1
  302. errorInfo = traceback.format_exc()
  303. print('error message: %s' % errorInfo)
  304. errorDict = {'UID': eInfo[2], 'error_msg': u'error message: {0}'.format(repr(e))}
  305. error_list.append(errorDict)
  306. continue
  307. else:
  308. if tupleInfo[1] == True:
  309. addCount += 1
  310. else:
  311. errorDict = {'UID': eInfo[2], 'error_msg': u'The UID is existed!'}
  312. error_list.append(errorDict)
  313. errorCount += 1
  314. file.close()
  315. if len(error_list) > 0:
  316. error_msg['error'] = error_list
  317. if errorCount > 0:
  318. if len(error_msg) > 0:
  319. return ResponseFormal(0, {
  320. 'appending': addCount,
  321. 'errorCount': errorCount,
  322. 'error_msg': error_msg,
  323. })
  324. else:
  325. return ResponseFormal(0, {'appending': addCount,'appended': errorCount,})
  326. else:
  327. return ResponseFormal(0,{'appending': addCount})
  328. else:
  329. return ResponseFormal(701)
  330. def batchAddEquipmentfromTXTDict(self, filePath):
  331. if os.path.isfile(filePath):
  332. file = open(filePath, encoding='utf-8')
  333. error_list = []
  334. error_msg = {}
  335. errorCount = addCount = 0
  336. equipmentList = []
  337. equipmentDict = {}
  338. try:
  339. for line in file:
  340. equipmentStr = eval(line)
  341. if isinstance(eval(equipmentStr), dict):
  342. equipmentDict.update(eval(equipmentStr))
  343. else:
  344. return ResponseFormal(706)
  345. UID = equipmentDict.get('UID', None)
  346. userID_id = equipmentDict.get('userID_id', None)
  347. dUser = Device_User.objects.filter(userID = userID_id)
  348. if dUser:
  349. if UID != None and userID_id != None:
  350. dInfo = Device_Info.objects.filter(userID_id = userID_id, UID = UID)
  351. if dInfo:
  352. errorCount += 1
  353. continue
  354. else:
  355. equipment = Device_Info(id = CommonService.getUserID(getUser=False), **equipmentDict)
  356. equipmentList.append(equipment)
  357. else:
  358. errorCount += 1
  359. errorDict = {'userID_id': userID_id, 'error_msg': u'The userID_id is None or UID is None!'}
  360. error_list.append(errorDict)
  361. continue
  362. else:
  363. errorCount += 1
  364. errorDict = {'userID_id': userID_id, 'error_msg': u'The userID_id is no exist!'}
  365. error_list.append(errorDict)
  366. continue
  367. file.close()
  368. sss = Device_Info.objects.bulk_create(equipmentList)
  369. print(type(sss), sss)
  370. except Exception as e:
  371. errorInfo = traceback.format_exc()
  372. print('The error Info: %s' % errorInfo)
  373. return ResponseFormal(707,{'details':repr(e)})
  374. else:
  375. if len(error_list) > 0:
  376. error_msg['error'] = error_list
  377. if errorCount > 0:
  378. if error_msg != None:
  379. return ResponseFormal(0, {'errorCount': errorCount,
  380. 'error': error_msg,
  381. 'appending': len(equipmentList)})
  382. else:
  383. return ResponseFormal(0, { 'errorCount': errorCount,
  384. 'appending': len(equipmentList)})
  385. else:
  386. return ResponseFormal(0,{'appending':len(equipmentList)})
  387. else:
  388. return ResponseFormal(701)