493 lines
23 KiB
JavaScript
493 lines
23 KiB
JavaScript
'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; |