sync.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  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, 5000)
  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. datas.push([obj['id'], env.examId, obj['schoolId'], obj['examNumber'], obj['name'], obj['studentCode'], obj['subjectCode'],
  30. obj['subjectName'], obj['campusName'], obj['packageCode'], obj['batchCode'], obj['sheetCount'], obj['sliceCount'], obj['answers'],
  31. obj['upload'] ? 1 : 0, obj['absent'] ? 1 : 0, obj['breach'] ? 1 : 0, obj['manualAbsent'] ? 1 : 0, obj['objectiveScore'],
  32. obj['subjectiveScore'], obj['examSite'], obj['examRoom'], obj['remark']
  33. ])
  34. campus[obj['campusCode']] = {
  35. schoolId: obj['schoolId'],
  36. name: obj['campusName']
  37. }
  38. }
  39. //console.log('get:' + array.length)
  40. promises.push(new Promise((resolve, reject) => {
  41. db.batchQuery('replace into eb_exam_student(id, exam_id, school_id\
  42. , exam_number, name, student_code, subject_code, subject_name, campus_name\
  43. , package_code, batch_code, sheet_count, slice_count, answers, is_upload\
  44. , is_absent, is_manual_absent, is_breach, is_exception\
  45. , objective_score, subjective_score, exam_site, exam_room, remark) \
  46. values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,0,?,?,?,?,?)',
  47. datas).then(() => {
  48. count += datas.length
  49. this.emit('student', count)
  50. resolve()
  51. }).catch((err) => {
  52. reject(err)
  53. })
  54. }))
  55. }
  56. //save campus
  57. this.emit('campus', 0)
  58. let campusData = []
  59. for (let code in campus) {
  60. campusData.push([code, campus[code].schoolId, campus[code].name])
  61. }
  62. logger.info('campus count:' + campusData.length)
  63. promises.push(new Promise((resolve, reject) => {
  64. db.batchQuery('replace into b_campus(id, school_id, name) values (?,?,?)', campusData).then(() => {
  65. this.emit('campus', campusData.length)
  66. resolve()
  67. }).catch(err => {
  68. reject(err)
  69. })
  70. }))
  71. //get and save package
  72. this.emit('package', 0)
  73. let packages = await api.getPackages(env.examId)
  74. let packageData = []
  75. for (let i = 0; i < packages.length; i++) {
  76. let obj = packages[i]
  77. packageData.push([env.examId, obj['code'], obj['picCount']])
  78. }
  79. logger.info('package count:' + packageData.length)
  80. promises.push(new Promise((resolve, reject) => {
  81. db.batchQuery('replace into eb_exam_package(exam_id, code, pic_count) values (?,?,?)', packageData).then(() => {
  82. this.emit('package', packageData.length)
  83. resolve()
  84. }).catch((err) => {
  85. reject(err)
  86. })
  87. }))
  88. await Promise.all(promises)
  89. this.emit('finish')
  90. } catch (err) {
  91. this.emit('error', err)
  92. logger.error(err)
  93. } finally {
  94. //console.log(moment().format('YYYY-MM-DD HH:mm:ss'))
  95. }
  96. }
  97. }
  98. module.exports = function () {
  99. return new executor()
  100. }