//云端数据同步导本地 const EventEmitter = require('events') const db = require('./db.js') const env = require('./env.js') const api = require('./api.js') const logger = require('./logger.js')('sync.js') class executor extends EventEmitter { async start() { try { db.init() let totalCount = await api.countStudents(env.examId) logger.info('student count: ' + totalCount) this.emit('total', totalCount) let promises = [] let campus = {} let count = 0 let pageNumber = 0 this.emit('student', 0) while (true) { pageNumber++ logger.info('student page=' + pageNumber) let array = await api.getStudents(env.examId, pageNumber, 1000, undefined, undefined, true) if (array == undefined || array.length == 0) { break } let datas = [] for (var i = 0; i < array.length; i++) { var obj = array[i] var objList = [] var subList = [] if (obj.objectiveScoreDetail) { obj.objectiveScoreDetail.forEach(detail => { let score = Math.round(detail.score * 10 / 10) objList.push(detail.answer + ':' + score) }) } if (obj.subjectiveScoreDetail) { obj.subjectiveScoreDetail.forEach(detail => { let score = Math.round(detail.score * 10 / 10) subList.push(score) }) } datas.push([obj['id'], env.examId, obj['schoolId'], obj['examNumber'], obj['name'], obj['studentCode'], obj['subjectCode'], obj['subjectName'], obj['campusName'], obj['packageCode'], obj['batchCode'], obj['sheetCount'], obj['sliceCount'], obj['answers'], obj['upload'] ? 1 : 0, obj['absent'] ? 1 : 0, obj['breach'] ? 1 : 0, obj['manualAbsent'] ? 1 : 0, obj['objectiveScore'].length>0?obj['objectiveScore']:0, obj['subjectiveScore'].length>0?obj['subjectiveScore']:0, objList.join(';'), subList.join(';'), obj['examSite'], obj['examRoom'], obj['remark'] ]) campus[obj['campusCode']] = { schoolId: obj['schoolId'], name: obj['campusName'] } } //console.log('get:' + array.length) promises.push(new Promise((resolve, reject) => { db.batchQuery('replace into eb_exam_student(id, exam_id, school_id\ , exam_number, name, student_code, subject_code, subject_name, campus_name\ , package_code, batch_code, sheet_count, slice_count, answers, is_upload\ , is_absent, is_manual_absent, is_breach, is_exception\ , objective_score, subjective_score, objective_score_list, subjective_score_list\ , exam_site, exam_room, remark) \ values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,0,?,?,?,?,?,?,?)', datas).then(() => { count += datas.length this.emit('student', count) resolve() }).catch((err) => { reject(err) }) })) } //save campus this.emit('campus', 0) let campusData = [] for (let code in campus) { campusData.push([code, campus[code].schoolId, campus[code].name]) } logger.info('campus count:' + campusData.length) promises.push(new Promise((resolve, reject) => { db.batchQuery('replace into b_campus(id, school_id, name) values (?,?,?)', campusData).then(() => { this.emit('campus', campusData.length) resolve() }).catch(err => { reject(err) }) })) //get and save package // this.emit('package', 0) // let packages = await api.getPackages(env.examId) // let packageData = [] // for (let i = 0; i < packages.length; i++) { // let obj = packages[i] // packageData.push([env.examId, obj['code'], obj['picCount']]) // } // logger.info('package count:' + packageData.length) // promises.push(new Promise((resolve, reject) => { // db.batchQuery('replace into eb_exam_package(exam_id, code, pic_count) values (?,?,?)', packageData).then(() => { // this.emit('package', packageData.length) // resolve() // }).catch((err) => { // reject(err) // }) // })) await Promise.all(promises) this.emit('finish') } catch (err) { this.emit('error', err) logger.error(err) } finally { //console.log(moment().format('YYYY-MM-DD HH:mm:ss')) } } } module.exports = function() { return new executor() }