//云端数据同步导本地 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) if (array == undefined || array.length == 0) { break } let datas = [] for (var i = 0; i < array.length; i++) { var obj = array[i] 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'], obj['subjectiveScore'], 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, 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() }