sync.js 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  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 count = 0
  16. let pageNumber = 0
  17. this.emit('student', 0)
  18. while (true) {
  19. pageNumber++
  20. logger.info('student page=' + pageNumber)
  21. let array = await api.getStudents(env.examId, pageNumber, 100, {
  22. withScoreDetail: true
  23. })
  24. if (array == undefined || array.length == 0) {
  25. break
  26. }
  27. let datas = []
  28. for (var i = 0; i < array.length; i++) {
  29. var obj = array[i]
  30. var objList = []
  31. var subList = []
  32. if (obj.objectiveScoreDetail) {
  33. obj.objectiveScoreDetail.forEach(detail => {
  34. let score = Math.round(detail.score * 10 / 10)
  35. objList.push(detail.answer + ':' + score)
  36. })
  37. }
  38. if (obj.subjectiveScoreDetail) {
  39. obj.subjectiveScoreDetail.forEach(detail => {
  40. let score = Math.round(detail.score * 10 / 10)
  41. subList.push(score)
  42. })
  43. }
  44. datas.push([obj['id'], env.examId, obj['schoolId'], obj['examNumber'], obj['examNumber'], obj['name'], obj['studentCode'], obj['subjectCode'],
  45. obj['subjectName'], obj['campusName'], obj['packageCode'], obj['batchCode'], obj['sheetCount'], obj['sliceCount'], obj['answers'],
  46. obj['upload'] ? 1 : 0, obj['absent'] ? 1 : 0, obj['breach'] ? 1 : 0, obj['manualAbsent'] ? 1 : 0, obj['objectiveScore'].length > 0 ? obj['objectiveScore'] : 0,
  47. obj['subjectiveScore'].length > 0 ? obj['subjectiveScore'] : 0, objList.join(';'), subList.join(';'), obj['subjectiveStatus'] || 'UNMARK',
  48. obj['examSite'], obj['examRoom'], obj['remark'], obj['college'] || '', obj['className'] || '', obj['teacher'] || ''
  49. ])
  50. }
  51. //console.log('get:' + array.length)
  52. promises.push(new Promise((resolve, reject) => {
  53. db.batchQuery('replace into eb_exam_student(id, exam_id, school_id\
  54. , exam_number, secret_number, name, student_code, subject_code, subject_name, campus_name\
  55. , package_code, batch_code, sheet_count, slice_count, answers, is_upload\
  56. , is_absent, is_manual_absent, is_breach, is_exception\
  57. , objective_score, subjective_score, objective_score_list, subjective_score_list, subjective_status\
  58. , exam_site, exam_room, remark, college, class_name, teacher) \
  59. values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,0,?,?,?,?,?,?,?,?,?,?,?)',
  60. datas).then(() => {
  61. count += datas.length
  62. this.emit('student', count)
  63. resolve()
  64. }).catch((err) => {
  65. reject(err)
  66. })
  67. }))
  68. }
  69. //get and save package
  70. this.emit('package', 0)
  71. let packages = await api.getPackages(env.examId)
  72. let packageData = []
  73. for (let i = 0; i < packages.length; i++) {
  74. let obj = packages[i]
  75. packageData.push([env.examId, obj['code'], obj['picCount']])
  76. }
  77. logger.info('package count:' + packageData.length)
  78. promises.push(new Promise((resolve, reject) => {
  79. db.batchQuery('replace into eb_exam_package(exam_id, code, pic_count) values (?,?,?)', packageData).then(() => {
  80. this.emit('package', packageData.length)
  81. resolve()
  82. }).catch((err) => {
  83. reject(err)
  84. })
  85. }))
  86. await Promise.all(promises)
  87. this.emit('finish')
  88. } catch (err) {
  89. this.emit('error', err)
  90. logger.error(err)
  91. } finally {
  92. //console.log(moment().format('YYYY-MM-DD HH:mm:ss'))
  93. }
  94. }
  95. }
  96. module.exports = function () {
  97. return new executor()
  98. }