From 4d4c6f4f09f0896fe763083463f7ae83e54c03f2 Mon Sep 17 00:00:00 2001 From: wanwu Date: Mon, 27 Oct 2025 17:12:18 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E2=9C=85=20=E4=B8=9A=E5=8A=A1=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E8=87=AA=E5=8A=A8=E5=8C=96=E8=BF=81=E7=A7=BB=20-=20Ph?= =?UTF-8?q?ase=201=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 成果: - ✅ 成功提取9个高质量Service(5.7%) * login-service: 核心登录功能 * sys-user-service: 用户管理 * captcha-service: 验证码服务 * 6个辅助Service - 🔧 创建自动化工具: * extract-quality-services.js: 自动提取并验证 * fix-simple-errors.js: 修复常见Java语法 * fix-remaining-java-syntax.js: Java语法转换 * fix-java-var-declarations.js: 变量声明转换 - 📊 分析报告: * SERVICE_EXTRACTION_REPORT.json: 详细提取结果 * BUSINESS_LOGIC_MIGRATION_REALITY.md: 迁移真实情况 分析发现: - 159个非Addon Service中,9个可直接使用 - 53个Service错误<50个,有望批量修复 - ac00caf确实包含真实业务逻辑,但需要修复 下一步: - 批量修复错误<50的53个Service - 改进转换工具处理常见Java语法 --- .../docs/SERVICE_EXTRACTION_REPORT.json | 620 ++++++++++++++++++ .../tools/extract-quality-services.js | 245 +++++++ wwjcloud-nest-v1/tools/fix-simple-errors.js | 93 +++ .../wwjcloud-core/src/controller.module.ts | 2 +- 4 files changed, 959 insertions(+), 1 deletion(-) create mode 100644 wwjcloud-nest-v1/docs/SERVICE_EXTRACTION_REPORT.json create mode 100755 wwjcloud-nest-v1/tools/extract-quality-services.js create mode 100644 wwjcloud-nest-v1/tools/fix-simple-errors.js diff --git a/wwjcloud-nest-v1/docs/SERVICE_EXTRACTION_REPORT.json b/wwjcloud-nest-v1/docs/SERVICE_EXTRACTION_REPORT.json new file mode 100644 index 00000000..5a0caa26 --- /dev/null +++ b/wwjcloud-nest-v1/docs/SERVICE_EXTRACTION_REPORT.json @@ -0,0 +1,620 @@ +{ + "timestamp": "2025-10-27T09:01:14.638Z", + "total": 159, + "success": 9, + "failed": 150, + "successRate": "5.7%", + "successList": [ + "admin/auth/impl/login-service-impl.service.ts", + "admin/sys/impl/sys-user-service-impl.service.ts", + "admin/captcha/cache/captcha-cache-service-redis-impl.service.ts", + "admin/captcha/impl/captcha-service-impl.service.ts", + "api/wechat/impl/message-handle-impl.service.ts", + "cached-service-impl.service.ts", + "core/niucloud/impl/i-core-auth-service-impl.service.ts", + "example1-handler-provider-impl.service.ts", + "example2-handler-provider-impl.service.ts" + ], + "failedList": [ + { + "path": "admin/auth/impl/auth-service-impl.service.ts", + "errors": 181 + }, + { + "path": "admin/auth/impl/config-service-impl.service.ts", + "errors": 17 + }, + { + "path": "admin/dict/impl/dict-service-impl.service.ts", + "errors": 92 + }, + { + "path": "admin/sys/impl/sys-agreement-service-impl.service.ts", + "errors": 25 + }, + { + "path": "admin/sys/impl/sys-area-service-impl.service.ts", + "errors": 102 + }, + { + "path": "admin/sys/impl/sys-attachment-service-impl.service.ts", + "errors": 154 + }, + { + "path": "admin/sys/impl/sys-backup-records-service-impl.service.ts", + "errors": 417 + }, + { + "path": "admin/sys/impl/sys-config-service-impl.service.ts", + "errors": 73 + }, + { + "path": "admin/sys/impl/sys-export-service-impl.service.ts", + "errors": 142 + }, + { + "path": "admin/sys/impl/sys-menu-service-impl.service.ts", + "errors": 514 + }, + { + "path": "admin/sys/impl/sys-notice-log-service-impl.service.ts", + "errors": 56 + }, + { + "path": "admin/sys/impl/sys-notice-service-impl.service.ts", + "errors": 80 + }, + { + "path": "admin/sys/impl/sys-notice-sms-log-service-impl.service.ts", + "errors": 61 + }, + { + "path": "admin/sys/impl/sys-poster-service-impl.service.ts", + "errors": 169 + }, + { + "path": "admin/sys/impl/sys-printer-service-impl.service.ts", + "errors": 172 + }, + { + "path": "admin/sys/impl/sys-printer-template-service-impl.service.ts", + "errors": 134 + }, + { + "path": "admin/sys/impl/sys-role-service-impl.service.ts", + "errors": 142 + }, + { + "path": "admin/sys/impl/sys-schedule-service-impl.service.ts", + "errors": 307 + }, + { + "path": "admin/sys/impl/sys-upgrade-records-service-impl.service.ts", + "errors": 139 + }, + { + "path": "admin/sys/impl/sys-user-log-service-impl.service.ts", + "errors": 48 + }, + { + "path": "admin/sys/impl/sys-user-role-service-impl.service.ts", + "errors": 78 + }, + { + "path": "admin/sys/impl/system-service-impl.service.ts", + "errors": 123 + }, + { + "path": "api/sys/impl/base64-service-impl.service.ts", + "errors": 6 + }, + { + "path": "api/sys/impl/sys-area-service-impl.service.ts", + "errors": 121 + }, + { + "path": "api/sys/impl/sys-config-service-impl.service.ts", + "errors": 48 + }, + { + "path": "api/sys/impl/sys-verify-service-impl.service.ts", + "errors": 319 + }, + { + "path": "api/sys/impl/task-service-impl.service.ts", + "errors": 41 + }, + { + "path": "api/sys/impl/upload-service-impl.service.ts", + "errors": 30 + }, + { + "path": "core/sys/impl/core-agreement-service-impl.service.ts", + "errors": 31 + }, + { + "path": "core/sys/impl/core-config-service-impl.service.ts", + "errors": 137 + }, + { + "path": "core/sys/impl/core-export-service-impl.service.ts", + "errors": 97 + }, + { + "path": "core/sys/impl/core-menu-service-impl.service.ts", + "errors": 52 + }, + { + "path": "core/sys/impl/core-printer-service-impl.service.ts", + "errors": 72 + }, + { + "path": "core/sys/impl/core-scan-service-impl.service.ts", + "errors": 25 + }, + { + "path": "core/sys/impl/core-sys-config-service-impl.service.ts", + "errors": 140 + }, + { + "path": "core/sys/impl/core-upload-service-impl.service.ts", + "errors": 71 + }, + { + "path": "admin/member/impl/member-account-service-impl.service.ts", + "errors": 135 + }, + { + "path": "admin/member/impl/member-address-service-impl.service.ts", + "errors": 48 + }, + { + "path": "admin/member/impl/member-cash-out-service-impl.service.ts", + "errors": 126 + }, + { + "path": "admin/member/impl/member-config-service-impl.service.ts", + "errors": 45 + }, + { + "path": "admin/member/impl/member-label-service-impl.service.ts", + "errors": 98 + }, + { + "path": "admin/member/impl/member-level-service-impl.service.ts", + "errors": 110 + }, + { + "path": "admin/member/impl/member-service-impl.service.ts", + "errors": 352 + }, + { + "path": "admin/member/impl/member-sign-service-impl.service.ts", + "errors": 53 + }, + { + "path": "api/member/impl/member-account-service-impl.service.ts", + "errors": 327 + }, + { + "path": "api/member/impl/member-address-service-impl.service.ts", + "errors": 83 + }, + { + "path": "api/member/impl/member-cash-out-service-impl.service.ts", + "errors": 197 + }, + { + "path": "api/member/impl/member-level-service-impl.service.ts", + "errors": 100 + }, + { + "path": "api/member/impl/member-service-impl.service.ts", + "errors": 168 + }, + { + "path": "api/member/impl/member-sign-service-impl.service.ts", + "errors": 191 + }, + { + "path": "core/member/impl/core-member-account-service-impl.service.ts", + "errors": 48 + }, + { + "path": "core/member/impl/core-member-cash-out-service-impl.service.ts", + "errors": 240 + }, + { + "path": "core/member/impl/core-member-config-service-impl.service.ts", + "errors": 80 + }, + { + "path": "core/member/impl/core-member-level-service-impl.service.ts", + "errors": 34 + }, + { + "path": "core/member/impl/core-member-service-impl.service.ts", + "errors": 445 + }, + { + "path": "admin/site/impl/site-account-log-service-impl.service.ts", + "errors": 148 + }, + { + "path": "admin/site/impl/site-group-service-impl.service.ts", + "errors": 177 + }, + { + "path": "admin/site/impl/site-service-impl.service.ts", + "errors": 941 + }, + { + "path": "admin/site/impl/site-user-service-impl.service.ts", + "errors": 122 + }, + { + "path": "core/site/impl/core-site-account-service-impl.service.ts", + "errors": 41 + }, + { + "path": "core/site/impl/core-site-service-impl.service.ts", + "errors": 999 + }, + { + "path": "admin/pay/impl/pay-channel-service-impl.service.ts", + "errors": 180 + }, + { + "path": "admin/pay/impl/pay-refund-service-impl.service.ts", + "errors": 49 + }, + { + "path": "admin/pay/impl/pay-service-impl.service.ts", + "errors": 152 + }, + { + "path": "admin/pay/impl/pay-transfer-service-impl.service.ts", + "errors": 26 + }, + { + "path": "api/pay/impl/pay-service-impl.service.ts", + "errors": 93 + }, + { + "path": "core/pay/impl/core-pay-channel-service-impl.service.ts", + "errors": 55 + }, + { + "path": "core/pay/impl/core-pay-event-service-impl.service.ts", + "errors": 100 + }, + { + "path": "core/pay/impl/core-pay-service-impl.service.ts", + "errors": 245 + }, + { + "path": "core/pay/impl/core-refund-service-impl.service.ts", + "errors": 120 + }, + { + "path": "core/pay/impl/core-transfer-scene-service-impl.service.ts", + "errors": 123 + }, + { + "path": "core/pay/impl/core-transfer-service-impl.service.ts", + "errors": 158 + }, + { + "path": "admin/notice/impl/notice-log-service-impl.service.ts", + "errors": 11 + }, + { + "path": "admin/notice/impl/notice-service-impl.service.ts", + "errors": 28 + }, + { + "path": "admin/notice/impl/nui-sms-service-impl.service.ts", + "errors": 786 + }, + { + "path": "core/notice/impl/core-notice-service-impl.service.ts", + "errors": 216 + }, + { + "path": "core/notice/impl/core-notice-sms-log-service-impl.service.ts", + "errors": 19 + }, + { + "path": "admin/aliapp/impl/aliapp-config-service-impl.service.ts", + "errors": 20 + }, + { + "path": "admin/channel/impl/admin-app-service-impl.service.ts", + "errors": 169 + }, + { + "path": "admin/diy/impl/diy-config-service-impl.service.ts", + "errors": 14 + }, + { + "path": "admin/diy/impl/diy-route-service-impl.service.ts", + "errors": 42 + }, + { + "path": "admin/diy/impl/diy-service-impl.service.ts", + "errors": 472 + }, + { + "path": "admin/diy/impl/diy-theme-service-impl.service.ts", + "errors": 188 + }, + { + "path": "admin/diy_form/impl/diy-form-config-service-impl.service.ts", + "errors": 20 + }, + { + "path": "admin/diy_form/impl/diy-form-records-service-impl.service.ts", + "errors": 329 + }, + { + "path": "admin/diy_form/impl/diy-form-service-impl.service.ts", + "errors": 594 + }, + { + "path": "admin/generator/impl/generate-column-service-impl.service.ts", + "errors": 1 + }, + { + "path": "admin/generator/impl/generate-service-impl.service.ts", + "errors": 298 + }, + { + "path": "admin/home/impl/auth-site-service-impl.service.ts", + "errors": 330 + }, + { + "path": "admin/install/impl/install-system-service-impl.service.ts", + "errors": 44 + }, + { + "path": "admin/niucloud/impl/cloud-build-service-impl.service.ts", + "errors": 131 + }, + { + "path": "admin/niucloud/impl/niu-cloud-service-impl.service.ts", + "errors": 148 + }, + { + "path": "admin/stat/impl/stat-hour-service-impl.service.ts", + "errors": 143 + }, + { + "path": "admin/stat/impl/stat-service-impl.service.ts", + "errors": 89 + }, + { + "path": "admin/upgrade/impl/upgrade-service-impl.service.ts", + "errors": 523 + }, + { + "path": "admin/upload/impl/storage-config-service-impl.service.ts", + "errors": 84 + }, + { + "path": "admin/verify/impl/verifier-service-impl.service.ts", + "errors": 71 + }, + { + "path": "admin/verify/impl/verify-service-impl.service.ts", + "errors": 90 + }, + { + "path": "admin/weapp/impl/weapp-config-service-impl.service.ts", + "errors": 106 + }, + { + "path": "admin/weapp/impl/weapp-template-service-impl.service.ts", + "errors": 40 + }, + { + "path": "admin/weapp/impl/weapp-version-service-impl.service.ts", + "errors": 115 + }, + { + "path": "admin/wechat/impl/wechat-config-service-impl.service.ts", + "errors": 999 + }, + { + "path": "admin/wechat/impl/wechat-media-service-impl.service.ts", + "errors": 135 + }, + { + "path": "admin/wechat/impl/wechat-menu-service-impl.service.ts", + "errors": 9 + }, + { + "path": "admin/wechat/impl/wechat-reply-service-impl.service.ts", + "errors": 123 + }, + { + "path": "admin/wechat/impl/wechat-template-service-impl.service.ts", + "errors": 39 + }, + { + "path": "admin/wxoplatform/impl/oplatform-config-service-impl.service.ts", + "errors": 14 + }, + { + "path": "admin/wxoplatform/impl/oplatform-server-service-impl.service.ts", + "errors": 51 + }, + { + "path": "admin/wxoplatform/impl/oplatform-service-impl.service.ts", + "errors": 146 + }, + { + "path": "admin/wxoplatform/impl/weapp-version-service-impl.service.ts", + "errors": 264 + }, + { + "path": "api/agreement/impl/agreement-service-impl.service.ts", + "errors": 16 + }, + { + "path": "api/channel/impl/app-service-impl.service.ts", + "errors": 999 + }, + { + "path": "api/diy/impl/diy-form-service-impl.service.ts", + "errors": 551 + }, + { + "path": "api/diy/impl/diy-service-impl.service.ts", + "errors": 111 + }, + { + "path": "api/login/impl/auth-service-impl.service.ts", + "errors": 39 + }, + { + "path": "api/login/impl/login-service-impl.service.ts", + "errors": 134 + }, + { + "path": "api/login/impl/register-service-impl.service.ts", + "errors": 129 + }, + { + "path": "api/weapp/impl/serve-service-impl.service.ts", + "errors": 30 + }, + { + "path": "api/weapp/impl/weapp-service-impl.service.ts", + "errors": 152 + }, + { + "path": "api/wechat/impl/serve-service-impl.service.ts", + "errors": 31 + }, + { + "path": "api/wechat/impl/wechat-service-impl.service.ts", + "errors": 151 + }, + { + "path": "core/aliapp/impl/core-aliapp-config-service-impl.service.ts", + "errors": 16 + }, + { + "path": "core/app/impl/core-app-service-impl.service.ts", + "errors": 2 + }, + { + "path": "core/app/impl/core-async-task-service-impl.service.ts", + "errors": 8 + }, + { + "path": "core/app/impl/core-queue-service-impl.service.ts", + "errors": 16 + }, + { + "path": "core/captcha/impl/core-captcha-img-service-impl.service.ts", + "errors": 31 + }, + { + "path": "core/captcha/impl/default-captcha-service-impl.service.ts", + "errors": 42 + }, + { + "path": "core/channel/impl/core-app-cloud-service-impl.service.ts", + "errors": 120 + }, + { + "path": "core/channel/impl/core-app-service-impl.service.ts", + "errors": 17 + }, + { + "path": "core/channel/impl/core-h5-service-impl.service.ts", + "errors": 14 + }, + { + "path": "core/channel/impl/core-pc-service-impl.service.ts", + "errors": 14 + }, + { + "path": "core/diy/impl/core-diy-service-impl.service.ts", + "errors": 31 + }, + { + "path": "core/diy_form/impl/core-diy-form-config-service-impl.service.ts", + "errors": 124 + }, + { + "path": "core/diy_form/impl/core-diy-form-records-service-impl.service.ts", + "errors": 272 + }, + { + "path": "core/niucloud/impl/i-core-niucloud-config-service-impl.service.ts", + "errors": 11 + }, + { + "path": "core/poster/impl/core-poster-service-impl.service.ts", + "errors": 97 + }, + { + "path": "core/schedule/impl/core-schedule-service-impl.service.ts", + "errors": 118 + }, + { + "path": "core/sms/impl/core-sms-service-impl.service.ts", + "errors": 34 + }, + { + "path": "core/upload/impl/core-base64-service-impl.service.ts", + "errors": 999 + }, + { + "path": "core/upload/impl/core-fetch-service-impl.service.ts", + "errors": 24 + }, + { + "path": "core/upload/impl/core-storage-service-impl.service.ts", + "errors": 64 + }, + { + "path": "core/user/impl/core-user-service-impl.service.ts", + "errors": 6 + }, + { + "path": "core/weapp/impl/core-weapp-cloud-service-impl.service.ts", + "errors": 83 + }, + { + "path": "core/weapp/impl/core-weapp-config-service-impl.service.ts", + "errors": 31 + }, + { + "path": "core/weapp/impl/core-weapp-delivery-service-impl.service.ts", + "errors": 99 + }, + { + "path": "core/weapp/impl/core-weapp-service-impl.service.ts", + "errors": 11 + }, + { + "path": "core/wechat/impl/core-wechat-config-service-impl.service.ts", + "errors": 31 + }, + { + "path": "core/wechat/impl/core-wechat-reply-service-impl.service.ts", + "errors": 22 + }, + { + "path": "core/wxoplatform/impl/core-oplatform-service-impl.service.ts", + "errors": 24 + }, + { + "path": "core/wxoplatform/impl/core-oplatform-static-config-service-impl.service.ts", + "errors": 33 + } + ] +} \ No newline at end of file diff --git a/wwjcloud-nest-v1/tools/extract-quality-services.js b/wwjcloud-nest-v1/tools/extract-quality-services.js new file mode 100755 index 00000000..f445ad48 --- /dev/null +++ b/wwjcloud-nest-v1/tools/extract-quality-services.js @@ -0,0 +1,245 @@ +#!/usr/bin/env node +/** + * 高质量Service自动提取工具 + * + * 功能: + * 1. 从ac00caf备份中逐个提取Service + * 2. 跳过addon模块 + * 3. 每次提取后验证编译 + * 4. 只保留能编译通过的Service + * 5. 生成详细报告 + */ + +const fs = require('fs'); +const path = require('path'); +const { execSync } = require('child_process'); + +const BACKUP_DIR = '/tmp/ac00caf-services-backup'; +const TARGET_DIR = path.join(__dirname, '../wwjcloud/libs/wwjcloud-core/src/services'); +const PROJECT_DIR = path.join(__dirname, '../wwjcloud'); + +// 获取所有非addon的service文件 +function getAllNonAddonServices(dir, basePath = '') { + const services = []; + const items = fs.readdirSync(dir, { withFileTypes: true }); + + for (const item of items) { + const fullPath = path.join(dir, item.name); + const relativePath = path.join(basePath, item.name); + + // 跳过addon目录 + if (item.name === 'addon' || relativePath.includes('/addon/')) { + continue; + } + + if (item.isDirectory()) { + services.push(...getAllNonAddonServices(fullPath, relativePath)); + } else if (item.name.endsWith('-impl.service.ts')) { + services.push({ + name: item.name, + relativePath: relativePath, + fullPath: fullPath, + category: getCategoryFromPath(relativePath) + }); + } + } + + return services; +} + +function getCategoryFromPath(relativePath) { + const parts = relativePath.split('/'); + if (parts.includes('auth')) return 'auth'; + if (parts.includes('sys')) return 'sys'; + if (parts.includes('member')) return 'member'; + if (parts.includes('site')) return 'site'; + if (parts.includes('pay')) return 'pay'; + if (parts.includes('notice')) return 'notice'; + if (parts.includes('dict')) return 'dict'; + return 'other'; +} + +function compileProject() { + try { + console.log(' 🔨 编译中...'); + execSync('npm run build', { + cwd: PROJECT_DIR, + stdio: 'pipe', + timeout: 120000 // 2分钟超时 + }); + return { success: true, errors: 0 }; + } catch (error) { + const output = error.stdout?.toString() || error.stderr?.toString() || ''; + const errorMatch = output.match(/Found (\d+) error/); + const errorCount = errorMatch ? parseInt(errorMatch[1]) : 999; + return { success: false, errors: errorCount, output }; + } +} + +function extractService(service) { + const targetPath = path.join(TARGET_DIR, service.relativePath); + const targetDir = path.dirname(targetPath); + + // 确保目标目录存在 + if (!fs.existsSync(targetDir)) { + fs.mkdirSync(targetDir, { recursive: true }); + } + + // 复制文件 + fs.copyFileSync(service.fullPath, targetPath); +} + +function revertService(service) { + const targetPath = path.join(TARGET_DIR, service.relativePath); + + // 恢复到空实现版本(从当前HEAD) + try { + execSync(`git checkout HEAD -- ${targetPath}`, { + cwd: path.join(__dirname, '..'), + stdio: 'pipe' + }); + } catch (error) { + // 如果git checkout失败,删除文件 + if (fs.existsSync(targetPath)) { + fs.unlinkSync(targetPath); + } + } +} + +// 主流程 +async function main() { + console.log('╔══════════════════════════════════════════════════════════════╗'); + console.log('║ 🎯 高质量Service自动提取工具 ║'); + console.log('╚══════════════════════════════════════════════════════════════╝\n'); + + // 1. 获取所有非addon的service + console.log('📋 扫描ac00caf备份中的Service文件...'); + const services = getAllNonAddonServices(BACKUP_DIR); + console.log(`✅ 找到 ${services.length} 个非Addon Service\n`); + + // 2. 按优先级排序 + const priorityOrder = ['auth', 'dict', 'sys', 'member', 'site', 'pay', 'notice', 'other']; + services.sort((a, b) => { + const aPriority = priorityOrder.indexOf(a.category); + const bPriority = priorityOrder.indexOf(b.category); + return aPriority - bPriority; + }); + + // 3. 先验证当前基线是否可编译 + console.log('🔍 验证当前基线(应该0错误)...'); + const baselineResult = compileProject(); + if (!baselineResult.success) { + console.log(`❌ 当前基线有 ${baselineResult.errors} 个错误,请先修复!`); + process.exit(1); + } + console.log('✅ 当前基线编译通过(0错误)\n'); + + // 4. 逐个提取并验证 + const results = { + success: [], + failed: [], + total: services.length + }; + + console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n'); + console.log('🚀 开始逐个提取并验证...\n'); + + for (let i = 0; i < services.length; i++) { + const service = services[i]; + const progress = `[${i + 1}/${services.length}]`; + + console.log(`${progress} ${service.category.toUpperCase()}: ${service.name}`); + + // 提取service + extractService(service); + + // 编译验证 + const result = compileProject(); + + if (result.success) { + console.log(` ✅ 成功 - 0错误`); + results.success.push(service); + } else { + console.log(` ❌ 失败 - ${result.errors}个错误`); + results.failed.push({ + service, + errors: result.errors + }); + + // 回退这个service + revertService(service); + console.log(` ↩️ 已回退`); + } + + console.log(''); + } + + // 5. 生成报告 + console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n'); + console.log('╔══════════════════════════════════════════════════════════════╗'); + console.log('║ 📊 提取结果统计 ║'); + console.log('╚══════════════════════════════════════════════════════════════╝\n'); + + console.log(`📁 总扫描: ${results.total} 个Service`); + console.log(`✅ 成功提取: ${results.success.length} 个 (${(results.success.length/results.total*100).toFixed(1)}%)`); + console.log(`❌ 提取失败: ${results.failed.length} 个 (${(results.failed.length/results.total*100).toFixed(1)}%)\n`); + + if (results.success.length > 0) { + console.log('✅ 成功提取的Service:\n'); + const byCategory = {}; + results.success.forEach(s => { + if (!byCategory[s.category]) byCategory[s.category] = []; + byCategory[s.category].push(s.name); + }); + + Object.keys(byCategory).forEach(category => { + console.log(` ${category.toUpperCase()}:`); + byCategory[category].forEach(name => { + console.log(` - ${name}`); + }); + console.log(''); + }); + } + + if (results.failed.length > 0) { + console.log('❌ 提取失败的Service(需要手工修复):\n'); + results.failed.forEach(({ service, errors }) => { + console.log(` - ${service.name} (${errors}个错误)`); + }); + console.log(''); + } + + // 6. 保存详细报告 + const report = { + timestamp: new Date().toISOString(), + total: results.total, + success: results.success.length, + failed: results.failed.length, + successRate: (results.success.length / results.total * 100).toFixed(1) + '%', + successList: results.success.map(s => s.relativePath), + failedList: results.failed.map(f => ({ + path: f.service.relativePath, + errors: f.errors + })) + }; + + const reportPath = path.join(__dirname, '../docs/SERVICE_EXTRACTION_REPORT.json'); + fs.writeFileSync(reportPath, JSON.stringify(report, null, 2)); + console.log(`📝 详细报告已保存到: docs/SERVICE_EXTRACTION_REPORT.json\n`); + + console.log('🎉 提取完成!\n'); + + if (results.success.length > 0) { + console.log('💡 下一步:'); + console.log(' 1. 提交成功提取的Service'); + console.log(' 2. 运行时测试验证API功能'); + console.log(' 3. 根据失败列表手工修复剩余Service\n'); + } +} + +// 执行 +main().catch(error => { + console.error('❌ 执行失败:', error); + process.exit(1); +}); + diff --git a/wwjcloud-nest-v1/tools/fix-simple-errors.js b/wwjcloud-nest-v1/tools/fix-simple-errors.js new file mode 100644 index 00000000..d46e8d11 --- /dev/null +++ b/wwjcloud-nest-v1/tools/fix-simple-errors.js @@ -0,0 +1,93 @@ +#!/usr/bin/env node +/** + * 修复简单常见错误 + * 专门处理ac00caf中的常见低级错误 + */ + +const fs = require('fs'); +const path = require('path'); + +const BACKUP_DIR = '/tmp/ac00caf-services-backup'; + +function getAllServiceFiles(dir, basePath = '') { + const services = []; + const items = fs.readdirSync(dir, { withFileTypes: true }); + + for (const item of items) { + const fullPath = path.join(dir, item.name); + const relativePath = path.join(basePath, item.name); + + if (item.name === 'addon' || relativePath.includes('/addon/')) { + continue; + } + + if (item.isDirectory()) { + services.push(...getAllServiceFiles(fullPath, relativePath)); + } else if (item.name.endsWith('-impl.service.ts')) { + services.push({ fullPath, relativePath }); + } + } + + return services; +} + +console.log('🔧 批量修复ac00caf中的简单错误...\n'); + +const services = getAllServiceFiles(BACKUP_DIR); +let fixCount = 0; + +services.forEach(service => { + let content = fs.readFileSync(service.fullPath, 'utf-8'); + const original = content; + + // 1. 删除孤立的super()调用(没有extends的类) + // 查找类声明 + const classMatch = content.match(/@Injectable\(\)\s*export\s+class\s+\w+\s*\{/); + if (classMatch && !content.includes(' extends ')) { + // 没有extends,删除super() + content = content.replace(/^\s*super\(\);?\s*$/gm, ''); + } + + // 2. 修复ObjectUtil/StringUtil等Java工具类 + content = content.replace(/ObjectUtil\.isEmpty\(/g, '!'); + content = content.replace(/ObjectUtil\.isNotEmpty\(/g, '!!'); + content = content.replace(/StringUtil\.isEmpty\(/g, '!'); + content = content.replace(/StringUtil\.isNotEmpty\(/g, '!!'); + content = content.replace(/StringUtil\.isBlank\(/g, '!'); + content = content.replace(/StringUtil\.isNotBlank\(/g, '!!'); + + // 3. 删除多余的右括号(由于上面的替换产生) + content = content.replace(/!!\)/g, ''); + content = content.replace(/!\)/g, ''); + + // 4. 修复CollUtil + content = content.replace(/CollUtil\.isEmpty\(/g, '!'); + content = content.replace(/CollUtil\.isNotEmpty\(/g, '!!'); + + // 5. 修复Arrays.asList() → 数组字面量 + content = content.replace(/Arrays\.asList\(([^)]+)\)/g, '[$1]'); + + // 6. 修复Collections.emptyList() → [] + content = content.replace(/Collections\.emptyList\(\)/g, '[]'); + content = content.replace(/Collections\.emptyMap\(\)/g, '{}'); + + // 7. 修复Optional + content = content.replace(/Optional\.ofNullable\(([^)]+)\)\.orElse\(([^)]+)\)/g, '($1) || ($2)'); + content = content.replace(/Optional\.of\(([^)]+)\)/g, '$1'); + + // 8. 修复LocalDateTime.now() → new Date() + content = content.replace(/LocalDateTime\.now\(\)/g, 'new Date()'); + content = content.replace(/LocalDate\.now\(\)/g, 'new Date()'); + + // 9. 删除System.out.println + content = content.replace(/^\s*System\.out\.println\([^)]*\);?\s*$/gm, ''); + + if (content !== original) { + fs.writeFileSync(service.fullPath, content, 'utf-8'); + fixCount++; + } +}); + +console.log(`✅ 已修复 ${fixCount} 个Service的简单错误\n`); +console.log('💡 重新运行提取工具验证效果...\n'); + diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/controller.module.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/controller.module.ts index f2a8980b..27b71659 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/controller.module.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/controller.module.ts @@ -106,7 +106,7 @@ import { ServeController as ApiWeappServeController } from './controllers/api/we import { WeappController as ApiWeappWeappController } from './controllers/api/weapp/weapp.controller'; import { ServeController as ApiWechatServeController } from './controllers/api/wechat/serve.controller'; import { WechatController as ApiWechatWechatController } from './controllers/api/wechat/wechat.controller'; -import { CoreAddonController as CoreCoreAddonController } from './controllers/core/core-addon.controller'; +// import { CoreAddonController as CoreCoreAddonController } from './controllers/core/core-addon.controller'; // Addon模块已禁用 import { CoreAsyncTaskController as CoreCoreAsyncTaskController } from './controllers/core/core-async.controller'; import { CoreQueueControlController as CoreCoreQueueControlController } from './controllers/core/core-queue-control.controller'; import { HttpServerErrorController as CoreHttpServerErrorController } from './controllers/core/http-server-error.controller';