'use strict'; const Service = require('../core/base_service'); const { Op } = require('sequelize'); const fileName = "Download"; class DownloadService extends Service { // 导出小鹅通导入用户 async importXiaoeTech(uid, searchMsg, importForm) { const { ctx } = this; try { const user = await ctx.model.Manager.findOne({ where: { uid } }); if (!user || user.dataValues.role < 1) return false; let { searchOptions, sortOptions } = searchMsg; let attributes = ['user_uid', 'exam_uid', 'status', 'result'], where = {}, order = [], dbOptions, joinSubstring = [], substring = ['exam_uid', 'result'], key = ['status'], between = []; attributes.forEach(element => { if (searchOptions[element]) { if (searchOptions[element] == '*空') { if (joinSubstring.includes(element)) { where[element] = null; } else { where[element] = [null, '']; } } else if (joinSubstring.includes(element)) { let targetKeyArr = []; where[element] = targetKeyArr.length > 0 ? targetKeyArr : 'null'; } else if (substring.includes(element)) { where[element] = { [Op.substring]: searchOptions[element] }; } else if (key.includes(element)) { where[element] = searchOptions[element]; } else if (between.includes(element)) { where[element] = { [Op.between]: [searchOptions[element][0], searchOptions[element][1]] }; } } if (sortOptions[element] == true) { order.push([element, 'ASC']); } else if (sortOptions[element] == false) { order.push([element, 'DESC']); } }); let include = [ { model: ctx.model.Examinee, attributes: ['user_name', 'identity_card', 'workplace', 'address', 'phone', 'email'], } ]; ctx.model.Application.belongsTo(ctx.model.Examinee, { foreignKey: 'user_uid', targetKey: 'uid' }); dbOptions = { attributes, where, order, include }; const result = await ctx.model.Application.findAll(dbOptions); if (result.length == 0) return { code: false }; let data = []; result.forEach(element => { let identity_card = element.dataValues.examinee.dataValues.identity_card, gender = parseInt(identity_card[16], 10) % 2 == 0 ? '女' : '男', birthday = new Date(identity_card.substring(6, 14).substring(0, 4), identity_card.substring(6, 14).substring(4, 6) - 1, identity_card.substring(6, 14).substring(6, 8)), age = new Date().getFullYear() - birthday.getFullYear(); const m = new Date().getMonth() - birthday.getMonth(); if (m < 0 || (m === 0 && new Date().getDate() < birthday.getDate())) { age--; } data.push({ phone: element.dataValues.examinee.dataValues.phone, user_name: element.dataValues.examinee.dataValues.user_name, remark: "", gender, age, birthday, province: "", city: "", address: element.dataValues.examinee.dataValues.address, email: element.dataValues.examinee.dataValues.email, industry: "", company: element.dataValues.examinee.dataValues.workplace, position: "", description: "", tags: "", }); }); return { code: true, data }; } catch (error) { const blockName = fileName + "--" + "importXiaoeTech"; ctx.app.middleware.log('../../serviceLog', blockName + ">>>>" + error); return 'error'; } } // 导出小鹅通开课学员 async commencementXiaoeTech(uid, searchMsg, importForm) { const { ctx } = this; try { const user = await ctx.model.Manager.findOne({ where: { uid } }); if (!user || user.dataValues.role < 1) return false; let { searchOptions, sortOptions } = searchMsg; let attributes = ['user_uid', 'exam_uid', 'status', 'result'], where = {}, order = [], dbOptions, joinSubstring = [], substring = ['exam_uid', 'result'], key = ['status'], between = []; attributes.forEach(element => { if (searchOptions[element]) { if (searchOptions[element] == '*空') { if (joinSubstring.includes(element)) { where[element] = null; } else { where[element] = [null, '']; } } else if (joinSubstring.includes(element)) { let targetKeyArr = []; where[element] = targetKeyArr.length > 0 ? targetKeyArr : 'null'; } else if (substring.includes(element)) { where[element] = { [Op.substring]: searchOptions[element] }; } else if (key.includes(element)) { where[element] = searchOptions[element]; } else if (between.includes(element)) { where[element] = { [Op.between]: [searchOptions[element][0], searchOptions[element][1]] }; } } if (sortOptions[element] == true) { order.push([element, 'ASC']); } else if (sortOptions[element] == false) { order.push([element, 'DESC']); } }); let include = [ { model: ctx.model.Examinee, attributes: ['phone'], } ]; ctx.model.Application.belongsTo(ctx.model.Examinee, { foreignKey: 'user_uid', targetKey: 'uid' }); dbOptions = { attributes, where, order, include }; const result = await ctx.model.Application.findAll(dbOptions); if (result.length == 0) return { code: false }; let data = []; result.forEach(element => { data.push({ phone: element.dataValues.examinee.dataValues.phone, expired_at: importForm.expired_at.replace(/_/g, ' ').replace(/:/g, ':'), }); }); return { code: true, data }; } catch (error) { const blockName = fileName + "--" + "commencementXiaoeTech"; ctx.app.middleware.log('../../serviceLog', blockName + ">>>>" + error); return 'error'; } } // 导出批量报名导入 excel 表 async importApplicationData(uid, searchMsg, importForm) { const { ctx } = this; try { const user = await ctx.model.Manager.findOne({ where: { uid } }); if (!user || user.dataValues.role < 1) return false; let { searchOptions, sortOptions } = searchMsg; let attributes = ['user_name', 'identity_card', 'workplace', 'created_at'], where = {}, order = [], dbOptions, joinSubstring = [], substring = ['workplace'], key = [], between = ['created_at']; attributes.forEach(element => { if (searchOptions[element]) { if (searchOptions[element] == '*空') { if (joinSubstring.includes(element)) { where[element] = null; } else { where[element] = [null, '']; } } else if (joinSubstring.includes(element)) { let targetKeyArr = []; where[element] = targetKeyArr.length > 0 ? targetKeyArr : 'null'; } else if (substring.includes(element)) { where[element] = { [Op.substring]: searchOptions[element] }; } else if (key.includes(element)) { where[element] = searchOptions[element]; } else if (between.includes(element)) { where[element] = { [Op.between]: [searchOptions[element][0], searchOptions[element][1]] }; } } if (sortOptions[element] == true) { order.push([element, 'ASC']); } else if (sortOptions[element] == false) { order.push([element, 'DESC']); } }); dbOptions = { attributes, where, order }; const result = await ctx.model.Examinee.findAll(dbOptions); if (result.length == 0) return { code: false }; let data = []; result.forEach(element => { data.push({ identity_card: element.dataValues.identity_card, user_name: element.dataValues.user_name, exam_uid: importForm.exam_uid, source: importForm.source, status: "1", pay_status: "1", result: importForm.result }); }); return { code: true, data }; } catch (error) { const blockName = fileName + "--" + "importApplicationData"; ctx.app.middleware.log('../../serviceLog', blockName + ">>>>" + error); return 'error'; } } // 导出考试星学员导入 excel 表 async importExamStars(uid, searchMsg, importForm) { const { ctx } = this; try { const user = await ctx.model.Manager.findOne({ where: { uid } }); if (!user || user.dataValues.role < 1) return false; let { searchOptions, sortOptions } = searchMsg; let attributes = ['exam_uid', 'status'], where = {}, order = [], dbOptions, joinSubstring = [], substring = ['exam_uid'], key = ['status'], between = []; attributes.forEach(element => { if (searchOptions[element]) { if (searchOptions[element] == '*空') { if (joinSubstring.includes(element)) { where[element] = null; } else { where[element] = [null, '']; } } else if (joinSubstring.includes(element)) { let targetKeyArr = []; where[element] = targetKeyArr.length > 0 ? targetKeyArr : 'null'; } else if (substring.includes(element)) { where[element] = { [Op.substring]: searchOptions[element] }; } else if (key.includes(element)) { where[element] = searchOptions[element]; } else if (between.includes(element)) { where[element] = { [Op.between]: [searchOptions[element][0], searchOptions[element][1]] }; } } if (sortOptions[element] == true) { order.push([element, 'ASC']); } else if (sortOptions[element] == false) { order.push([element, 'DESC']); } }); let include = [ { model: ctx.model.Examinee, attributes: ['user_name', 'identity_card'], } ]; ctx.model.Application.belongsTo(ctx.model.Examinee, { foreignKey: 'user_uid', targetKey: 'uid' }); dbOptions = { attributes, where, order, include }; const result = await ctx.model.Application.findAll(dbOptions); if (result.length == 0) return { code: false }; let data = []; result.forEach(element => { data.push({ account: element.dataValues.examinee.dataValues.identity_card, password: element.dataValues.examinee.dataValues.identity_card.substr(-6), name: element.dataValues.examinee.dataValues.user_name, department: "", }); }); return { code: true, data }; } catch (error) { const blockName = fileName + "--" + "importExamStars"; ctx.app.middleware.log('../../serviceLog', blockName + ">>>>" + error); return 'error'; } } // 导出培训证书发放用户导入 excel 表 async importIssuance(uid, searchMsg, importForm) { const { ctx } = this; try { const user = await ctx.model.Manager.findOne({ where: { uid } }); if (!user || user.dataValues.role < 1) return false; let { searchOptions, sortOptions } = searchMsg; let attributes = ['exam_uid', 'status'], where = {}, order = [], dbOptions, joinSubstring = [], substring = ['exam_uid'], key = ['status'], between = []; attributes.forEach(element => { if (searchOptions[element]) { if (searchOptions[element] == '*空') { if (joinSubstring.includes(element)) { where[element] = null; } else { where[element] = [null, '']; } } else if (joinSubstring.includes(element)) { let targetKeyArr = []; where[element] = targetKeyArr.length > 0 ? targetKeyArr : 'null'; } else if (substring.includes(element)) { where[element] = { [Op.substring]: searchOptions[element] }; } else if (key.includes(element)) { where[element] = searchOptions[element]; } else if (between.includes(element)) { where[element] = { [Op.between]: [searchOptions[element][0], searchOptions[element][1]] }; } } if (sortOptions[element] == true) { order.push([element, 'ASC']); } else if (sortOptions[element] == false) { order.push([element, 'DESC']); } }); let include = [ { model: ctx.model.Examinee, attributes: ['user_name', 'identity_card', 'workplace', 'address', 'phone'], } ]; ctx.model.Application.belongsTo(ctx.model.Examinee, { foreignKey: 'user_uid', targetKey: 'uid' }); dbOptions = { attributes, where, order, include }; const result = await ctx.model.Application.findAll(dbOptions); if (result.length == 0) return { code: false }; let data = []; result.forEach((element, index) => { data.push({ id: index + 1, user_name: element.dataValues.examinee.dataValues.user_name, identity_card: element.dataValues.examinee.dataValues.identity_card, workplace: element.dataValues.examinee.dataValues.workplace, address: element.dataValues.examinee.dataValues.address, phone: element.dataValues.examinee.dataValues.phone, start: "", end: "", place: "", way: "", score: "", certificate_name: "", level: "", }); }); return { code: true, data }; } catch (error) { const blockName = fileName + "--" + "importIssuance"; ctx.app.middleware.log('../../serviceLog', blockName + ">>>>" + error); return 'error'; } } // 导出培训证书发放用户照片文件夹 async importUserPhoto(uid, searchMsg) { const { ctx } = this; try { const user = await ctx.model.Manager.findOne({ where: { uid } }); if (!user || user.dataValues.role < 1) return false; let { searchOptions, sortOptions } = searchMsg; let attributes = ['exam_uid', 'status'], where = {}, order = [], dbOptions, joinSubstring = [], substring = ['exam_uid'], key = ['status'], between = []; attributes.forEach(element => { if (searchOptions[element]) { if (searchOptions[element] == '*空') { if (joinSubstring.includes(element)) { where[element] = null; } else { where[element] = [null, '']; } } else if (joinSubstring.includes(element)) { let targetKeyArr = []; where[element] = targetKeyArr.length > 0 ? targetKeyArr : 'null'; } else if (substring.includes(element)) { where[element] = { [Op.substring]: searchOptions[element] }; } else if (key.includes(element)) { where[element] = searchOptions[element]; } else if (between.includes(element)) { where[element] = { [Op.between]: [searchOptions[element][0], searchOptions[element][1]] }; } } if (sortOptions[element] == true) { order.push([element, 'ASC']); } else if (sortOptions[element] == false) { order.push([element, 'DESC']); } }); let include = [ { model: ctx.model.Examinee, attributes: ['identity_card'], } ]; ctx.model.Application.belongsTo(ctx.model.Examinee, { foreignKey: 'user_uid', targetKey: 'uid' }); dbOptions = { attributes, where, order, include }; const result = await ctx.model.Application.findAll(dbOptions); if (result.length == 0) return { code: false }; let data = []; result.forEach(element => { data.push({ identity_card: element.dataValues.examinee.dataValues.identity_card, }); }); return { code: true, data }; } catch (error) { const blockName = fileName + "--" + "importUserPhoto"; ctx.app.middleware.log('../../serviceLog', blockName + ">>>>" + error); return 'error'; } } // 导出考试成绩导入 excel 表 async importGradesData(uid, formClone, dataType, passingScore, gradesType) { const { ctx } = this; try { const user = await ctx.model.Manager.findOne({ where: { uid } }); if (!user || user.dataValues.role < 1) return false; const data = formClone.map(item => ({ user_name: item.user_name, identity_card: item.identity_card, exam_uid: "", status: "", grades: item.grades, pass_type: "", })); const identityCards = data.map(item => item.identity_card); const userNames = data.map(item => item.user_name); const examineeUid = await ctx.model.Examinee.findAll({ attributes: ['uid', 'identity_card', 'user_name'], where: { identity_card: identityCards, user_name: userNames } }); if (examineeUid.length == 0) return { code: false }; const uidMap = new Map(); const userUids = []; examineeUid.forEach(element => { uidMap.set(`${element.dataValues.identity_card}_${element.dataValues.user_name}`, element.dataValues.uid); userUids.push(element.dataValues.uid); }); data.forEach(item => { const key = `${item.identity_card}_${item.user_name}`; if (uidMap.has(key)) { item.user_uid = uidMap.get(key); } }); const applicationUid = await ctx.model.Application.findAll({ attributes: ['user_uid', 'exam_uid'], where: { user_uid: userUids, status: 1 }, order: [['created_at', 'DESC']], limit: userUids.length }); if (applicationUid.length == 0) return { code: false }; const applicationUidMap = new Map(applicationUid.map(item => [item.dataValues.user_uid, item.dataValues.exam_uid])); data.forEach(item => { if (applicationUidMap.has(item.user_uid)) { item.exam_uid = applicationUidMap.get(item.user_uid); } }); const examUids = [...new Set(applicationUid.map(item => item.dataValues.exam_uid))]; let include = [ { model: ctx.model.Examinee, attributes: ['user_name', 'identity_card'], }, ]; if (gradesType == '0') { ctx.model.Application.belongsTo(ctx.model.Examinee, { foreignKey: 'user_uid', targetKey: 'uid' }); const application = await ctx.model.Application.findAll({ attributes: ['user_uid', 'exam_uid'], where: { user_uid: { [Op.notIn]: userUids }, exam_uid: examUids, status: 1 }, include }); application.forEach(element => { data.push({ identity_card: element.dataValues.examinee.dataValues.identity_card, user_name: element.dataValues.examinee.dataValues.user_name, user_uid: element.dataValues.user_uid, exam_uid: element.dataValues.exam_uid, grades: null, }); }); } data.forEach(item => { delete item.user_uid; item.status = dataType == '0' ? 1 : (item.grades == null ? 0 : 1); item.pass_type = item.grades == null ? (dataType == '0' ? 0 : 2) : (dataType == '1' && item.grades < passingScore ? 0 : 1); }); return { code: true, data }; } catch (error) { const blockName = fileName + "--" + "importGradesData"; ctx.app.middleware.log('../../serviceLog', blockName + ">>>>" + error); return 'error'; } } } module.exports = DownloadService;