sync.js 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. //云端数据同步导本地
  2. const EventEmitter = require('events')
  3. const db = require('./db.js')
  4. const env = require('./env.js')
  5. const api = require('./api.js')
  6. const logger = require('./logger.js')('sync.js')
  7. class executor extends EventEmitter {
  8. async start() {
  9. try {
  10. db.init()
  11. let totalCount = await api.countStudents(env.examId)
  12. logger.info('student count: ' + totalCount)
  13. this.emit('total', totalCount)
  14. let promises = []
  15. let campus = {}
  16. let count = 0
  17. let pageNumber = 0
  18. this.emit('student', 0)
  19. while (true) {
  20. pageNumber++
  21. logger.info('student page=' + pageNumber)
  22. let array = await api.getStudents(env.examId, pageNumber, 100, undefined, undefined, true)
  23. if (array == undefined || array.length == 0) {
  24. break
  25. }
  26. let datas = []
  27. for (var i = 0; i < array.length; i++) {
  28. var obj = array[i]
  29. var objList = []
  30. var subList = []
  31. if (obj.objectiveScoreDetail) {
  32. obj.objectiveScoreDetail.forEach(detail => {
  33. let score = Math.round(detail.score * 10 / 10)
  34. objList.push(detail.answer + ':' + score)
  35. })
  36. }
  37. if (obj.subjectiveScoreDetail) {
  38. obj.subjectiveScoreDetail.forEach(detail => {
  39. let score = Math.round(detail.score * 10 / 10)
  40. subList.push(score)
  41. })
  42. }
  43. datas.push([obj['id'], env.examId, obj['schoolId'], obj['examNumber'], obj['name'], obj['studentCode'], obj['subjectCode'],
  44. obj['subjectName'], obj['campusName'], obj['packageCode'], obj['batchCode'], obj['sheetCount'], obj['sliceCount'], obj['answers'],
  45. obj['upload'] ? 1 : 0, obj['absent'] ? 1 : 0, obj['breach'] ? 1 : 0, obj['manualAbsent'] ? 1 : 0, obj['objectiveScore'].length>0?obj['objectiveScore']:0,
  46. obj['subjectiveScore'].length>0?obj['subjectiveScore']:0, objList.join(';'), subList.join(';'), obj['examSite'], obj['examRoom'], obj['remark']
  47. ])
  48. campus[obj['campusCode']] = {
  49. schoolId: obj['schoolId'],
  50. name: obj['campusName']
  51. }
  52. }
  53. //console.log('get:' + array.length)
  54. promises.push(new Promise((resolve, reject) => {
  55. db.batchQuery('replace into eb_exam_student(id, exam_id, school_id\
  56. , exam_number, name, student_code, subject_code, subject_name, campus_name\
  57. , package_code, batch_code, sheet_count, slice_count, answers, is_upload\
  58. , is_absent, is_manual_absent, is_breach, is_exception\
  59. , objective_score, subjective_score, objective_score_list, subjective_score_list\
  60. , exam_site, exam_room, remark) \
  61. values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,0,?,?,?,?,?,?,?)',
  62. datas).then(() => {
  63. count += datas.length
  64. this.emit('student', count)
  65. resolve()
  66. }).catch((err) => {
  67. reject(err)
  68. })
  69. }))
  70. }
  71. //save campus
  72. this.emit('campus', 0)
  73. let campusData = []
  74. for (let code in campus) {
  75. campusData.push([code, campus[code].schoolId, campus[code].name])
  76. }
  77. logger.info('campus count:' + campusData.length)
  78. promises.push(new Promise((resolve, reject) => {
  79. db.batchQuery('replace into b_campus(id, school_id, name) values (?,?,?)', campusData).then(() => {
  80. this.emit('campus', campusData.length)
  81. resolve()
  82. }).catch(err => {
  83. reject(err)
  84. })
  85. }))
  86. //get and save package
  87. // this.emit('package', 0)
  88. // let packages = await api.getPackages(env.examId)
  89. // let packageData = []
  90. // for (let i = 0; i < packages.length; i++) {
  91. // let obj = packages[i]
  92. // packageData.push([env.examId, obj['code'], obj['picCount']])
  93. // }
  94. // logger.info('package count:' + packageData.length)
  95. // promises.push(new Promise((resolve, reject) => {
  96. // db.batchQuery('replace into eb_exam_package(exam_id, code, pic_count) values (?,?,?)', packageData).then(() => {
  97. // this.emit('package', packageData.length)
  98. // resolve()
  99. // }).catch((err) => {
  100. // reject(err)
  101. // })
  102. // }))
  103. await Promise.all(promises)
  104. this.emit('finish')
  105. } catch (err) {
  106. this.emit('error', err)
  107. logger.error(err)
  108. } finally {
  109. //console.log(moment().format('YYYY-MM-DD HH:mm:ss'))
  110. }
  111. }
  112. }
  113. module.exports = function() {
  114. return new executor()
  115. }