1
This commit is contained in:
@@ -34,79 +34,74 @@ module.exports = {
|
||||
* description: 获取成功
|
||||
*/
|
||||
'POST /apply/list': async (ctx) => {
|
||||
try {
|
||||
const models = Framework.getModels();
|
||||
const { apply_records, op } = models;
|
||||
const body = ctx.getBody();
|
||||
|
||||
// 从query或body中获取sn_code,优先从query获取
|
||||
const sn_code = ctx.query?.sn_code || body.sn_code;
|
||||
|
||||
if (!sn_code) {
|
||||
return ctx.fail('请提供设备SN码');
|
||||
}
|
||||
|
||||
const seachOption = body.seachOption || {};
|
||||
const pageOption = body.pageOption || {};
|
||||
|
||||
// 获取分页参数
|
||||
const page = pageOption.page || 1;
|
||||
const pageSize = pageOption.pageSize || 20;
|
||||
const limit = pageSize;
|
||||
const offset = (page - 1) * pageSize;
|
||||
|
||||
const where = { sn_code };
|
||||
|
||||
// 平台筛选
|
||||
if (seachOption.platform) {
|
||||
where.platform = seachOption.platform;
|
||||
}
|
||||
|
||||
// 投递状态筛选
|
||||
if (seachOption.applyStatus) {
|
||||
where.applyStatus = seachOption.applyStatus;
|
||||
}
|
||||
|
||||
// 反馈状态筛选
|
||||
if (seachOption.feedbackStatus) {
|
||||
where.feedbackStatus = seachOption.feedbackStatus;
|
||||
}
|
||||
|
||||
// 搜索:岗位名称、公司名称
|
||||
if (seachOption.key && seachOption.value) {
|
||||
const key = seachOption.key;
|
||||
const value = seachOption.value;
|
||||
|
||||
if (key === 'jobTitle') {
|
||||
where.jobTitle = { [op.like]: `%${value}%` };
|
||||
} else if (key === 'companyName') {
|
||||
where.companyName = { [op.like]: `%${value}%` };
|
||||
} else {
|
||||
// 默认搜索岗位名称或公司名称
|
||||
where[op.or] = [
|
||||
{ jobTitle: { [op.like]: `%${value}%` } },
|
||||
{ companyName: { [op.like]: `%${value}%` } }
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
const result = await apply_records.findAndCountAll({
|
||||
where,
|
||||
limit,
|
||||
offset,
|
||||
order: [['applyTime', 'DESC']]
|
||||
});
|
||||
|
||||
return ctx.success({
|
||||
count: result.count,
|
||||
total: result.count,
|
||||
rows: result.rows,
|
||||
list: result.rows
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('获取投递记录列表失败:', error);
|
||||
return ctx.fail('获取投递记录列表失败: ' + error.message);
|
||||
const models = Framework.getModels();
|
||||
const { apply_records, op } = models;
|
||||
const body = ctx.getBody();
|
||||
|
||||
// 从query或body中获取sn_code,优先从query获取
|
||||
const sn_code = ctx.query?.sn_code || body.sn_code;
|
||||
|
||||
if (!sn_code) {
|
||||
return ctx.fail('请提供设备SN码');
|
||||
}
|
||||
|
||||
const seachOption = body.seachOption || {};
|
||||
const pageOption = body.pageOption || {};
|
||||
|
||||
// 获取分页参数
|
||||
const page = pageOption.page || 1;
|
||||
const pageSize = pageOption.pageSize || 20;
|
||||
const limit = pageSize;
|
||||
const offset = (page - 1) * pageSize;
|
||||
|
||||
const where = { sn_code };
|
||||
|
||||
// 平台筛选
|
||||
if (seachOption.platform) {
|
||||
where.platform = seachOption.platform;
|
||||
}
|
||||
|
||||
// 投递状态筛选
|
||||
if (seachOption.applyStatus) {
|
||||
where.applyStatus = seachOption.applyStatus;
|
||||
}
|
||||
|
||||
// 反馈状态筛选
|
||||
if (seachOption.feedbackStatus) {
|
||||
where.feedbackStatus = seachOption.feedbackStatus;
|
||||
}
|
||||
|
||||
// 搜索:岗位名称、公司名称
|
||||
if (seachOption.key && seachOption.value) {
|
||||
const key = seachOption.key;
|
||||
const value = seachOption.value;
|
||||
|
||||
if (key === 'jobTitle') {
|
||||
where.jobTitle = { [op.like]: `%${value}%` };
|
||||
} else if (key === 'companyName') {
|
||||
where.companyName = { [op.like]: `%${value}%` };
|
||||
} else {
|
||||
// 默认搜索岗位名称或公司名称
|
||||
where[op.or] = [
|
||||
{ jobTitle: { [op.like]: `%${value}%` } },
|
||||
{ companyName: { [op.like]: `%${value}%` } }
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
const result = await apply_records.findAndCountAll({
|
||||
where,
|
||||
limit,
|
||||
offset,
|
||||
order: [['applyTime', 'DESC']]
|
||||
});
|
||||
|
||||
return ctx.success({
|
||||
count: result.count,
|
||||
total: result.count,
|
||||
rows: result.rows,
|
||||
list: result.rows
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
@@ -128,43 +123,38 @@ module.exports = {
|
||||
* description: 获取成功
|
||||
*/
|
||||
'GET /apply/statistics': async (ctx) => {
|
||||
try {
|
||||
const models = Framework.getModels();
|
||||
const { apply_records } = models;
|
||||
const { sn_code } = ctx.query;
|
||||
const final_sn_code = sn_code;
|
||||
const models = Framework.getModels();
|
||||
const { apply_records } = models;
|
||||
const { sn_code } = ctx.query;
|
||||
const final_sn_code = sn_code;
|
||||
|
||||
if (!final_sn_code) {
|
||||
return ctx.fail('请提供设备SN码');
|
||||
}
|
||||
|
||||
const [
|
||||
totalCount,
|
||||
successCount,
|
||||
failedCount,
|
||||
pendingCount,
|
||||
interviewCount
|
||||
] = await Promise.all([
|
||||
apply_records.count({ where: { sn_code: final_sn_code } }),
|
||||
apply_records.count({ where: { sn_code: final_sn_code, applyStatus: 'success' } }),
|
||||
apply_records.count({ where: { sn_code: final_sn_code, applyStatus: 'failed' } }),
|
||||
apply_records.count({ where: { sn_code: final_sn_code, applyStatus: 'pending' } }),
|
||||
apply_records.count({ where: { sn_code: final_sn_code, feedbackStatus: 'interview' } })
|
||||
]);
|
||||
|
||||
return ctx.success({
|
||||
totalCount,
|
||||
successCount,
|
||||
failedCount,
|
||||
pendingCount,
|
||||
interviewCount,
|
||||
successRate: totalCount > 0 ? ((successCount / totalCount) * 100).toFixed(2) : 0,
|
||||
interviewRate: totalCount > 0 ? ((interviewCount / totalCount) * 100).toFixed(2) : 0
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('获取投递统计失败:', error);
|
||||
return ctx.fail('获取投递统计失败: ' + error.message);
|
||||
if (!final_sn_code) {
|
||||
return ctx.fail('请提供设备SN码');
|
||||
}
|
||||
|
||||
const [
|
||||
totalCount,
|
||||
successCount,
|
||||
failedCount,
|
||||
pendingCount,
|
||||
interviewCount
|
||||
] = await Promise.all([
|
||||
apply_records.count({ where: { sn_code: final_sn_code } }),
|
||||
apply_records.count({ where: { sn_code: final_sn_code, applyStatus: 'success' } }),
|
||||
apply_records.count({ where: { sn_code: final_sn_code, applyStatus: 'failed' } }),
|
||||
apply_records.count({ where: { sn_code: final_sn_code, applyStatus: 'pending' } }),
|
||||
apply_records.count({ where: { sn_code: final_sn_code, feedbackStatus: 'interview' } })
|
||||
]);
|
||||
|
||||
return ctx.success({
|
||||
totalCount,
|
||||
successCount,
|
||||
failedCount,
|
||||
pendingCount,
|
||||
interviewCount,
|
||||
successRate: totalCount > 0 ? ((successCount / totalCount) * 100).toFixed(2) : 0,
|
||||
interviewRate: totalCount > 0 ? ((interviewCount / totalCount) * 100).toFixed(2) : 0
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
@@ -186,28 +176,23 @@ module.exports = {
|
||||
* description: 获取成功
|
||||
*/
|
||||
'GET /apply/detail': async (ctx) => {
|
||||
try {
|
||||
const models = Framework.getModels();
|
||||
const { apply_records } = models;
|
||||
// 支持 applyId 和 id 两种参数名(向后兼容)
|
||||
const recordId = ctx.query.applyId || ctx.query.id;
|
||||
const models = Framework.getModels();
|
||||
const { apply_records } = models;
|
||||
// 支持 applyId 和 id 两种参数名(向后兼容)
|
||||
const recordId = ctx.query.applyId || ctx.query.id;
|
||||
|
||||
if (!recordId) {
|
||||
return ctx.fail('投递记录ID不能为空');
|
||||
}
|
||||
|
||||
// 使用 id 字段查询(数据库主键)
|
||||
const record = await apply_records.findOne({ where: { id: recordId } });
|
||||
|
||||
if (!record) {
|
||||
return ctx.fail('投递记录不存在');
|
||||
}
|
||||
|
||||
return ctx.success(record);
|
||||
} catch (error) {
|
||||
console.error('获取投递记录详情失败:', error);
|
||||
return ctx.fail('获取投递记录详情失败: ' + error.message);
|
||||
if (!recordId) {
|
||||
return ctx.fail('投递记录ID不能为空');
|
||||
}
|
||||
|
||||
// 使用 id 字段查询(数据库主键)
|
||||
const record = await apply_records.findOne({ where: { id: recordId } });
|
||||
|
||||
if (!record) {
|
||||
return ctx.fail('投递记录不存在');
|
||||
}
|
||||
|
||||
return ctx.success(record);
|
||||
},
|
||||
|
||||
/**
|
||||
@@ -229,62 +214,57 @@ module.exports = {
|
||||
* description: 获取成功
|
||||
*/
|
||||
'GET /apply/trend': async (ctx) => {
|
||||
try {
|
||||
const models = Framework.getModels();
|
||||
const { apply_records, op } = models;
|
||||
const { sn_code } = ctx.query;
|
||||
const models = Framework.getModels();
|
||||
const { apply_records, op } = models;
|
||||
const { sn_code } = ctx.query;
|
||||
|
||||
if (!sn_code) {
|
||||
return ctx.fail('请提供设备SN码');
|
||||
}
|
||||
|
||||
// 计算近7天的日期范围
|
||||
const today = new Date();
|
||||
today.setHours(23, 59, 59, 999);
|
||||
const sevenDaysAgo = new Date();
|
||||
sevenDaysAgo.setDate(sevenDaysAgo.getDate() - 6);
|
||||
sevenDaysAgo.setHours(0, 0, 0, 0);
|
||||
|
||||
// 查询近7天的投递记录
|
||||
const records = await apply_records.findAll({
|
||||
where: {
|
||||
sn_code: sn_code,
|
||||
applyTime: {
|
||||
[op.gte]: sevenDaysAgo,
|
||||
[op.lte]: today
|
||||
}
|
||||
},
|
||||
attributes: ['applyTime'],
|
||||
raw: true
|
||||
});
|
||||
|
||||
// 生成7天的日期数组
|
||||
const trendData = [];
|
||||
for (let i = 6; i >= 0; i--) {
|
||||
const date = new Date();
|
||||
date.setDate(date.getDate() - i);
|
||||
date.setHours(0, 0, 0, 0);
|
||||
|
||||
const dateStr = `${date.getMonth() + 1}/${date.getDate()}`;
|
||||
|
||||
// 统计当天的投递数量
|
||||
const count = records.filter(record => {
|
||||
const recordDate = new Date(record.applyTime);
|
||||
recordDate.setHours(0, 0, 0, 0);
|
||||
return recordDate.getTime() === date.getTime();
|
||||
}).length;
|
||||
|
||||
trendData.push({
|
||||
date: dateStr,
|
||||
value: count
|
||||
});
|
||||
}
|
||||
|
||||
return ctx.success(trendData);
|
||||
} catch (error) {
|
||||
console.error('获取投递趋势数据失败:', error);
|
||||
return ctx.fail('获取投递趋势数据失败: ' + error.message);
|
||||
if (!sn_code) {
|
||||
return ctx.fail('请提供设备SN码');
|
||||
}
|
||||
|
||||
// 计算近7天的日期范围
|
||||
const today = new Date();
|
||||
today.setHours(23, 59, 59, 999);
|
||||
const sevenDaysAgo = new Date();
|
||||
sevenDaysAgo.setDate(sevenDaysAgo.getDate() - 6);
|
||||
sevenDaysAgo.setHours(0, 0, 0, 0);
|
||||
|
||||
// 查询近7天的投递记录
|
||||
const records = await apply_records.findAll({
|
||||
where: {
|
||||
sn_code: sn_code,
|
||||
applyTime: {
|
||||
[op.gte]: sevenDaysAgo,
|
||||
[op.lte]: today
|
||||
}
|
||||
},
|
||||
attributes: ['applyTime'],
|
||||
raw: true
|
||||
});
|
||||
|
||||
// 生成7天的日期数组
|
||||
const trendData = [];
|
||||
for (let i = 6; i >= 0; i--) {
|
||||
const date = new Date();
|
||||
date.setDate(date.getDate() - i);
|
||||
date.setHours(0, 0, 0, 0);
|
||||
|
||||
const dateStr = `${date.getMonth() + 1}/${date.getDate()}`;
|
||||
|
||||
// 统计当天的投递数量
|
||||
const count = records.filter(record => {
|
||||
const recordDate = new Date(record.applyTime);
|
||||
recordDate.setHours(0, 0, 0, 0);
|
||||
return recordDate.getTime() === date.getTime();
|
||||
}).length;
|
||||
|
||||
trendData.push({
|
||||
date: dateStr,
|
||||
value: count
|
||||
});
|
||||
}
|
||||
|
||||
return ctx.success(trendData);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user