feat(asl): Week 2 Day 2 - Excel import with template download and intelligent dedup

Features:
- feat: Excel template generation and download (with examples)
- feat: Excel file parsing in memory (cloud-native, no disk write)
- feat: Field validation (title + abstract required)
- feat: Smart deduplication (DOI priority + Title fallback)
- feat: Literature preview table with statistics
- feat: Complete submission flow (create project + import literatures)

Components:
- feat: Create excelUtils.ts with full Excel processing toolkit
- feat: Enhance TitleScreeningSettings page with upload/preview/submit
- feat: Update API interface signatures and export unified aslApi object

Dependencies:
- chore: Add xlsx library for Excel file processing

Ref: Week 2 Frontend Development - Day 2
Scope: ASL Module MVP - Title Abstract Screening
Cloud-Native: Memory parsing, no file persistence
This commit is contained in:
2025-11-19 10:24:47 +08:00
parent 3634933ece
commit 2e8699c217
178 changed files with 1937 additions and 108 deletions

View File

@@ -178,3 +178,4 @@ ASL模块基础API开发完成所有核心功能测试通过。数据库表

View File

@@ -185,3 +185,4 @@ console.log('Claude-4.5:', claudeResponse.choices[0].message.content);

View File

@@ -188,5 +188,6 @@ main().catch(error => {

View File

@@ -328,3 +328,4 @@ WHERE c.project_id IS NOT NULL;

View File

@@ -302,3 +302,4 @@
**下次评估计划**: v1.0.1 Prompt优化后重新测试

View File

@@ -109,5 +109,6 @@ main()

View File

@@ -117,3 +117,4 @@

View File

@@ -188,3 +188,4 @@ ${publicationYear ? `**年份:** ${publicationYear}` : ''}
现在开始筛选请严格按照JSON格式输出结果。

View File

@@ -109,3 +109,4 @@ ${publicationYear ? `**年份:** ${publicationYear}` : ''}
现在开始筛选请严格按照JSON格式输出结果。

View File

@@ -202,3 +202,4 @@ PICO评估: 全部match
现在开始筛选请严格按照JSON格式输出结果。

View File

@@ -253,5 +253,6 @@

View File

@@ -244,5 +244,6 @@

View File

@@ -20,3 +20,4 @@ if (data.length > 0) {
}

View File

@@ -57,3 +57,4 @@ createTestUser();

View File

@@ -191,3 +191,4 @@ testAPI();

View File

@@ -131,3 +131,4 @@ if (passed === testCases.length) {
console.log('='.repeat(60) + '\n');

View File

@@ -375,3 +375,4 @@ main().catch(console.error);

View File

@@ -203,3 +203,4 @@ async function runTest() {
runTest().catch(console.error);

View File

@@ -97,3 +97,4 @@ async function main() {
main().catch(console.error);

View File

@@ -408,3 +408,4 @@ npm run dev

View File

@@ -77,3 +77,4 @@ export interface CacheAdapter {

View File

@@ -100,3 +100,4 @@ export class CacheFactory {

View File

@@ -52,3 +52,4 @@ export const cache = CacheFactory.getInstance()

View File

@@ -27,3 +27,4 @@ export type { HealthCheckResponse } from './healthCheck.js'

View File

@@ -83,3 +83,4 @@ export class JobFactory {

View File

@@ -90,3 +90,4 @@ export interface JobQueue {

View File

@@ -41,3 +41,4 @@ export class ClaudeAdapter extends CloseAIAdapter {

View File

@@ -38,3 +38,4 @@ export { default } from './logger.js'

View File

@@ -41,3 +41,4 @@ export { Metrics, requestTimingHook, responseTimingHook } from './metrics.js'

View File

@@ -67,3 +67,4 @@ export interface StorageAdapter {

View File

@@ -55,3 +55,4 @@ export async function aslRoutes(fastify: FastifyInstance) {

View File

@@ -120,3 +120,4 @@ export interface BatchReviewDto {

View File

@@ -357,3 +357,4 @@ main();

View File

@@ -203,3 +203,4 @@ testPlatformInfrastructure().catch(error => {

View File

@@ -157,3 +157,4 @@ END $$;

View File

@@ -19,3 +19,4 @@ ORDER BY schema_name;

View File

@@ -409,5 +409,6 @@ main().catch(error => {

View File

@@ -81,3 +81,4 @@ Write-Host "下一步:重启后端服务以应用新配置" -ForegroundColor Y

View File

@@ -63,5 +63,6 @@ pause

View File

@@ -96,5 +96,6 @@ npm run prisma:studio