diff --git a/wwjcloud-nest-v1/tools/java-to-nestjs-migration/converters/service-method-converter.js b/wwjcloud-nest-v1/tools/java-to-nestjs-migration/converters/service-method-converter.js index 80a2f72b..ccd95157 100644 --- a/wwjcloud-nest-v1/tools/java-to-nestjs-migration/converters/service-method-converter.js +++ b/wwjcloud-nest-v1/tools/java-to-nestjs-migration/converters/service-method-converter.js @@ -135,11 +135,20 @@ class ServiceMethodConverter { // 【文件操作】Java File API → Node.js fs/path // ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + // FileUtils工具类 + tsBody = tsBody.replace(/FileUtils\.cleanDirectory\(([^)]+)\)/g, 'fs.rmSync($1, { recursive: true, force: true })'); + tsBody = tsBody.replace(/FileUtils\.copyFile\(([^,]+),\s*([^)]+)\)/g, 'fs.copyFileSync($1, $2)'); + tsBody = tsBody.replace(/FileUtils\.deleteDirectory\(([^)]+)\)/g, 'fs.rmSync($1, { recursive: true, force: true })'); + tsBody = tsBody.replace(/FileUtils\.readFileToString\(([^)]+)\)/g, 'fs.readFileSync($1, \'utf-8\')'); + tsBody = tsBody.replace(/FileUtils\.writeStringToFile\(([^,]+),\s*([^)]+)\)/g, 'fs.writeFileSync($1, $2, \'utf-8\')'); + + // File API tsBody = tsBody.replace(/new\s+File\(([^)]+)\)/g, '$1'); tsBody = tsBody.replace(/(\w+)\.exists\(\)/g, 'fs.existsSync($1)'); tsBody = tsBody.replace(/(\w+)\.isDirectory\(\)/g, 'fs.lstatSync($1).isDirectory()'); tsBody = tsBody.replace(/(\w+)\.getName\(\)/g, 'path.basename($1)'); tsBody = tsBody.replace(/(\w+)\.listFiles\(\)/g, 'fs.readdirSync($1)'); + tsBody = tsBody.replace(/(\w+)\.getPath\(\)/g, '$1'); // ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ // 【字符串方法】 @@ -174,6 +183,13 @@ class ServiceMethodConverter { // 【异常处理】 // ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + // try-catch语句:catch (Exception e) → catch (error) + tsBody = tsBody.replace(/catch\s*\(\s*(?:Exception|RuntimeException|Throwable)\s+(\w+)\s*\)/g, 'catch ($1)'); + + // 异常方法调用:e.getMessage() → e.message + tsBody = tsBody.replace(/(\w+)\.getMessage\(\)/g, '$1.message'); + + // 异常抛出 tsBody = tsBody.replace(/throw\s+new\s+CommonException\(/g, 'throw new BadRequestException('); tsBody = tsBody.replace(/throw\s+new\s+AuthException\(/g, 'throw new UnauthorizedException('); tsBody = tsBody.replace(/throw\s+new\s+RuntimeException\(/g, 'throw new Error('); diff --git a/wwjcloud-nest-v1/tools/java-to-nestjs-migration/generators/service-generator.js b/wwjcloud-nest-v1/tools/java-to-nestjs-migration/generators/service-generator.js index 93b89586..f76feeff 100644 --- a/wwjcloud-nest-v1/tools/java-to-nestjs-migration/generators/service-generator.js +++ b/wwjcloud-nest-v1/tools/java-to-nestjs-migration/generators/service-generator.js @@ -140,13 +140,20 @@ class ServiceGenerator { /** * 生成服务内容 + * + * ✅ 增强:自动分析方法体,添加需要的imports */ generateServiceContent(javaService, serviceName) { - const imports = this.generateImports(javaService); - const decorators = this.generateDecorators(); - const constructor = this.generateConstructor(javaService); + // 先生成方法,以便分析需要哪些imports const methods = this.generateMethods(javaService); + // 分析方法体,获取需要的imports + const additionalImports = this.analyzeAdditionalImports(methods); + + const imports = this.generateImports(javaService, additionalImports); + const decorators = this.generateDecorators(); + const constructor = this.generateConstructor(javaService, additionalImports); + return `${imports} ${decorators} @@ -158,16 +165,91 @@ ${methods} } /** - * 生成导入语句 + * 分析方法体,识别需要的额外imports */ - generateImports(javaService) { + analyzeAdditionalImports(methodsCode) { + const imports = { + nestjs: new Set(), + nodeModules: new Set(), + boot: new Set() + }; + + // NestJS异常 + if (methodsCode.includes('BadRequestException')) { + imports.nestjs.add('BadRequestException'); + } + if (methodsCode.includes('UnauthorizedException')) { + imports.nestjs.add('UnauthorizedException'); + } + + // Node.js模块 + if (methodsCode.includes('fs.')) { + imports.nodeModules.add('fs'); + } + if (methodsCode.includes('path.')) { + imports.nodeModules.add('path'); + } + + // ConfigService + if (methodsCode.includes('this.config.')) { + imports.boot.add('ConfigService'); + } + + return { + nestjs: Array.from(imports.nestjs), + nodeModules: Array.from(imports.nodeModules), + boot: Array.from(imports.boot) + }; + } + + /** + * 生成导入语句 + * + * ✅ 增强:接收额外的imports(NestJS异常、Node.js模块、Boot服务) + */ + generateImports(javaService, additionalImports = {}) { const imports = [ - "import { Injectable } from '@nestjs/common';", - "import { InjectRepository } from '@nestjs/typeorm';", - "import { Repository } from 'typeorm';", - "import { QueueService, EventBus } from '@wwjBoot';", - "import { Result } from '@wwjBoot';" + "import { Injectable } from '@nestjs/common';" ]; + + // ✅ NestJS异常(按需导入) + const nestjsImports = ['Injectable']; + if (additionalImports.nestjs && additionalImports.nestjs.length > 0) { + additionalImports.nestjs.forEach(item => { + if (!nestjsImports.includes(item)) { + nestjsImports.push(item); + } + }); + } + if (nestjsImports.length > 1) { + imports[0] = `import { ${nestjsImports.join(', ')} } from '@nestjs/common';`; + } + + // TypeORM + imports.push("import { InjectRepository } from '@nestjs/typeorm';"); + imports.push("import { Repository } from 'typeorm';"); + + // ✅ Boot层(按需导入) + const bootImports = ['QueueService', 'EventBus', 'Result']; + if (additionalImports.boot && additionalImports.boot.length > 0) { + additionalImports.boot.forEach(item => { + if (!bootImports.includes(item)) { + bootImports.push(item); + } + }); + } + imports.push(`import { ${bootImports.join(', ')} } from '@wwjBoot';`); + + // ✅ Node.js模块(按需导入) + if (additionalImports.nodeModules && additionalImports.nodeModules.length > 0) { + additionalImports.nodeModules.forEach(module => { + if (module === 'fs') { + imports.push(`import * as fs from 'fs';`); + } else if (module === 'path') { + imports.push(`import * as path from 'path';`); + } + }); + } // 计算到entities目录的相对路径 const entityRelativePath = this.calculateEntityPath(javaService.filePath); @@ -229,10 +311,17 @@ ${methods} /** * 生成构造函数 + * + * ✅ 增强:根据additionalImports注入ConfigService */ - generateConstructor(javaService) { + generateConstructor(javaService, additionalImports = {}) { const injections = []; + // ✅ 添加ConfigService注入(如果需要) + if (additionalImports.boot && additionalImports.boot.includes('ConfigService')) { + injections.push(' private readonly config: ConfigService,'); + } + // 添加框架服务注入 injections.push(' private readonly eventBus: EventBus,'); injections.push(' private readonly queueService: QueueService,'); diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/listeners/event-mediator-context.listener.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/listeners/event-mediator-context.listener.ts index 037e2ec5..4525facd 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/listeners/event-mediator-context.listener.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/listeners/event-mediator-context.listener.ts @@ -89,58 +89,4 @@ export class EventMediatorContextListener { throw error; } } - - /** - * ClassPathScanningCandidateComponentProvider - * - */ - // @ts-ignore - TypeScript装饰器类型推断问题 - @OnEvent('default.event') - async classPathScanningCandidateComponentProvider(event: any): Promise { - this.logger.log('收到事件: ClassPathScanningCandidateComponentProvider', event); - - try { - // 验证事件数据 - if (!event || !event.data) { - this.logger.warn('事件数据为空,跳过处理'); - return; - } - - // 处理事件业务逻辑 - const eventId = event.data.id; - this.logger.debug(`处理事件,ID: ${eventId}`); - - this.logger.log('事件处理完成: ClassPathScanningCandidateComponentProvider'); - } catch (error) { - this.logger.error('事件处理失败: ClassPathScanningCandidateComponentProvider', error.stack); - throw error; - } - } - - /** - * isCandidateComponent - * - */ - // @ts-ignore - TypeScript装饰器类型推断问题 - @OnEvent('default.event') - async isCandidateComponent(event: any): Promise { - this.logger.log('收到事件: isCandidateComponent', event); - - try { - // 验证事件数据 - if (!event || !event.data) { - this.logger.warn('事件数据为空,跳过处理'); - return; - } - - // 处理事件业务逻辑 - const eventId = event.data.id; - this.logger.debug(`处理事件,ID: ${eventId}`); - - this.logger.log('事件处理完成: isCandidateComponent'); - } catch (error) { - this.logger.error('事件处理失败: isCandidateComponent', error.stack); - throw error; - } - } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/listeners/method-call-stack-aspect.listener.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/listeners/method-call-stack-aspect.listener.ts index 2a5a3d9f..13ed3fe3 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/listeners/method-call-stack-aspect.listener.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/listeners/method-call-stack-aspect.listener.ts @@ -36,6 +36,33 @@ export class MethodCallStackAspectListener { } } + /** + * aroundMethod + * + */ + // @ts-ignore - TypeScript装饰器类型推断问题 + @OnEvent('default.event') + async aroundMethod(event: any): Promise { + this.logger.log('收到事件: aroundMethod', event); + + try { + // 验证事件数据 + if (!event || !event.data) { + this.logger.warn('事件数据为空,跳过处理'); + return; + } + + // 处理事件业务逻辑 + const eventId = event.data.id; + this.logger.debug(`处理事件,ID: ${eventId}`); + + this.logger.log('事件处理完成: aroundMethod'); + } catch (error) { + this.logger.error('事件处理失败: aroundMethod', error.stack); + throw error; + } + } + /** * serviceMethods * diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/listeners/quartz-config.listener.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/listeners/quartz-config.listener.ts index af54f368..14eb1ed4 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/listeners/quartz-config.listener.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/listeners/quartz-config.listener.ts @@ -35,4 +35,58 @@ export class QuartzConfigListener { throw error; } } + + /** + * createJobInstance + * + */ + // @ts-ignore - TypeScript装饰器类型推断问题 + @OnEvent('default.event') + async createJobInstance(event: any): Promise { + this.logger.log('收到事件: createJobInstance', event); + + try { + // 验证事件数据 + if (!event || !event.data) { + this.logger.warn('事件数据为空,跳过处理'); + return; + } + + // 处理事件业务逻辑 + const eventId = event.data.id; + this.logger.debug(`处理事件,ID: ${eventId}`); + + this.logger.log('事件处理完成: createJobInstance'); + } catch (error) { + this.logger.error('事件处理失败: createJobInstance', error.stack); + throw error; + } + } + + /** + * scheduler + * + */ + // @ts-ignore - TypeScript装饰器类型推断问题 + @OnEvent('default.event') + async scheduler(event: any): Promise { + this.logger.log('收到事件: scheduler', event); + + try { + // 验证事件数据 + if (!event || !event.data) { + this.logger.warn('事件数据为空,跳过处理'); + return; + } + + // 处理事件业务逻辑 + const eventId = event.data.id; + this.logger.debug(`处理事件,ID: ${eventId}`); + + this.logger.log('事件处理完成: scheduler'); + } catch (error) { + this.logger.error('事件处理失败: scheduler', error.stack); + throw error; + } + } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/listeners/request-utils.listener.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/listeners/request-utils.listener.ts index 78b4fbc4..4226ed41 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/listeners/request-utils.listener.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/listeners/request-utils.listener.ts @@ -845,85 +845,4 @@ export class RequestUtilsListener { throw error; } } - - /** - * getRequestMethod - * - */ - // @ts-ignore - TypeScript装饰器类型推断问题 - @OnEvent('default.event') - async getRequestMethod(event: any): Promise { - this.logger.log('收到事件: getRequestMethod', event); - - try { - // 验证事件数据 - if (!event || !event.data) { - this.logger.warn('事件数据为空,跳过处理'); - return; - } - - // 处理事件业务逻辑 - const eventId = event.data.id; - this.logger.debug(`处理事件,ID: ${eventId}`); - - this.logger.log('事件处理完成: getRequestMethod'); - } catch (error) { - this.logger.error('事件处理失败: getRequestMethod', error.stack); - throw error; - } - } - - /** - * handler - * - */ - // @ts-ignore - TypeScript装饰器类型推断问题 - @OnEvent('default.event') - async handler(event: any): Promise { - this.logger.log('收到事件: handler', event); - - try { - // 验证事件数据 - if (!event || !event.data) { - this.logger.warn('事件数据为空,跳过处理'); - return; - } - - // 处理事件业务逻辑 - const eventId = event.data.id; - this.logger.debug(`处理事件,ID: ${eventId}`); - - this.logger.log('事件处理完成: handler'); - } catch (error) { - this.logger.error('事件处理失败: handler', error.stack); - throw error; - } - } - - /** - * getDomain - * - */ - // @ts-ignore - TypeScript装饰器类型推断问题 - @OnEvent('default.event') - async getDomain(event: any): Promise { - this.logger.log('收到事件: getDomain', event); - - try { - // 验证事件数据 - if (!event || !event.data) { - this.logger.warn('事件数据为空,跳过处理'); - return; - } - - // 处理事件业务逻辑 - const eventId = event.data.id; - this.logger.debug(`处理事件,ID: ${eventId}`); - - this.logger.log('事件处理完成: getDomain'); - } catch (error) { - this.logger.error('事件处理失败: getDomain', error.stack); - throw error; - } - } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/listeners/sa-token-admin-interceptor.listener.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/listeners/sa-token-admin-interceptor.listener.ts index afab99de..0072cae7 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/listeners/sa-token-admin-interceptor.listener.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/listeners/sa-token-admin-interceptor.listener.ts @@ -9,5 +9,30 @@ export class SaTokenAdminInterceptorListener { constructor( private readonly eventBus: EventBus ) {} - // 无方法 + /** + * preHandle + * + */ + // @ts-ignore - TypeScript装饰器类型推断问题 + @OnEvent('default.event') + async preHandle(event: any): Promise { + this.logger.log('收到事件: preHandle', event); + + try { + // 验证事件数据 + if (!event || !event.data) { + this.logger.warn('事件数据为空,跳过处理'); + return; + } + + // 处理事件业务逻辑 + const eventId = event.data.id; + this.logger.debug(`处理事件,ID: ${eventId}`); + + this.logger.log('事件处理完成: preHandle'); + } catch (error) { + this.logger.error('事件处理失败: preHandle', error.stack); + throw error; + } + } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/listeners/sa-token-api-interceptor.listener.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/listeners/sa-token-api-interceptor.listener.ts index 73740b1c..f8c6a2ca 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/listeners/sa-token-api-interceptor.listener.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/listeners/sa-token-api-interceptor.listener.ts @@ -9,5 +9,30 @@ export class SaTokenApiInterceptorListener { constructor( private readonly eventBus: EventBus ) {} - // 无方法 + /** + * preHandle + * + */ + // @ts-ignore - TypeScript装饰器类型推断问题 + @OnEvent('default.event') + async preHandle(event: any): Promise { + this.logger.log('收到事件: preHandle', event); + + try { + // 验证事件数据 + if (!event || !event.data) { + this.logger.warn('事件数据为空,跳过处理'); + return; + } + + // 处理事件业务逻辑 + const eventId = event.data.id; + this.logger.debug(`处理事件,ID: ${eventId}`); + + this.logger.log('事件处理完成: preHandle'); + } catch (error) { + this.logger.error('事件处理失败: preHandle', error.stack); + throw error; + } + } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/listeners/sa-token-interceptor.listener.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/listeners/sa-token-interceptor.listener.ts index 774f735c..20948760 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/listeners/sa-token-interceptor.listener.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/listeners/sa-token-interceptor.listener.ts @@ -9,5 +9,30 @@ export class SaTokenInterceptorListener { constructor( private readonly eventBus: EventBus ) {} - // 无方法 + /** + * preHandle + * + */ + // @ts-ignore - TypeScript装饰器类型推断问题 + @OnEvent('default.event') + async preHandle(event: any): Promise { + this.logger.log('收到事件: preHandle', event); + + try { + // 验证事件数据 + if (!event || !event.data) { + this.logger.warn('事件数据为空,跳过处理'); + return; + } + + // 处理事件业务逻辑 + const eventId = event.data.id; + this.logger.debug(`处理事件,ID: ${eventId}`); + + this.logger.log('事件处理完成: preHandle'); + } catch (error) { + this.logger.error('事件处理失败: preHandle', error.stack); + throw error; + } + } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/listeners/show-marketing.listener.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/listeners/show-marketing.listener.ts index 23a317be..fb779b0e 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/listeners/show-marketing.listener.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/listeners/show-marketing.listener.ts @@ -197,139 +197,4 @@ export class ShowMarketingEnumListener { throw error; } } - - /** - * parseJsonArrayToCategory - * - */ - // @ts-ignore - TypeScript装饰器类型推断问题 - @OnEvent('default.event') - async parseJsonArrayToCategory(event: any): Promise { - this.logger.log('收到事件: parseJsonArrayToCategory', event); - - try { - // 验证事件数据 - if (!event || !event.data) { - this.logger.warn('事件数据为空,跳过处理'); - return; - } - - // 处理事件业务逻辑 - const eventId = event.data.id; - this.logger.debug(`处理事件,ID: ${eventId}`); - - this.logger.log('事件处理完成: parseJsonArrayToCategory'); - } catch (error) { - this.logger.error('事件处理失败: parseJsonArrayToCategory', error.stack); - throw error; - } - } - - /** - * parseMarketingToolsFromModules - * - */ - // @ts-ignore - TypeScript装饰器类型推断问题 - @OnEvent('default.event') - async parseMarketingToolsFromModules(event: any): Promise { - this.logger.log('收到事件: parseMarketingToolsFromModules', event); - - try { - // 验证事件数据 - if (!event || !event.data) { - this.logger.warn('事件数据为空,跳过处理'); - return; - } - - // 处理事件业务逻辑 - const eventId = event.data.id; - this.logger.debug(`处理事件,ID: ${eventId}`); - - this.logger.log('事件处理完成: parseMarketingToolsFromModules'); - } catch (error) { - this.logger.error('事件处理失败: parseMarketingToolsFromModules', error.stack); - throw error; - } - } - - /** - * parseMarketingJson - * - */ - // @ts-ignore - TypeScript装饰器类型推断问题 - @OnEvent('default.event') - async parseMarketingJson(event: any): Promise { - this.logger.log('收到事件: parseMarketingJson', event); - - try { - // 验证事件数据 - if (!event || !event.data) { - this.logger.warn('事件数据为空,跳过处理'); - return; - } - - // 处理事件业务逻辑 - const eventId = event.data.id; - this.logger.debug(`处理事件,ID: ${eventId}`); - - this.logger.log('事件处理完成: parseMarketingJson'); - } catch (error) { - this.logger.error('事件处理失败: parseMarketingJson', error.stack); - throw error; - } - } - - /** - * createShowMarketingVo - * - */ - // @ts-ignore - TypeScript装饰器类型推断问题 - @OnEvent('default.event') - async createShowMarketingVo(event: any): Promise { - this.logger.log('收到事件: createShowMarketingVo', event); - - try { - // 验证事件数据 - if (!event || !event.data) { - this.logger.warn('事件数据为空,跳过处理'); - return; - } - - // 处理事件业务逻辑 - const eventId = event.data.id; - this.logger.debug(`处理事件,ID: ${eventId}`); - - this.logger.log('事件处理完成: createShowMarketingVo'); - } catch (error) { - this.logger.error('事件处理失败: createShowMarketingVo', error.stack); - throw error; - } - } - - /** - * getSiteAddonModules - * - */ - // @ts-ignore - TypeScript装饰器类型推断问题 - @OnEvent('site.addAfter') - async getSiteAddonModules(event: any): Promise { - this.logger.log('收到事件: getSiteAddonModules', event); - - try { - // 验证事件数据 - if (!event || !event.data) { - this.logger.warn('事件数据为空,跳过处理'); - return; - } - - // 处理事件业务逻辑 - const eventId = event.data.id; - this.logger.debug(`处理事件,ID: ${eventId}`); - - this.logger.log('事件处理完成: getSiteAddonModules'); - } catch (error) { - this.logger.error('事件处理失败: getSiteAddonModules', error.stack); - throw error; - } - } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/listeners/system-restart.listener.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/listeners/system-restart.listener.ts index d7931ea9..f9ffe152 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/listeners/system-restart.listener.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/listeners/system-restart.listener.ts @@ -9,5 +9,30 @@ export class SystemRestartListenerListener { constructor( private readonly eventBus: EventBus ) {} - // 无方法 + /** + * init + * + */ + // @ts-ignore - TypeScript装饰器类型推断问题 + @OnEvent('default.event') + async init(event: any): Promise { + this.logger.log('收到事件: init', event); + + try { + // 验证事件数据 + if (!event || !event.data) { + this.logger.warn('事件数据为空,跳过处理'); + return; + } + + // 处理事件业务逻辑 + const eventId = event.data.id; + this.logger.debug(`处理事件,ID: ${eventId}`); + + this.logger.log('事件处理完成: init'); + } catch (error) { + this.logger.error('事件处理失败: init', error.stack); + throw error; + } + } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/listeners/test.listener.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/listeners/test.listener.ts index 2a4aadd4..f844a1ab 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/listeners/test.listener.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/listeners/test.listener.ts @@ -9,5 +9,30 @@ export class TestListenerListener { constructor( private readonly eventBus: EventBus ) {} - // 无方法 + /** + * handleEvent + * + */ + // @ts-ignore - TypeScript装饰器类型推断问题 + @OnEvent('test') + async handleEvent(event: any): Promise { + this.logger.log('收到事件: handleEvent', event); + + try { + // 验证事件数据 + if (!event || !event.data) { + this.logger.warn('事件数据为空,跳过处理'); + return; + } + + // 处理事件业务逻辑 + const eventId = event.data.id; + this.logger.debug(`处理事件,ID: ${eventId}`); + + this.logger.log('事件处理完成: handleEvent'); + } catch (error) { + this.logger.error('事件处理失败: handleEvent', error.stack); + throw error; + } + } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/listeners/wechatpay.listener.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/listeners/wechatpay.listener.ts index de6cf0b4..f2d9d069 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/listeners/wechatpay.listener.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/listeners/wechatpay.listener.ts @@ -567,6 +567,33 @@ export class WechatpayListener { } } + /** + * getRequestBody + * + */ + // @ts-ignore - TypeScript装饰器类型推断问题 + @OnEvent('default.event') + async getRequestBody(event: any): Promise { + this.logger.log('收到事件: getRequestBody', event); + + try { + // 验证事件数据 + if (!event || !event.data) { + this.logger.warn('事件数据为空,跳过处理'); + return; + } + + // 处理事件业务逻辑 + const eventId = event.data.id; + this.logger.debug(`处理事件,ID: ${eventId}`); + + this.logger.log('事件处理完成: getRequestBody'); + } catch (error) { + this.logger.error('事件处理失败: getRequestBody', error.stack); + throw error; + } + } + /** * getRequestHeader * diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/addon/impl/addon-develop-build-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/addon/impl/addon-develop-build-service-impl.service.ts index 164f8321..609d98c5 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/addon/impl/addon-develop-build-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/addon/impl/addon-develop-build-service-impl.service.ts @@ -14,15 +14,44 @@ export class AddonDevelopBuildServiceImplService { * build */ async build(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + if (!this.config.get('runActive') === "dev") throw new BadRequestException("只有在开发环境下才可以进行打包操作"); + + if (!this.config.get('projectNiucloudAddon' + addon).exists()) throw new BadRequestException("插件不存在"); + const infoFile: string = this.config.get('projectNiucloudAddon' + addon + "/src/main/resources/info.json"); + if (!fs.existsSync(infoFile)) throw new BadRequestException("插件不存在"); + + this.addon = addon; + this.addonPath = this.config.get('webRootDownAddon') + addon + "/"; + + try { + for (const child of this.fs.readdirSync(addonPath)) { + if (fs.lstatSync(child).isDirectory() && !path.basename(child) === "sql") FileUtils.cleanDirectory(child); + } + FileUtils.copyFile(infoFile, this.addonPath + "info.json"); + } catch (Exception e) { + throw new BadRequestException(e.getMessage()); + } + + this.admin(); + this.web(); + this.uniapp(); + this.java(); + this.jar(); + this.resource(); + this.buildUniappLangJson(); + this.buildUniappPagesJson(); + this.menu("site"); + this.menu("admin"); + // 生成压缩包 + this.compressor(); } /** * download */ async download(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const file: string = this.config.get('webRootDownResource' + "temp/" + key + ".zip"); + if (!fs.existsSync(file)) throw new BadRequestException("请先打包插件"); + return file.getPath().replace(this.config.get('projectRoot'), ""); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/addon/impl/addon-develop-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/addon/impl/addon-develop-service-impl.service.ts index 534e7c2d..0f7ae47c 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/addon/impl/addon-develop-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/addon/impl/addon-develop-service-impl.service.ts @@ -14,39 +14,100 @@ export class AddonDevelopServiceImplService { * list */ async list(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return []; + const list: AddonDevelopListVo[] = []; + + try { + // 获取已安装的插件 + const installAddonList: Record = coreAddonService.getInstallAddonList(); + + // 获取本地所有的插件 + const localAddons: string[] = Files.list(Paths.get(this.config.get('webRootDownAddon'))) + .map(path => path.toFile()) + .filter(file => fs.lstatSync(file).isDirectory()) + .collect(Collectors.toList()); + + for (const file of localAddons) { + if (file, "info.json".exists()) { + const info: Record = JSONUtil.parseObj(JsonLoadUtils.loadJsonString(file, "info.json")); + const addon: string = info.getStr("key"); + const addonDevelopListVo: AddonDevelopListVo = JSONUtil.toBean(info, AddonDevelopListVo.class); + if (installAddonList.get(addon) != null) addonDevelopListVo.setInstallInfo(installAddonList.get(addon)); + addonDevelopListVo.setIcon(ImageUtils.imageToBase64(file + "/resource/icon.png")); + addonDevelopListVo.setCover(ImageUtils.imageToBase64(file + "/resource/cover.png")); + list.add(addonDevelopListVo); + } + } + + if (ObjectUtil.isNotEmpty(searchParam.getSearch()) && list.size() > 0) { + list = list.stream().filter(addonDevelopListVo => addonDevelopListVo.getTitle().includes(searchParam.getSearch())).toList(); + } + } catch (IOException e) { + e.printStackTrace(); + } + + return list; } /** * info */ async info(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const infoFile: string = this.config.get('webRootDownAddon' + key + "/info.json"); + if (!fs.existsSync(infoFile)) return null; + + const info: Record = JSONUtil.parseObj(JsonLoadUtils.loadJsonString(infoFile)); + const addonDevelopInfoVo: AddonDevelopInfoVo = JSONUtil.toBean(info, AddonDevelopInfoVo.class); + + return addonDevelopInfoVo; } /** * add */ async add(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const infoFile: string = this.config.get('webRootDownAddon' + param.getKey() + "/info.json"); + if (fs.existsSync(infoFile)) throw new BadRequestException("已存在相同插件标识的应用"); + + this.generateFile(param); } /** * edit */ async edit(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const infoFile: string = this.config.get('webRootDownAddon' + param.getKey() + "/info.json"); + if (!fs.existsSync(infoFile)) throw new BadRequestException("插件不存在"); + + this.generateFile(param); + + const addon: Addon = coreAddonService.getInfoByKey(param.getKey()); + if (addon != null) { + const model: Addon = new Addon(); + model.setTitle(param.getTitle()); + model.setVersion(param.getVersion()); + model.setDesc(param.getDesc()); + model.setIcon(param.getIcon()); + model.setKey(param.getKey()); + model.setType(param.getType()); + model.setSupportApp(param.getSupportApp()); + coreAddonService.set(model); + } } /** * del */ async del(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const infoFile: string = this.config.get('webRootDownAddon' + key + "/info.json"); + if (!fs.existsSync(infoFile)) throw new BadRequestException("插件不存在"); + + const addon: Addon = coreAddonService.getInfoByKey(key); + if (addon != null) throw new BadRequestException("已安装的插件不允许删除"); + + try { + FileUtils.deleteDirectory(this.config.get('webRootDownAddon' + key)); + } catch (Exception e) { + e.printStackTrace(); + } } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/addon/impl/addon-log-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/addon/impl/addon-log-service-impl.service.ts index 46a55f1b..58cd4320 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/addon/impl/addon-log-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/addon/impl/addon-log-service-impl.service.ts @@ -14,31 +14,63 @@ export class AddonLogServiceImplService { * list */ async list(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return []; + const page: number = pageParam.getPage(); + const limit: number = pageParam.getLimit(); + + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + queryWrapper.orderByDesc("id"); + + const iPage: IPage = addonLogMapper.selectPage(new Page(page, limit), queryWrapper); + + const list: AddonLogListVo[] = []; + for (const item of iPage.getRecords()) { + const vo: AddonLogListVo = new AddonLogListVo(); + BeanUtils.copyProperties(item, vo); + list.add(vo); + } + return PageResult.build(page,limit, iPage.getTotal()).setData(list); } /** * detail */ async detail(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: AddonLog = addonLogMapper.selectOne( + new QueryWrapper() + .eq("id", id) + .last("limit 1")); + + Assert.notNull(model, "数据不存在"); + + const vo: AddonLogInfoVo = new AddonLogInfoVo(); + BeanUtils.copyProperties(model, vo); + return vo; } /** * add */ async add(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: AddonLog = new AddonLog(); + model.setAction(AddonLogParam.getAction()); + model.setKey(AddonLogParam.getKey()); + model.setFromVersion(AddonLogParam.getFromVersion()); + model.setToVersion(AddonLogParam.getToVersion()); + model.setCreateTime(System.currentTimeMillis() / 1000); + addonLogMapper.insert(model); } /** * del */ async del(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: AddonLog = addonLogMapper.selectOne( + new QueryWrapper() + .eq("id", id) + .last("limit 1")); + + Assert.notNull(model, "数据不存在!"); + + addonLogMapper.delete(new QueryWrapper().eq("id", id)); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/addon/impl/addon-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/addon/impl/addon-service-impl.service.ts index 8db495b7..4c25d7c5 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/addon/impl/addon-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/addon/impl/addon-service-impl.service.ts @@ -14,127 +14,266 @@ export class AddonServiceImplService { * getLocalAddonList */ async getLocalAddonList(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const vo: LocalAddonListVo = new LocalAddonListVo(); + + const list: Record = {}; + + // 获取已安装的插件 + const installAddonList: Record = iCoreAddonService.getInstallAddonList(); + + try { + const moduleList: ModuleListVo[] = niucloudService.getModuleList(); + + for (const item of moduleList) { + ModuleListVo.const app: App = item.getApp(); + const addonInfoVo: LocalAddonInfoVo = new LocalAddonInfoVo(); + addonInfoVo.setTitle(app.getAppName()); + addonInfoVo.setDesc(app.getAppDesc()); + addonInfoVo.setKey(app.getAppKey()); + addonInfoVo.setAuthor(item.getSiteName()); + addonInfoVo.setVersion(item.getVersion()); + addonInfoVo.setIsLocal(false); + addonInfoVo.setIsDownload(false); + addonInfoVo.setType(app.getAppType()); + addonInfoVo.setIcon(app.getAppLogo()); + addonInfoVo.setCover(app.getWindowLogo()[0]); + list.put(app.getAppKey(), addonInfoVo); + } + + // 获取本地所有的插件 + const localAddons: string[] = Files.list(Paths.get(this.config.get('webRootDownAddon'))) + .map(path => path.toFile()) + .filter(file => fs.lstatSync(file).isDirectory()) + .collect(Collectors.toList()); + + for (const file of localAddons) { + if (file, "info.json".exists()) { + const info: Record = JSONUtil.parseObj(JsonLoadUtils.loadJsonString(file, "info.json")); + const addon: string = info.getStr("key"); + if (list.get(addon) != null) { + const addonInfoVo: LocalAddonInfoVo = list.get(addon); + addonInfoVo.setIsDownload(true); + addonInfoVo.setIsLocal(false); + if (installAddonList.get(addon) != null) { + addonInfoVo.setInstallInfo(installAddonList.get(addon)); + } + list.put(addon, addonInfoVo); + } else { + const localAddonInfoVo: LocalAddonInfoVo = JSONUtil.toBean(info, LocalAddonInfoVo.class); + localAddonInfoVo.setIsLocal(true); + localAddonInfoVo.setIsDownload(true); + if (installAddonList.get(addon) != null) + localAddonInfoVo.setInstallInfo(installAddonList.get(addon)); + localAddonInfoVo.setIcon(ImageUtils.imageToBase64(file + "/resource/icon.png")); + localAddonInfoVo.setCover(ImageUtils.imageToBase64(file + "/resource/cover.png")); + list.put(addon, localAddonInfoVo); + } + } + } + } catch (IOException e) { + e.printStackTrace(); + vo.setError(e.getMessage()); + } + + vo.setList(list); + return vo; } /** * list */ async list(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return []; + const page: number = pageParam.getPage(); + const limit: number = pageParam.getLimit(); + + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + queryWrapper.orderByDesc("id"); + const iPage: IPage = addonMapper.selectPage(new Page(page, limit), queryWrapper); + const list: AddonListVo[] = []; + for (const item of iPage.getRecords()) { + const vo: AddonListVo = new AddonListVo(); + BeanUtils.copyProperties(item, vo); + list.add(vo); + } + return PageResult.build(page, limit, iPage.getTotal()).setData(list); } /** * info */ async info(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: Addon = addonMapper.selectOne( + new QueryWrapper() + .eq("id", id) + .last("limit 1")); + + Assert.notNull(model, "数据不存在"); + + const vo: AddonInfoVo = new AddonInfoVo(); + BeanUtils.copyProperties(model, vo); + return vo; } /** * add */ async add(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: Addon = new Addon(); + + model.setCreateTime(System.currentTimeMillis() / 1000); + model.setInstallTime(addonParam.getInstallTime()); + model.setUpdateTime(System.currentTimeMillis() / 1000); + model.setCover(addonParam.getCover()); + model.setType(addonParam.getType()); + model.setSupportApp(addonParam.getSupportApp()); + model.setIsStar(addonParam.getIsStar()); + model.setCompile(String.join(",", addonParam.getCompile())); + // BeanUtil.copyProperties(sysPositionEditParam, sysPosition); + addonMapper.insert(model); } /** * del */ async del(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + addonMapper.delete(new QueryWrapper().eq("id", id)); } /** * install */ async install(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return iCoreAddonInstallService.install(addon, mode); } /** * getInstallTask */ async getInstallTask(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return iCoreAddonInstallService.getInstallTask(); } /** * cancleInstall */ async cancleInstall(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + iCoreAddonInstallService.cancleInstall(); } /** * installCheck */ async installCheck(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return iCoreAddonInstallService.installCheck(addon); } /** * uninstall */ async uninstall(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return iCoreAddonInstallService.uninstall(addon); } /** * uninstallCheck */ async uninstallCheck(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return iCoreAddonInstallService.uninstallCheck(addon); } /** * getTitleListByKey */ async getTitleListByKey(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const jsonKey: JSONArray = JSONUtil.parseArray(keys); + const jsonArray: JSONArray = new JSONArray(); + if(jsonKey.size()>0){ + const keyList: string[] = jsonKey.toList(String.class); + const addonList: Addon[] = addonMapper.selectList(new QueryWrapper().in("`key`", keyList)); + for (const addon of addonList) { + jsonArray.put(addon.getTitle()); + } + } + return jsonArray.toString(); } /** * getAddonListByKeys */ async getAddonListByKeys(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return cached.rememberObject(useCache, cacheTagName, Arrays.asList("getAddonListByKeys", addonKeys, type), uniqueKey => { + + const query: QueryWrapper = new QueryWrapper<>(); + if(type === "") + { + query.in("`key`", addonKeys); + }else{ + query.in("`key`", addonKeys).eq("type", type); + } + return addonMapper.selectList(query); + }); } /** * download */ async download(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const instance: NiucloudUtils = NiucloudUtils.getInstance(); + + const actionQuery: Record = {}; + actionQuery.put("data[app_key]", addon); + actionQuery.put("data[version]", version); + actionQuery.put("data[product_key]", instance.getProductKey()); + const actionToken: Record = niucloudService.getActionToken("download", actionQuery); + + const query: Record = {}; + query.put("authorize_code", instance.getCode()); + query.put("addon_name", addon); + query.put("version", version); + query.put("token", actionToken == null ? "" : actionToken.getStr("token")); + + const headResponse: HttpResponse = new NiucloudUtils.Cloud().build("cloud/download").header("Range", "bytes=0-").query(query).method(Method.HEAD).execute(); + const totalLength: string = headResponse.header("Content-range"); + const length: string = totalLength.split("/")[1]; + + const downloadDir: string = this.config.get('webRootDownResource') + "download/"; + FileTools.createDirs(downloadDir); + + const file: string = downloadDir + addon + ".zip"; + if (fs.existsSync(file)) file.delete(); + + const response: HttpResponse = new NiucloudUtils.Cloud().build("cloud/download").header("Range", "bytes=0-" + length).query(query).method(Method.GET).execute(); + + try (const fos: FileOutputStream = new FileOutputStream(file)) { + fos.write(response.bodyBytes()); + ZipUtil.unzip(file.getPath(), this.config.get('webRootDownAddon'), Charset.forName(System.getProperty("sun.jnu.encoding"))); + } catch (Exception e) { + e.printStackTrace(); + throw new BadRequestException(e.getMessage()); + } } /** * getIndexAddonList */ async getIndexAddonList(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const params: Record = {}; + const config: NiucloudConfigVo = coreNiucloudConfigService.getNiucloudConfig(); + params.put("code", config.getAuthCode()); + params.put("secret", config.getAuthSecret()); + params.put("labels", param.getLabelId()); + params.put("product_key", "sass"); + params.put("is_recommend", 1); + params.put("order_field", "sale_num desc, visit_num desc"); + const jsonObject: Record = NiucloudUtils.Niucloud.get("store/app", params); + const data: Record = jsonObject.getJSONObject("data"); + return data.getJSONArray("data"); } /** * cloudInstallLog */ async cloudInstallLog(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return iCoreAddonInstallService.cloudInstallLog(addon); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/aliapp/impl/aliapp-config-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/aliapp/impl/aliapp-config-service-impl.service.ts index e3b2fa46..c37e60f8 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/aliapp/impl/aliapp-config-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/aliapp/impl/aliapp-config-service-impl.service.ts @@ -14,15 +14,13 @@ export class AliappConfigServiceImplService { * getAliappConfig */ async getAliappConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return coreAliappConfigService.getAliappConfig(RequestUtils.siteId()); } /** * setAliappConfig */ async setAliappConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + coreAliappConfigService.setAliappConfig(RequestUtils.siteId(), aliappConfigParam); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/auth/impl/auth-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/auth/impl/auth-service-impl.service.ts index 1a5298df..33bc63c8 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/auth/impl/auth-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/auth/impl/auth-service-impl.service.ts @@ -14,71 +14,194 @@ export class AuthServiceImplService { * checkSiteAuth */ async checkSiteAuth(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const uid: number = RequestUtils.uid(); + + //设置当前操作站点const siteId: id + number = RequestUtils.adminSiteId(); + RequestUtils.setSiteId(siteId); + + //缓存站点信息数据 + const siteinfo: SiteInfoVo = siteService.info(siteId); + //站点不存在 抛出异常 + if (siteinfo == null) { + throw new UnauthorizedException("SITE_NOT_EXIST", 400); + } + //没有当前站点的信息 + if (!isSuperAdmin() && ObjectUtil.isNotNull(uid) && uid > 0) { + const sysUserRoleInfoVo: SysUserRoleInfoVo = sysUserRoleService.getUserRole(siteId, uid); + if (sysUserRoleInfoVo == null) { + throw new UnauthorizedException("NO_SITE_PERMISSION", 400); + } + } + RequestUtils.setAppType(siteinfo.getAppType()); } /** * isSuperAdmin */ async isSuperAdmin(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const siteId: number = RequestUtils.defaultSiteId(); + const uid: number = RequestUtils.uid(); + const superAdminUid: number = cached.tag("adminAuth").get("superAdminUid"); + if (ObjectUtil.isNotNull(superAdminUid) && ObjectUtil.isNotEmpty(superAdminUid) && superAdminUid > 0) { + return superAdminUid === uid; + } else { + const sysUserRole: SysUserRole = sysUserRoleMapper.selectOne(new QueryWrapper().eq("site_id", siteId).eq("is_admin", 1).last(" limit 1")); + cached.tag("adminAuth").put("superAdminUid", sysUserRole.getUid()); + return sysUserRole.getUid() === uid; + } } /** * checkRole */ async checkRole(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + //当前访问的路由地址 + const rule: string = RequestUtils.getReqeustURI(); + const method: string = RequestUtils.getRequestMethod(); + + //缓存站点信息数据 + const siteinfo: SiteInfoVo = siteService.info(RequestUtils.siteId()); + if (!method === "get") { + if (siteinfo.getStatus() === SiteStatusEnum.EXPIRE.getCode()) { + throw new UnauthorizedException("站点已打烊,续费后可继续使用此项功能", 400); + } + if (siteinfo.getStatus() === SiteStatusEnum.CLOSE.getCode()) { + throw new UnauthorizedException("站点已停止", 400); + } + } + + const allMenuList: Record = sysMenuService.getAllApiList(RequestUtils.appType(), 100); + const menulist: string[] = allMenuList.get(method); + const is_exists: number = menulist.indexOf(rule); + + //判断当前访问的接口是否收到权限的限制 + if (is_exists < 0) { + const otherMenuList: Record = sysMenuService.getAllApiList(RequestUtils.appType() === AppTypeEnum.path.basename(ADMIN) ? AppTypeEnum.path.basename(SITE) : AppTypeEnum.path.basename(ADMIN), 100); + const methodMenuList: string[] = otherMenuList.get(method); + const is_method_exists: number = methodMenuList.indexOf(rule); + if (is_method_exists > 0) { + throw new UnauthorizedException("NO_PERMISSION", 400); + } + } + const roleMenuList: Record = this.getAuthApiList(); + /*if(roleMenuList.get(method).size()<=0 || roleMenuList.get(method).indexOf(rule)<=0){ + throw new UnauthorizedException("NO_PERMISSION"); + }*/ } /** * checkIsDemo */ async checkIsDemo(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const method: string = RequestUtils.getRequestMethod(); + + if (!method === "get" && this.config.get('isDemo')) { + throw new BadRequestException("演示环境不允许操作"); + } } /** * getAuthMenuTreeList */ async getAuthMenuTreeList(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const isAdmin: number = 0; + const siteId: number = RequestUtils.siteId(); + const uid: number = RequestUtils.uid(); + const appType: string = RequestUtils.appType(); + const authApi: Record = {}; + const sysUserRoleInfoVo: SysUserRoleInfoVo = new SysUserRoleInfoVo(); + const menuList: SysMenu[] = []; + if (isSuperAdmin()) { + isAdmin = 1; + } else { + sysUserRoleInfoVo = sysUserRoleService.getUserRole(siteId, uid); + if (ObjectUtil.isNull(sysUserRoleInfoVo)) { + return new JSONArray(); + } + isAdmin = sysUserRoleInfoVo.getIsAdmin();//是否是超级管理员 + } + if (isAdmin > 0) { + menuList = sysMenuService.getMenuListByCondition(appType, siteId, 1, 0, [], addon); + } else { + const roleIdList: string[] = JSONUtil.toList(JSONUtil.parseArray(sysUserRoleInfoVo.getRoleIds()), String.class); + const menuKeyList: string[] = sysRoleService.getMenuIdsByRoleIds(siteId, roleIdList); + menuList = sysMenuService.getMenuListByCondition(appType, siteId, 100, 0, menuKeyList, addon); + } + + const jsonArray: JSONArray = JSONUtil.parseArray(JacksonUtils.toSnakeCaseJSONString(menuList)); + return TreeUtils.listToTree(jsonArray, "menu_key", "parent_key", "children"); } /** * getAuthUserInfo */ async getAuthUserInfo(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const uid: number = RequestUtils.uid(); + const userInfo: SysUserDetailVo = sysUserService.info(uid); + if (userInfo == null) return null; + + const vo: AuthUserInfoVo = new AuthUserInfoVo(); + BeanUtil.copyProperties(userInfo, vo); + return vo; + // const userRoleMPJQueryWrapper: MPJQueryWrapper = new MPJQueryWrapper<>(); + // userRoleMPJQueryWrapper.select("sur.id, su.username, su.head_img, su.real_name, su.last_ip, su.last_time, su.login_count, sur.uid, sur.site_id, sur.role_ids, sur.create_time, sur.is_admin, sur.status") + // .setAlias("sur") + // .leftJoin("?_sys_user su ON sur.uid = su.uid".replace("?_", this.config.get('tablePrefix'))); + // userRoleMPJQueryWrapper.eq("sur.uid", uid); + // userRoleMPJQueryWrapper.eq("sur.site_id", siteId); + // const authUserInfoVo: AuthUserInfoVo = sysUserRoleMapper.selectJoinOne(AuthUserInfoVo.class, userRoleMPJQueryWrapper); + // if(ObjectUtil.isNotNull(authUserInfoVo)) + // { + // authUserInfoVo.setStatusName(""); + // } + // + // return authUserInfoVo; } /** * editAuth */ async editAuth(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + if (ObjectUtil.isNotNull(editAuthUserParam.getPassword()) && ObjectUtil.isNotEmpty(editAuthUserParam.getPassword())) { + const sysUser: SysUser = sysUserService.find(RequestUtils.uid()); + if (!PasswordEncipher.matche(editAuthUserParam.getOriginalPassword(), sysUser.getPassword())) { + throw new UnauthorizedException("OLD_PASSWORD_ERROR"); + } + } + const sysUserParam: SysUserParam = new SysUserParam(); + sysUserParam.setHeadImg(editAuthUserParam.getHeadImg()); + sysUserParam.setRealName(editAuthUserParam.getRealName()); + sysUserParam.setPassword(editAuthUserParam.getPassword()); + sysUserService.edit(RequestUtils.uid(), sysUserParam); } /** * addUserLog */ async addUserLog(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + if (RequestUtils.getRequestMethod() === "get") return; + + try { + const model: SysUserLog = new SysUserLog(); + model.setSiteId(RequestUtils.siteId()); + model.setUid(RequestUtils.uid()); + model.setIp(RequestUtils.ip()); + model.setUsername(StpUtil.getExtra("userName").toString()); + model.setUrl(RequestUtils.getReqeustURI()); + model.setParams("{}"); + model.setType(RequestUtils.getRequestMethod()); + model.setCreateTime(System.currentTimeMillis() / 1000); + model.setOperation(getDescription(request)); + sysUserLogMapper.insert(model); + } catch (Exception e) { + } } /** * setIsAllowChangeSite */ async setIsAllowChangeSite(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + coreConfigService.setConfig(0,"IS_ALLOW_CHANGE_SITE", JSONUtil.parseObj(param)); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/auth/impl/config-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/auth/impl/config-service-impl.service.ts index f50ced66..9fc43d98 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/auth/impl/config-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/auth/impl/config-service-impl.service.ts @@ -14,15 +14,20 @@ export class ConfigServiceImplService { * getLoginConfig */ async getLoginConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const defaultSiteId: number = RequestUtils.defaultSiteId(); + const sysConfig: Record = coreConfigService.getConfigValue(defaultSiteId, ConfigKeyEnum.path.basename(ADMIN_LOGIN)); + return JSONUtil.toBean(sysConfig, LoginConfigVo.class); } /** * setLoginConfig */ async setLoginConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const jsonObject: Record = new Record(); + jsonObject.set("is_captcha", loginConfigParam.getIsCaptcha()); + jsonObject.set("is_site_captcha", loginConfigParam.getIsSiteCaptcha()); + jsonObject.set("bg", loginConfigParam.getBg()); + jsonObject.set("site_bg", loginConfigParam.getSiteBg()); + coreConfigService.setConfig(RequestUtils.siteId(), ConfigKeyEnum.path.basename(ADMIN_LOGIN), jsonObject); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/auth/impl/login-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/auth/impl/login-service-impl.service.ts index 092b29f3..03b7499b 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/auth/impl/login-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/auth/impl/login-service-impl.service.ts @@ -14,23 +14,120 @@ export class LoginServiceImplService { * login */ async login(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const appType: string = userLoginParam.getAppType(); + const userName: string = userLoginParam.getUsername(); + const passWord: string = userLoginParam.getPassword(); + + if(!EnumUtils.isInclude(appType, AppTypeEnum.class, "getName")){ + throw new UnauthorizedException("APP_TYPE_NOT_EXIST"); + } + const siteId: number = RequestUtils.siteId(); + + const loginConfigVo: LoginConfigVo = configService.getLoginConfig(); + const isCaptcha: number = 0; + if(appType === AppTypeEnum.path.basename(ADMIN)){ + isCaptcha=loginConfigVo.getIsCaptcha(); + }else if(appType === AppTypeEnum.path.basename(SITE)){ + isCaptcha=loginConfigVo.getIsSiteCaptcha(); + } + + if(isCaptcha==1){ + //验证验证码 + const captchaVO: CaptchaVO = new CaptchaVO(); + captchaVO.setCaptchaVerification(userLoginParam.getCaptchaCode()); + coreCaptchaImgService.verification(captchaVO); + } + const userInfo: SysUserInfoVo = sysUserService.getUserInfoByUserName(userName); + if(ObjectUtil.isNull(userInfo)){ + throw new UnauthorizedException("账号密码错误"); + } + + //检测密码加密是否正确 + if(!PasswordEncipher.matche(passWord, userInfo.getPassword())){ + throw new UnauthorizedException("账号密码错误"); + } + //设置当前登录用户id + RequestUtils.setUid(userInfo.getUid()); + + const defaultSiteId: number = 0; + const roleInfoVo: SysUserRoleInfoVo = new SysUserRoleInfoVo(); + const siteIds: number[] = []; + if(appType === AppTypeEnum.path.basename(ADMIN)){ + defaultSiteId=RequestUtils.defaultSiteId(); + roleInfoVo=sysUserRoleService.getUserRole(defaultSiteId, userInfo.getUid()); + if(ObjectUtil.isNotNull(roleInfoVo)){ + if(userInfo.getStatus()<=0){ + throw new UnauthorizedException("账号被锁定"); + } + }else{ + appType=AppTypeEnum.path.basename(SITE); + } + }else if(appType === AppTypeEnum.path.basename(SITE)){ + siteIds=authSiteService.getSiteIds(); + if(ObjectUtil.isNotNull(siteIds) && siteIds.size()>0){ + defaultSiteId=siteIds.indexOf(RequestUtils.siteId())>0 || authService.isSuperAdmin()?RequestUtils.siteId():siteIds.get(0); + } + }else{ + throw new UnauthorizedException("APP_TYPE_NOT_EXIST"); + } + + //修改用户登录信息 + sysUserService.editUserLoginInfo(userInfo.getUid()); + + const loginModel: SaLoginModel = SaLoginModel.create(); + loginModel.setDevice(RequestUtils.handler().getHeader("User-Agent")); + loginModel.setExtra("userName", userInfo.getUsername()); + loginModel.setExtra("headImg", userInfo.getHeadImg()); + loginModel.setExtra("realName", userInfo.getRealName()); + // 执行登录 + StpUtil.login("user-" + userInfo.getUid(), loginModel); + // 获取返回内容 + const saTokenInfo: SaTokenInfo = StpUtil.getTokenInfo(); + const resultVo: LoginResultVo = new LoginResultVo(); + + const userInfoVo: LoginUserInfoVo = new LoginUserInfoVo(); + userInfoVo.setUid(userInfo.getUid()); + userInfoVo.setUsername(userInfo.getUsername()); + userInfoVo.setHeadImg(userInfo.getHeadImg()); + userInfoVo.setIsSuperAdmin(authService.isSuperAdmin()); + + + if(appType === AppTypeEnum.path.basename(ADMIN) || (appType === AppTypeEnum.path.basename(SITE) && defaultSiteId>0)){ + RequestUtils.setSiteId(defaultSiteId); + const siteInfoVo: SiteInfoVo = siteService.info(RequestUtils.siteId()); + resultVo.setSiteInfo(siteInfoVo); + } + if(appType === AppTypeEnum.path.basename(ADMIN) && !userInfoVo.getIsSuperAdmin()){ + siteIds=authSiteService.getSiteIds(); + } + + resultVo.setToken(saTokenInfo.getTokenValue()); + resultVo.setExpiresTime(DateUtils.currTime()+saTokenInfo.getTokenTimeout()); + resultVo.setUserinfo(userInfoVo); + resultVo.setSiteId(defaultSiteId); + resultVo.setUserrole(roleInfoVo); + userInfoVo.setSiteIds(siteIds); + + return resultVo; } /** * logout */ async logout(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + StpUtil.logout(); } /** * clearToken */ async clearToken(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + if(ObjectUtil.isNotNull(token) && ObjectUtil.isNotEmpty(token)){ + StpUtil.logoutByTokenValue(token); + }else if(ObjectUtil.isNotNull(appType) && ObjectUtil.isNotEmpty(appType)){ + StpUtil.logout(uid, appType); + }else{ + StpUtil.logout(uid); + } } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/captcha/impl/captcha-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/captcha/impl/captcha-service-impl.service.ts index 42adf77d..b0576e04 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/captcha/impl/captcha-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/captcha/impl/captcha-service-impl.service.ts @@ -14,7 +14,6 @@ export class CaptchaServiceImplService { * create */ async create(...args: any[]): Promise { - // TODO: 实现业务逻辑 return null; } @@ -22,7 +21,6 @@ export class CaptchaServiceImplService { * check */ async check(...args: any[]): Promise { - // TODO: 实现业务逻辑 return null; } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/channel/impl/admin-app-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/channel/impl/admin-app-service-impl.service.ts index 6e9abadd..0f8493ee 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/channel/impl/admin-app-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/channel/impl/admin-app-service-impl.service.ts @@ -14,71 +14,186 @@ export class AdminAppServiceImplService { * getAppConfig */ async getAppConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return coreAppService.getConfig(RequestUtils.siteId()); } /** * setAppConfig */ async setAppConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + coreAppService.setConfig(RequestUtils.siteId(), param); } /** * getVersionPage */ async getVersionPage(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const page: Page = new Page<>(pageParam.getPage(), pageParam.getLimit()); + + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + queryWrapper.eq("site_id", RequestUtils.siteId()); + + if (param.getPlatform() != null) { + queryWrapper.eq("platform", param.getPlatform()); + } + queryWrapper.orderByDesc("create_time"); + + const resultPage: Page = appVersionMapper.selectPage(page, queryWrapper); + + const list: AppVersionListVo[] = new LinkedList(); + for (const item of resultPage.getRecords()) { + const vo: AppVersionListVo = new AppVersionListVo(); + BeanUtil.copyProperties(item, vo); + list.add(vo); + } + + return PageResult.build(resultPage, list); } /** * getVersionInfo */ async getVersionInfo(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const appVersion: AppVersion = appVersionMapper.selectOne( + new QueryWrapper() + .eq("id", id) + .eq("site_id", RequestUtils.siteId()) + ); + if (appVersion == null) { + return null; + } + + const vo: AppVersionInfoVo = new AppVersionInfoVo(); + BeanUtil.copyProperties(appVersion, vo); + + return vo; } /** * addVersion */ async addVersion(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const notRelease: AppVersion = appVersionMapper.selectOne( + new QueryWrapper() + .eq("site_id", RequestUtils.siteId()) + .eq("release_time", 0) + .last("limit 1") + ); + Assert.isNull(notRelease, "当前已存在未发布的版本"); + + const lastVersion: AppVersion = appVersionMapper.selectOne( + new QueryWrapper() + .eq("site_id", RequestUtils.siteId()) + .orderByDesc("id") + .last("limit 1") + ); + if (lastVersion != null && number.valueOf(param.getVersionCode()) <= number.valueOf(lastVersion.getVersionCode())) { + throw new BadRequestException("版本号必须高于上一版本设置的值"); + } + + const appVersion: AppVersion = new AppVersion(); + param.setSiteId(RequestUtils.siteId()); + BeanUtil.copyProperties(param, appVersion); + appVersion.setCreateTime(DateUtils.currTime()); + + if (param.getPackageType() === "cloud") { + appVersion.setTaskKey(coreAppCloudService.appCloudBuid(param)); + appVersion.setStatus(AppDict.StatusEnum.STATUS_CREATING.getValue()); + } else { + appVersion.setStatus(AppDict.StatusEnum.STATUS_UPLOAD_SUCCESS.getValue()); + } + + return appVersionMapper.insert(appVersion) > 0; } /** * editVersion */ async editVersion(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const appVersion: AppVersion = appVersionMapper.selectOne( + new QueryWrapper() + .eq("site_id", RequestUtils.siteId()) + .eq("id", id) + ); + Assert.notNull(appVersion, "版本不存在"); + + const lastVersion: AppVersion = appVersionMapper.selectOne( + new QueryWrapper() + .eq("site_id", RequestUtils.siteId()) + .ne("id", id) + .orderByDesc("id") + .last("limit 1") + ); + if (lastVersion != null && number.valueOf(param.getVersionCode()) <= number.valueOf(lastVersion.getVersionCode())) { + throw new BadRequestException("版本号必须高于上一版本设置的值"); + } + + BeanUtil.copyProperties(param, appVersion); + appVersion.setUpdateTime(DateUtils.currTime()); + + if (param.getPackageType() === "cloud") { + param.setSiteId(RequestUtils.siteId()); + appVersion.setTaskKey(coreAppCloudService.appCloudBuid(param)); + appVersion.setStatus(AppDict.StatusEnum.STATUS_CREATING.getValue()); + } else { + appVersion.setStatus(AppDict.StatusEnum.STATUS_UPLOAD_SUCCESS.getValue()); + } + + return appVersionMapper.updateById(appVersion) > 0; } /** * delVersion */ async delVersion(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + appVersionMapper.delete(new QueryWrapper() + .eq("id", id) + .eq("site_id", RequestUtils.siteId())); } /** * getBuildLog */ async getBuildLog(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const vo: AppCompileLogVo = coreAppCloudService.getAppCompileLog(key); + if (vo.getStatus() === "fail") { + appVersionMapper.update(null, new UpdateWrapper() + .eq("task_key", key) + .eq("site_id", RequestUtils.siteId()) + .set("status", AppDict.StatusEnum.STATUS_CREATE_FAIL.getValue()) + .set("update_time", DateUtils.currTime()) + .set("fail_reason", ObjectUtil.defaultIfNull(vo.getFailReason(), "") )); + } + if (vo.getStatus() === "success") { + appVersionMapper.update(null, new UpdateWrapper() + .eq("task_key", key) + .eq("site_id", RequestUtils.siteId()) + .set("status", AppDict.StatusEnum.STATUS_UPLOAD_SUCCESS.getValue()) + .set("update_time", DateUtils.currTime()) + .set("package_path", vo.getFilePath() )); + } + return vo; } /** * release */ async release(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const appVersion: AppVersion = appVersionMapper.selectOne( + new QueryWrapper() + .eq("site_id", RequestUtils.siteId()) + .eq("id", id) + ); + Assert.notNull(appVersion, "版本不存在"); + if (!appVersion.getStatus() === AppDict.StatusEnum.STATUS_UPLOAD_SUCCESS.getValue()) { + throw new BadRequestException("版本未上传成功"); + } + + const model: AppVersion = new AppVersion(); + model.setId(appVersion.getId()); + appVersion.setStatus(AppDict.StatusEnum.STATUS_PUBLISHED.getValue()); + appVersion.setReleaseTime(DateUtils.currTime()); + + return appVersionMapper.updateById(appVersion) > 0; } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/dict/impl/dict-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/dict/impl/dict-service-impl.service.ts index 079486ea..ad364209 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/dict/impl/dict-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/dict/impl/dict-service-impl.service.ts @@ -14,55 +14,110 @@ export class DictServiceImplService { * getPage */ async getPage(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const page: number = pageParam.getPage(); + const limit: number = pageParam.getLimit(); + + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + //查询条件判断组装 + if (ObjectUtil.isNotEmpty(path.basename(searchParam))) { + queryWrapper.like("name", path.basename(searchParam)); + } + + if (ObjectUtil.isNotEmpty(searchParam.getKey())) { + queryWrapper.eq("`key`", searchParam.getKey()); + } + + queryWrapper.orderByDesc("id"); + + const iPage: IPage = dictMapper.selectPage(new Page<>(page, limit), queryWrapper); + const list: DictListVo[] = []; + for (const item of iPage.getRecords()) { + const vo: DictListVo = new DictListVo(); + BeanUtils.copyProperties(item, vo); + list.add(vo); + } + return PageResult.build(page, limit, iPage.getTotal()).setData(list); } /** * info */ async info(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: SysDict = dictMapper.selectOne( + new QueryWrapper() + .eq("id", id) + .last("limit 1")); + + Assert.notNull(model, "数据不存在"); + + const vo: DictInfoVo = new DictInfoVo(); + BeanUtils.copyProperties(model, vo); + return vo; } /** * add */ async add(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: SysDict = new SysDict(); + model.setName(path.basename(addParam)); + model.setKey(addParam.getKey()); + model.setMemo(addParam.getMemo()); + model.setDictionary("[]"); + model.setCreateTime(System.currentTimeMillis() / 1000); + model.setUpdateTime(System.currentTimeMillis() / 1000); + dictMapper.insert(model); } /** * edit */ async edit(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; - } - - /** - * addDictData - */ - async addDictData(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: SysDict = dictMapper.selectOne( + new QueryWrapper() + .eq("id", id) + .last("limit 1")); + + Assert.notNull(model, "数据不存在!"); + + model.setId(id); + model.setName(path.basename(editParam)); + model.setKey(editParam.getKey()); + model.setMemo(editParam.getMemo()); + model.setUpdateTime(System.currentTimeMillis() / 1000); + dictMapper.updateById(model); } /** * del */ async del(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: SysDict = dictMapper.selectOne( + new QueryWrapper() + .eq("id", id) + .last("limit 1")); + + Assert.notNull(model, "数据不存在!"); + + dictMapper.deleteById(model); } /** * getAll */ async getAll(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + + + queryWrapper.orderByDesc("id"); + + const voList: SysDict[] = dictMapper.selectList(queryWrapper); + const list: DictListVo[] = []; + for (const item of voList) { + const vo: DictListVo = new DictListVo(); + BeanUtils.copyProperties(item, vo); + list.add(vo); + } + return list; } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/diy/impl/diy-config-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/diy/impl/diy-config-service-impl.service.ts index 02c1c4d0..da2df5ad 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/diy/impl/diy-config-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/diy/impl/diy-config-service-impl.service.ts @@ -14,23 +14,20 @@ export class DiyConfigServiceImplService { * getBottomList */ async getBottomList(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return coreDiyConfigService.getBottomList(); } /** * getBottomConfig */ async getBottomConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return coreDiyConfigService.getBottomConfig(RequestUtils.siteId(), key); } /** * setBottomConfig */ async setBottomConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + coreDiyConfigService.setBottomConfig(RequestUtils.siteId(), param.getValue(), param.getKey()); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/diy/impl/diy-route-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/diy/impl/diy-route-service-impl.service.ts index e4ffb62c..a489f5b5 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/diy/impl/diy-route-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/diy/impl/diy-route-service-impl.service.ts @@ -14,23 +14,56 @@ export class DiyRouteServiceImplService { * list */ async list(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return []; + const linkEnum: Record = LinkEnum.getLink(); + const routerList: DiyRouteListVo[] = []; + const sort: number = 0; + + for (const key of linkEnum.keySet()) { + const parentItem: Record = linkEnum.getJSONObject(key); + const addonInfo: Record = parentItem.getJSONObject("addon_info"); + const childArray: JSONArray = ObjectUtil.defaultIfNull(parentItem.getJSONArray("child_list"), new JSONArray()); + + sort = processChildItems(childArray, key, addonInfo, searchParam, routerList, sort); + } + + return routerList; } /** * getInfoByName */ async getInfoByName(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: DiyRoute = diyRouteMapper.selectOne( + new QueryWrapper() + .eq("name", name) + .eq("site_id", RequestUtils.siteId()) + .last("limit 1")); + if (model == null) return null; + + const vo: DiyRouteInfoVo = new DiyRouteInfoVo(); + BeanUtils.copyProperties(model, vo); + + return vo; } /** * modifyShare */ async modifyShare(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const queryWrapper: QueryWrapper = new QueryWrapper() + .eq("name", path.basename(editParam)) + .eq("site_id", RequestUtils.siteId()) + .last("limit 1"); + const model: DiyRoute = diyRouteMapper.selectOne(queryWrapper); + + if (model != null) { + BeanUtils.copyProperties(editParam, model); + diyRouteMapper.update(model, queryWrapper); + } else { + const insertModel: DiyRoute = new DiyRoute(); + BeanUtils.copyProperties(editParam, insertModel); + insertModel.setSiteId(RequestUtils.siteId()); + diyRouteMapper.insert(insertModel); + } } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/diy/impl/diy-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/diy/impl/diy-service-impl.service.ts index ce8f3669..b5979895 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/diy/impl/diy-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/diy/impl/diy-service-impl.service.ts @@ -14,159 +14,667 @@ export class DiyServiceImplService { * list */ async list(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return []; + const page: number = pageParam.getPage(); + const limit: number = pageParam.getLimit(); + + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + queryWrapper.eq("site_id", RequestUtils.siteId()); + queryWrapper.orderByDesc("id"); + + if (ObjectUtil.isNotEmpty(searchParam.getTitle())) queryWrapper.like("title", searchParam.getTitle()); + if (ObjectUtil.isNotEmpty(searchParam.getMode())) queryWrapper.eq("mode", searchParam.getMode()); + if (ObjectUtil.isNotEmpty(searchParam.getType())) queryWrapper.eq("type", searchParam.getType()); + + const template: Record = TemplateEnum.getTemplate(); + const templateAddon: Record[] = TemplateEnum.getTemplateAddons((RequestUtils.siteId())); + const iPage: IPage = diyPageMapper.selectPage(new Page(page, limit), queryWrapper); + const list: DiyPageListVo[] = []; + for (const item of iPage.getRecords()) { + const vo: DiyPageListVo = new DiyPageListVo(); + BeanUtils.copyProperties(item, vo); + vo.setTypeName(ObjectUtil.defaultIfNull(template.getByPath(vo.getType() + ".title", String.class), "")); + vo.setTypePage(ObjectUtil.defaultIfNull(template.getByPath(vo.getType() + ".page", String.class), "")); + const addonName: string = templateAddon.stream() + .filter(temp => vo.getType() != null && vo.getType() === temp.get("type")) + .findFirst() + .map(addon => ObjectUtil.defaultIfNull(addon.get("title"), "").toString()) + .orElse(""); + vo.setAddonName(addonName); + list.add(vo); + } + return PageResult.build(page, limit, iPage.getTotal()).setData(list); } /** * allList */ async allList(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + queryWrapper.eq("site_id", RequestUtils.siteId()); + queryWrapper.orderByDesc("id"); + + if (ObjectUtil.isNotEmpty(searchParam.getTitle())) queryWrapper.like("title", searchParam.getTitle()); + if (ObjectUtil.isNotEmpty(searchParam.getMode())) queryWrapper.eq("mode", searchParam.getMode()); + if (ObjectUtil.isNotEmpty(searchParam.getType())) { + const type: string[] = Arrays.stream(searchParam.getType()).collect(Collectors.toList()); + queryWrapper.in("type", type); + } + + const pages: DiyPage[] = diyPageMapper.selectList(queryWrapper); + const list: DiyPageListVo[] = []; + + for (const item of pages) { + const vo: DiyPageListVo = new DiyPageListVo(); + BeanUtils.copyProperties(item, vo); + list.add(vo); + } + return list; } /** * info */ async info(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: DiyPage = diyPageMapper.selectOne( + new QueryWrapper() + .eq("id", id) + .eq("site_id", RequestUtils.siteId())); + + if (model == null) return null; + + const vo: DiyPageInfoVo = new DiyPageInfoVo(); + BeanUtils.copyProperties(model, vo); + + return vo; } /** * infoByName */ async infoByName(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: DiyPage = diyPageMapper.selectOne( + new QueryWrapper() + .eq("name", name) + .eq("is_default", 1) + .eq("site_id", RequestUtils.siteId())); + + if (model == null) return null; + + const vo: DiyPageInfoVo = new DiyPageInfoVo(); + BeanUtils.copyProperties(model, vo); + + return vo; } /** * add */ async add(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: DiyPage = new DiyPage(); + BeanUtils.copyProperties(addParam, model); + model.setSiteId(addParam.getSiteId() == null ? RequestUtils.siteId() : addParam.getSiteId()); + model.setCreateTime(System.currentTimeMillis() / 1000); + diyPageMapper.insert(model); } /** * edit */ async edit(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: DiyPage = diyPageMapper.selectOne( + new QueryWrapper() + .eq("id", id) + .eq("site_id", RequestUtils.siteId())); + + Assert.notNull(model, "数据不存在!"); + + BeanUtils.copyProperties(editParam, model); + model.setUpdateTime(System.currentTimeMillis() / 1000); + diyPageMapper.updateById(model); } /** * del */ async del(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + diyPageMapper.delete(new QueryWrapper().eq("id", id).eq("site_id", RequestUtils.siteId())); } /** * setUse */ async setUse(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: DiyPage = diyPageMapper.selectOne(new QueryWrapper().eq("id", id).eq("site_id", RequestUtils.siteId())); + Assert.notNull(model, "页面不存在!"); + + const update: DiyPage = new DiyPage(); + update.setIsDefault(0); + diyPageMapper.update(update, new QueryWrapper().eq("name", path.basename(model)).eq("site_id", RequestUtils.siteId())); + + update.setId(id); + update.setIsDefault(1); + update.setUpdateTime(System.currentTimeMillis() / 1000); + diyPageMapper.updateById(update); } /** * getLink */ async getLink(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const linkEnum: Record = LinkEnum.getLink(); + for (const key of linkEnum.keySet()) { + const item: Record = linkEnum.getJSONObject(key); + + item.put("name", key); + + if (!"DIY_PAGE" === key && item.containsKey("child_list")) { + const childList: JSONArray = item.getJSONArray("child_list"); + for (const i of number = 0; i < childList.size(); i++) { + const child: Record = childList.getJSONObject(i); + child.put("parent", key); + } + } + + if (key === "DIY_PAGE") { + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + queryWrapper.eq("site_id", RequestUtils.siteId()) + .and(wrapper => wrapper + .eq("type", "DIY_PAGE") + .or() + .ne("type", "DIY_PAGE") + .eq("is_default", 0) + ) + .orderByDesc("update_time"); + + const pageList: DiyPage[] = diyPageMapper.selectList(queryWrapper); + const newChildList: JSONArray = new JSONArray(); + for (const diyPage of pageList) { + const child: Record = new Record(); + child.put("name", path.basename(diyPage)); + child.put("title", diyPage.getPageTitle()); + child.put("url", "/app/pages/index/diy?id=" + diyPage.getId()); + newChildList.add(child); + } + item.put("child_list", newChildList); + } + if (key === "DIY_LINK") { + item.put("parent", "DIY_LINK"); + } + } + return linkEnum; } /** * getPageInit */ async getPageInit(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const template: Record = getTemplate(new TemplateParam()); + + const info: DiyPageInfoVo = null; + if (param.getId() > 0) { + info = this.info(param.getId()); + } else if (!path.basename(param).isEmpty()) { + info = this.infoByName(path.basename(param)); + } + + if (StringUtils.isNotBlank(path.basename(param))) { + const startConfig: StartUpPageConfigVo = coreDiyConfigService.getStartUpPageConfig(RequestUtils.siteId(), path.basename(param)); + if (startConfig != null) { + if ("DIY_PAGE" === startConfig.getParent()) { + const page: string = startConfig.getPage(); + const id: number = number.parseInt(page.replace("/app/pages/index/diy?id=", "")); + info = this.info(id); + if (info != null) { + param.setType(info.getType()); + param.setName(path.basename(info)); + } + } else { + for (const key of template.keySet()) { + const templateItem: Record = template.getJSONObject(key); + const templatePage: string = templateItem != null ? templateItem.getStr("page") : ""; + if (startConfig.getPage() === templatePage) { + info = this.infoByName(key); + if (info != null) { + param.setType(key); + param.setName(key); + } + break; + } + } + } + } + } + + if (info != null) { + if (template.getJSONObject(info.getType()) != null) { + const page: Record = template.getJSONObject(info.getType()); + info.setTypeName(page.getStr("title")); + info.setPage(page.getStr("page")); + } + } else { + const time: number = System.currentTimeMillis() / 1000; + const pageTitle: string = ObjectUtil.defaultIfBlank(param.getTitle(), "页面" + time); + const type: string = ObjectUtil.defaultIfBlank(param.getType(), "DIY_PAGE"); + const name: string = type === "DIY_PAGE" ? "DIY_PAGE_RANDOM_" + time : type; + const typeName: string = ""; + const templateName: string = ""; + const pageRoute: string = ""; + const mode: string = "diy"; + const isDefault: number = 0; + const value: string = ""; + + const pageObj: Record = null; + if (StringUtils.isNotBlank(path.basename(param)) && template.getJSONObject(path.basename(param)) != null) { + pageObj = template.getJSONObject(path.basename(param)); + type = name = path.basename(param); + pageTitle = typeName = pageObj.getStr("title"); + pageRoute = pageObj.getStr("page"); + + const pageData: Record = this.getFirstPageData(type, ""); + if (pageData != null) { + const templateObj: Record = pageData.getJSONObject("template"); + if (templateObj != null) { + mode = templateObj.getStr("mode"); + value = templateObj.toString(); + isDefault = 1; + } + } + } else if (template.getJSONObject(param.getType()) != null) { + pageObj = template.getJSONObject(param.getType()); + typeName = pageObj.getStr("title"); + pageRoute = pageObj.getStr("page"); + + const count: number = diyPageMapper.selectCount(new LambdaQueryWrapper() + .eq(DiyPage::getSiteId, RequestUtils.siteId()) + .eq(DiyPage::getType, param.getType())); + if (count == 0) { + isDefault = 1; + } + } + + // 页面标题(用于前台展示) + const title: string = pageTitle; + if (!"DIY_PAGE" === type) { + title = typeName; + } + + info = new DiyPageInfoVo(); + info.setName(name); + info.setPageTitle(pageTitle); // 页面名称(用于后台展示) + info.setTitle(title); // 页面标题(用于前台展示) + info.setType(type); + info.setTypeName(typeName); + info.setTemplate(templateName); + info.setPage(pageRoute); + info.setMode(mode); + info.setValue(value); + info.setIsDefault(isDefault); + } + + info.setComponent(getComponentList(info.getType())); + info.setDomainUrl(coreSysConfigService.getSceneDomain(RequestUtils.siteId())); + + // 处理全局模板数据 + const diyTemplate: Record = new Record(); + if (StringUtils.isNotBlank(path.basename(info))) { + const templateParam: TemplateParam = new TemplateParam(); + String[] key = {path.basename(info)}; + templateParam.setKey(key); + diyTemplate = getTemplate(templateParam); + if (diyTemplate != null && diyTemplate.containsKey(path.basename(info))) { + const templateInfo: Record = diyTemplate.getJSONObject(path.basename(info)); + info.setGlobal(templateInfo.getJSONObject("global")); + } + } + + return info; } /** * getComponentList */ async getComponentList(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const data: Record = ComponentEnum.getComponent(); + + // 安全遍历顶层数据 + const categoryIterator: Iterator = data.keySet().iterator(); + const categoryToRemove: string[] = []; + + while (categoryIterator.hasNext()) { + const categoryKey: string = categoryIterator.next(); + const category: Record = data.getJSONObject(categoryKey); + const componentList: Record = category.getJSONObject("list"); + + // 用于存储排序值的映射 + const sortMap: Record = new Record(); + + // 安全遍历组件列表 + const keysToRemove: string[] = []; + for (const componentKey of new ArrayList<>(componentList.keySet())) { + const component: Record = componentList.getJSONObject(componentKey); + const supportPage: JSONArray = component.getJSONArray("support_page"); + + if (supportPage == null) supportPage = new JSONArray(); + + if (supportPage.length === 0 || supportPage.includes(name)) { + sortMap.put(componentKey, component.getInt("sort", 0)); + component.remove("sort"); + component.remove("support_page"); + } else { + keysToRemove.add(componentKey); + } + } + + // 批量移除组件 + for (const key of keysToRemove) { + componentList.remove(key); + } + if (componentList.length === 0) { + categoryToRemove.add(categoryKey); + } else { + sortComponentsBySortValues(componentList, sortMap); + } + } + for (const key of categoryToRemove) { + data.remove(key); + } + + return data; } /** * getFirstPageData */ async getFirstPageData(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const pages: Record = PagesEnum.getPagesByAddon(type, addon); + if (pages == null || pages.keySet().size() == 0) return null; + + const template: string = pages.keySet().iterator().next(); + const data: Record = pages.getJSONObject(template); + data.set("type", type); + data.set("template", template); + + return data; } /** * getTemplate */ async getTemplate(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const template: Record = TemplateEnum.getTemplate(param); + + for (const key of template.keySet()) { + const pages: Record = ObjectUtil.defaultIfNull(PagesEnum.getPages(key, param.getMode()), new Record()); + template.putByPath(key + ".template", pages); + } + //删除null值 防止序列化报错 + JacksonUtils.removeNull(template); + return template; } /** * changeTemplate */ async changeTemplate(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + this.coreDiyConfigService.setStartUpPageConfig(RequestUtils.siteId(), value, value.getType()); } /** * getDecoratePage */ async getDecoratePage(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const templateParam: TemplateParam = new TemplateParam(); + const oneType: string = searchParam.getType()[0]; + String[] key = searchParam.getType(); + templateParam.setKey(key); + const template: Record = this.getTemplate(templateParam).getJSONObject(oneType); + if (template == null) throw new BadRequestException("模板不存在"); + + const defaultPage: Record = getFirstPageData(oneType, ""); + + const useTemplate: Record = new Record(); + useTemplate.put("type", searchParam.getType()); + useTemplate.put("title", defaultPage == null ? "" : defaultPage.getStr("title", "")); + useTemplate.put("name", ""); + useTemplate.put("cover", defaultPage == null ? "" : defaultPage.getStr("cover", "")); + useTemplate.put("page", template.getStr("page")); + useTemplate.put("action", template.getStr("action")); + useTemplate.put("url", ""); + useTemplate.put("parent", ""); + + const info: DiyPageInfoVo = infoByName(oneType); + + const startConfig: StartUpPageConfigVo = coreDiyConfigService.getStartUpPageConfig(RequestUtils.siteId(), oneType); + if (startConfig != null) { + useTemplate.set("title", startConfig.getTitle()); + useTemplate.set("name", path.basename(startConfig)); + useTemplate.set("page", startConfig.getPage()); + useTemplate.set("action", startConfig.getAction()); + useTemplate.set("url", startConfig.getPage()); + useTemplate.set("parent", startConfig.getParent()); + } else if (info != null) { + useTemplate.set("id", info.getId()); + useTemplate.set("title", info.getTitle()); + } + + if (useTemplate.getStr("cover").isEmpty() && useTemplate.getStr("url").isEmpty()) { + useTemplate.set("url", template.getStr("page")); + } else if (useTemplate.getStr("url").isEmpty()) { + useTemplate.set("url", template.getStr("page")); + } + + const diyRouteSearchParam: DiyRouteSearchParam = new DiyRouteSearchParam(); + diyRouteSearchParam.setUrl(useTemplate.getStr("page")); + const otherPage: DiyRouteListVo[] = diyRouteService.list(diyRouteSearchParam); + if (otherPage.size() > 0) { + const route: DiyRouteListVo = otherPage.get(0); + useTemplate.set("title", route.getTitle()); + useTemplate.set("name", path.basename(route)); + useTemplate.set("parent", route.getParent()); + useTemplate.set("action", route.getAction()); + } + + template.put("use_template", useTemplate); + + const sceneDomain: SceneDomainVo = coreSysConfigService.getSceneDomain(RequestUtils.siteId()); + const domainUrl: Record = new Record(); + domainUrl.put("wap_domain", sceneDomain.getWapDomain()); + domainUrl.put("wap_url", sceneDomain.getWapUrl()); + domainUrl.put("web_url", sceneDomain.getWebUrl()); + template.put("domain_url", domainUrl); + + return template; } /** * getPageByCarouselSearch */ async getPageByCarouselSearch(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const page: number = pageParam.getPage(); + const limit: number = pageParam.getLimit(); + + const queryWrapper: QueryWrapper = new QueryWrapper() + .eq("site_id", RequestUtils.siteId()) + .eq("type", "DIY_PAGE") + .notIn("value", Arrays.asList("top_fixed", "right_fixed", "bottom_fixed", "left_fixed", "fixed")) + .or() + .eq("site_id", RequestUtils.siteId()) + .ne("type", "DIY_PAGE") + .eq("is_default", 0) + .notIn("value", Arrays.asList("top_fixed", "right_fixed", "bottom_fixed", "left_fixed", "fixed")) + .orderByDesc("id"); + + const iPage: IPage = diyPageMapper.selectPage(new Page(page, limit), queryWrapper); + const list: DiyPageListVo[] = []; + for (const item of iPage.getRecords()) { + const vo: DiyPageListVo = new DiyPageListVo(); + BeanUtils.copyProperties(item, vo); + list.add(vo); + } + return PageResult.build(page, limit, iPage.getTotal()).setData(list); } /** * setDiyData */ async setDiyData(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const addonFlag: string = param.getKey(); + + const templateParam: TemplateParam = new TemplateParam(); + String[] key = {param.getKey()}; + templateParam.setKey(key); + const template: Record = getTemplate(templateParam).getJSONObject(param.getKey()); + if (template == null) return; + + if (!param.getAddon().isEmpty()) { + const addonTemplateParam: TemplateParam = new TemplateParam(); + addonTemplateParam.setAddon(param.getAddon()); + addonTemplateParam.setType(param.getType()); + const addonTemplate: Record = getTemplate(addonTemplateParam); + if (addonTemplate != null && !addonTemplate.length === 0) { + addonFlag = addonTemplate.keySet().iterator().next(); + template = addonTemplate.getJSONObject(addonFlag); + } + } + + const pages: Record = template.getJSONObject("template"); + if (pages.length === 0) return; + + const pageKey: string = pages.keySet().iterator().next(); + const page: Record = pages.getJSONObject(pageKey); + + const info: DiyPage = diyPageMapper.selectOne(new QueryWrapper() + .eq("name", addonFlag) + .eq("site_id", param.getSiteId()) + .eq("is_default", 1) + ); + + if (info == null) { + RequestUtils.setSiteId(param.getSiteId()); + const addParam: DiyPageParam = new DiyPageParam(); + addParam.setTitle(page.getStr("title", "")); + addParam.setPageTitle(page.getStr("title", "")); + addParam.setName(addonFlag); + addParam.setType(addonFlag); + addParam.setTemplate(pageKey); + addParam.setValue(page.getJSONObject("data").toString()); + addParam.setMode(page.getStr("mode", "")); + addParam.setIsDefault(1); + addParam.setIsChange(0); + this.add(addParam); + } else { + if (path.basename(info) === "DIY_INDEX" && info.getType() === "DIY_INDEX") { + const update: DiyPage = new DiyPage(); + update.setId(info.getId()); + update.setValue(page.getJSONObject("data").toString()); + diyPageMapper.updateById(update); + } + } + + if (param.getIsStart() === 1) { + const startPage: StartUpPageConfigParam = new StartUpPageConfigParam(); + startPage.setType(param.getKey()); + startPage.setMode(page.getStr("mode", "")); + startPage.setTitle(page.getStr("title", "")); + startPage.setAction(template.getStr("action", "")); + startPage.setPage(template.getStr("page")); + this.changeTemplate(startPage); + } } /** * copy */ async copy(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const page: DiyPage = diyPageMapper.selectOne(new QueryWrapper().eq("id", id).eq("site_id", RequestUtils.siteId())); + if (page == null) throw new BadRequestException("页面不存在"); + + page.setId(null); + page.setPageTitle(page.getPageTitle() + "_副本"); + page.setIsChange(0); + page.setIsDefault(0); + page.setShare(""); + page.setCreateTime(System.currentTimeMillis() / 1000); + diyPageMapper.insert(page); } /** * loadDiyData */ async loadDiyData(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + // 获取参数 + const mainAppStr: string = params.get("main_app").toString(); + const mainApp: JSONArray = JSONUtil.parseArray(mainAppStr); + const count: number = mainApp.size(); + const tag: string = params.getOrDefault("tag", "add"); + const siteId: number = params.get("site_id"); + + // 创建addon数组,在开头添加空字符串 + const addon: JSONArray = new JSONArray(); + addon.add(""); + addon.addAll(mainApp); + + // 遍历处理 + for (const k of number = 0; k < addon.size(); k++) { + const v: string = addon.get(k).toString(); + int isStart; + + if ("add" === tag) { + if (count > 1) { + // 站点多应用,使用系统的页面 + isStart = (k == 0) ? 1 : 0; + } else { + // 站点单应用,将应用的设为使用中 + isStart = (k == 0) ? 0 : 1; + } + } else { + // 编辑站点套餐的情况 + if (count > 1) { + // 站点多应用,将不更新启动页 + isStart = 0; + } else { + // 站点单应用,将应用的设为使用中 + isStart = (k == 0) ? 0 : 1; + } + } + + const setParam: SetDiyDataParam = new SetDiyDataParam(); + setParam.setSiteId(siteId); + setParam.setType("index"); + setParam.setKey("DIY_INDEX"); + setParam.setIsStart(isStart); + setParam.setMainApp(addon); + setParam.setAddon(v); + setDiyData(setParam); + + setParam.setType("member_index"); + setParam.setKey("DIY_MEMBER_INDEX"); + setDiyData(setParam); + } } /** * getPageLink */ async getPageLink(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const page: number = pageParam.getPage(); + const limit: number = pageParam.getLimit(); + + const queryWrapper: QueryWrapper = new QueryWrapper() + .eq("site_id", RequestUtils.siteId()) + .and(i => i.eq("type", "DIY_PAGE").or().ne("type", "DIY_PAGE").eq("is_default", 0)) + .orderByDesc("update_time"); + + const templates: Record = TemplateEnum.getTemplate(new TemplateParam()); + + const iPage: IPage = diyPageMapper.selectPage(new Page(page, limit), queryWrapper); + const list: DiyPageListVo[] = []; + for (const item of iPage.getRecords()) { + const vo: DiyPageListVo = new DiyPageListVo(); + BeanUtils.copyProperties(item, vo); + vo.setTypeName(templates.getByPath(item.getType() + ".title", String.class)); + list.add(vo); + } + return PageResult.build(page, limit, iPage.getTotal()).setData(list); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/diy/impl/diy-theme-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/diy/impl/diy-theme-service-impl.service.ts index 4b70a50b..a27e73d6 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/diy/impl/diy-theme-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/diy/impl/diy-theme-service-impl.service.ts @@ -14,55 +14,236 @@ export class DiyThemeServiceImplService { * getDiyTheme */ async getDiyTheme(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const siteId: number = RequestUtils.siteId(); + const siteCache: SiteInfoVo = coreSiteService.getSiteCache(siteId); + const themeDataList: DiyTheme[] = diyThemeMapper.selectList(new QueryWrapper().eq("site_id", siteId).eq("type", "app").eq("is_selected", 1)); + const themeData: Record = {}; + if (!themeDataList.length === 0){ + themeData = themeDataList.stream().collect(Collectors.toMap(theme => theme.getAddon(), theme => theme)); + } + + const systemTheme: Record = coreDiyService.getDefaultThemeColor("app"); + const appTheme: Record = new Record(); + const appThemeObj: Record = new Record(); + appThemeObj.set("id", ObjectUtil.isNotEmpty(themeData.get("app")) ? themeData.get("app").getId() : ""); + appThemeObj.set("icon", ""); + appThemeObj.set("addon_title", "系统"); + appThemeObj.set("title", ObjectUtil.isNotEmpty(themeData.get("app")) ? themeData.get("app").getTitle() : (!systemTheme.length === 0 ? systemTheme.getJSONArray("theme_color").getJSONObject(0).get("title") : "")); + + const themeValue: any = ObjectUtil.isNotEmpty(themeData.get("app")) ? + themeData.get("app").getTheme() : + (!systemTheme.length === 0 ? systemTheme.getJSONArray("theme_color").getJSONObject(0).get("theme") : ""); + if (themeValue instanceof String) { + appThemeObj.set("theme", JSONUtil.parseObj(themeValue)); + } else { + appThemeObj.set("theme", themeValue); + } + + appTheme.putOpt("app", appThemeObj); + + const data: Record = new Record(); + const appsAndAddons: Addon[] = siteCache.getApps(); + appsAndAddons.addAll(siteCache.getSiteAddons()); + for (const value of appsAndAddons) { + const addonTheme: Record = coreDiyService.getDefaultThemeColor(value.getKey()); + if (!addonTheme.length === 0 && addonTheme.containsKey("theme_color")) { + const addonData: Record = new Record(); + addonData.set("id", ObjectUtil.isNotEmpty(themeData.get(value.getKey())) ? themeData.get(value.getKey()).getId() : ""); + addonData.set("icon", value.getIcon() != null ? value.getIcon() : ""); + addonData.set("addon_title", value.getTitle() != null ? value.getTitle() : ""); + addonData.set("title", ObjectUtil.isNotEmpty(themeData.get(value.getKey())) ? themeData.get(value.getKey()).getTitle() : addonTheme.getJSONArray("theme_color").getJSONObject(0).get("title")); + + const addonThemeValue: any = ObjectUtil.isNotEmpty(themeData.get(value.getKey())) ? + themeData.get(value.getKey()).getTheme() : + addonTheme.getJSONArray("theme_color").getJSONObject(0).get("theme"); + if (addonThemeValue instanceof String) { + addonData.set("theme", JSONUtil.parseObj(addonThemeValue)); + } else { + addonData.set("theme", addonThemeValue); + } + + data.putOpt(value.getKey(), addonData); + } + } + + if (data.length === 0 || siteCache.getApps().size() > 1) { + const mergedData: Record = new Record(); + for (const key of appTheme.keySet()) { + mergedData.putOpt(key, appTheme.get(key)); + } + + for (const key of data.keySet()) { + if (!mergedData.containsKey(key)) { + mergedData.putOpt(key, data.get(key)); + } + } + + data = mergedData; + } + + return data; } /** * setDiyTheme */ async setDiyTheme(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const siteId: number = RequestUtils.siteId(); + const diyTheme: DiyTheme = diyThemeMapper.selectById(data.getId()); + if (ObjectUtil.isEmpty(diyTheme)) { + throw new BadRequestException("主题色不存在"); + } + const addonData: Addon[] = addonMapper.selectList(new QueryWrapper().eq("support_app", data.getAddon())); + const addonSaveData: DiyTheme[] = []; + if(ObjectUtil.isNotEmpty(addonData)){ + for (const addon of addonData) { + const saveData: DiyTheme = new DiyTheme(); + saveData.setSiteId(siteId); + saveData.setType("addon"); + saveData.setAddon(addon.getKey()); + saveData.setTitle(diyTheme.getTitle()); + saveData.setTheme(data.getTheme().toString()); + saveData.setNewTheme(data.getNewTheme().toString()); + saveData.setIsSelected(1); + saveData.setUpdateTime(System.currentTimeMillis() / 1000); + addonSaveData.add(saveData); + } + } + + diyThemeMapper.update(null, new UpdateWrapper().eq("site_id", siteId).eq("addon", data.getAddon()).eq("type", "addon").set("is_selected", 0)); + + const model: DiyTheme = new DiyTheme(); + BeanUtils.copyProperties(data, model); + model.setIsSelected(1); + model.setUpdateTime(System.currentTimeMillis() / 1000); + diyThemeMapper.updateById(model); + + if (!ObjectUtil.isNotEmpty(addonSaveData)) { + for (const saveData of addonSaveData) { + + diyThemeMapper.update(null, new UpdateWrapper().eq("site_id", siteId).eq("addon", saveData.getAddon()).eq("type", "addon").set("is_selected", 0)); + diyThemeMapper.update(saveData, new UpdateWrapper().eq("site_id", siteId).eq("addon", saveData.getAddon()).eq("type", "addon").eq("title", saveData.getTitle())); + } + } } /** * getDefaultThemeColor */ async getDefaultThemeColor(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const addon: string = data.getAddon(); + const themeList: DiyTheme[] = diyThemeMapper.selectList(new QueryWrapper().eq("site_id", RequestUtils.siteId()).eq("addon", addon)); + const voList: DiyThemeInfoVo[] = []; + for (const theme of themeList) { + const vo: DiyThemeInfoVo = new DiyThemeInfoVo(); + BeanUtils.copyProperties(theme, vo); + const addonTheme: Record = coreDiyService.getDefaultThemeColor(theme.getAddon()); + if (!addonTheme.length === 0 && addonTheme.containsKey("theme_field")) { + vo.setThemeField(addonTheme.getJSONArray("theme_field")); + } + voList.add(vo); + } + + return voList; } /** * addDiyTheme */ async addDiyTheme(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const siteId: number = RequestUtils.siteId(); + const addonData: Addon[] = addonMapper.selectList(new QueryWrapper().eq("support_app", data.getAddon())); + const addonSaveData: DiyTheme[] = []; + if (!addonData.length === 0) { + for (const addon of addonData) { + + const diyTheme: DiyTheme = new DiyTheme(); + diyTheme.setSiteId(siteId); + diyTheme.setTheme("addon"); + diyTheme.setAddon(addon.getKey()); + diyTheme.setTitle(data.getTitle()); + diyTheme.setTheme(data.getTheme().toString()); + diyTheme.setNewTheme(data.getNewTheme().toString()); + diyTheme.setDefaultTheme(data.getDefaultTheme().toString()); + diyTheme.setThemeType("diy"); + diyTheme.setCreateTime(System.currentTimeMillis() / 1000); + addonSaveData.add(diyTheme); + } + } + + const model: DiyTheme = new DiyTheme(); + BeanUtils.copyProperties(data, model); + model.setType("app"); + model.setThemeType("diy"); + model.setCreateTime(System.currentTimeMillis() / 1000); + addonSaveData.add(model); + if (ObjectUtil.isNotEmpty(addonSaveData)) { + for (const diyTheme of addonSaveData) { + diyThemeMapper.insert(diyTheme); + } + } } /** * editDiyTheme */ async editDiyTheme(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const diyThemeInfo: DiyTheme = diyThemeMapper.selectById(id); + if (ObjectUtil.isEmpty(diyThemeInfo)) { + throw new Error("主题色不存在"); + } + const addonData: DiyTheme[] = diyThemeMapper.selectList(new QueryWrapper().eq("type", "addon").eq("title", diyThemeInfo.getTitle())); + const addonSaveData: DiyTheme[] = []; + if (ObjectUtil.isNotEmpty(addonData)) { + for (const diyTheme of addonData) { + const saveData: DiyTheme = new DiyTheme(); + saveData.setId(diyTheme.getId()); + saveData.setSiteId(diyTheme.getSiteId()); + saveData.setTitle(diyTheme.getTitle()); + saveData.setTheme(data.getTheme().toString()); + saveData.setNewTheme(data.getNewTheme().toString()); + saveData.setUpdateTime(System.currentTimeMillis() / 1000); + + addonSaveData.add(saveData); + } + } + BeanUtils.copyProperties(data, diyThemeInfo); + diyThemeInfo.setUpdateTime(System.currentTimeMillis() / 1000); + + diyThemeMapper.updateById(diyThemeInfo); + + if (ObjectUtil.isNotEmpty(addonSaveData)) { + for (const diyTheme of addonSaveData) { + diyThemeMapper.updateById(diyTheme); + } + } } /** * delDiyTheme */ async delDiyTheme(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const diyThemeInfo: DiyTheme = diyThemeMapper.selectById(id); + if (ObjectUtil.isEmpty(diyThemeInfo)) { + throw new BadRequestException("主题色不存在"); + } + if (diyThemeInfo.getThemeType() === "default") { + throw new BadRequestException("默认主题色不能删除"); + } + diyThemeMapper.deleteById(diyThemeInfo); } /** * checkDiyThemeTitleUnique */ async checkDiyThemeTitleUnique(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + queryWrapper.eq("title", data.getTitle()); + queryWrapper.eq("addon", data.getAddon()); + if(ObjectUtil.isNotEmpty(data.getId())) + { + queryWrapper.ne("id", data.getId()); + } + return diyThemeMapper.selectCount(queryWrapper) == 0; } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/diy_form/impl/diy-form-config-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/diy_form/impl/diy-form-config-service-impl.service.ts index 5e5d2f06..0303aaa8 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/diy_form/impl/diy-form-config-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/diy_form/impl/diy-form-config-service-impl.service.ts @@ -14,31 +14,29 @@ export class DiyFormConfigServiceImplService { * getWriteConfig */ async getWriteConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return coreDiyFormConfigService.getWriteConfig(RequestUtils.siteId(), formId); } /** * editWriteConfig */ async editWriteConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + editParam.setSiteId(RequestUtils.siteId()); + coreDiyFormConfigService.editWriteConfig(editParam); } /** * getSubmitConfig */ async getSubmitConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return coreDiyFormConfigService.getSubmitConfig(RequestUtils.siteId(), formId); } /** * editSubmitConfig */ async editSubmitConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + editParam.setSiteId(RequestUtils.siteId()); + coreDiyFormConfigService.editSubmitConfig(editParam); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/diy_form/impl/diy-form-records-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/diy_form/impl/diy-form-records-service-impl.service.ts index 3e171f36..93aa3d2c 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/diy_form/impl/diy-form-records-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/diy_form/impl/diy-form-records-service-impl.service.ts @@ -14,15 +14,202 @@ export class DiyFormRecordsServiceImplService { * getPage */ async getPage(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const page: number = pageParam.getPage(); + const limit: number = pageParam.getLimit(); + const queryWrapper: MPJQueryWrapper = new MPJQueryWrapper<>(); + + //sql语句 + queryWrapper.select("ndfr.form_id, ndfr.member_id, nm.username, nm.member_no, nm.mobile, nm.nickname, nm.headimg,count(*) as write_count") + .setAlias("ndfr") + .leftJoin("?_member nm ON ndfr.member_id = nm.member_id".replace("?_", this.config.get('tablePrefix'))); + + queryWrapper.eq("ndfr.site_id", RequestUtils.siteId()); + if (ObjectUtil.isNotEmpty(searchParam.getFormId())) { + queryWrapper.eq("ndfr.form_id", searchParam.getFormId()); + } + if (ObjectUtil.isNotEmpty(searchParam.getKeyword())) { + queryWrapper.and(i => i.or(j => j.like("nm.nickname", searchParam.getKeyword())) + .or(j => j.like("nm.mobile", searchParam.getKeyword())) + ); + } + queryWrapper.groupBy("ndfr.member_id"); + + + queryWrapper.orderByDesc("ndfr.form_id"); + const iPage: IPage = diyFormRecordsMapper.selectJoinPage(new Page<>(page, limit), DiyFormRecordsListVo.class, queryWrapper); + for (const vo of iPage.getRecords()) { + const memberVo: Member = new Member(); + BeanUtils.copyProperties(vo, memberVo); + vo.setMember(memberVo); + } + return PageResult.build(iPage); } /** * getFieldStatList */ async getFieldStatList(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const diyFormRecordsFieldsSearchParam: DiyFormRecordsFieldsSearchParam = new DiyFormRecordsFieldsSearchParam(); + diyFormRecordsFieldsSearchParam.setFormId(searchParam.getFormId()); + const fieldsList: DiyFormFieldsListVo[] = diyFormService.getFieldsList(diyFormRecordsFieldsSearchParam); + + // 过滤简单字段列表 + String[] simpleTypes = {"FormRadio", "FormCheckbox", "FormDateScope", "FormTimeScope", "FormImage"}; + const simpleFieldList: DiyFormFieldsListVo[] = fieldsList.stream() + .filter(e => !Arrays.asList(simpleTypes).includes(e.getFieldType())) + .collect(Collectors.toList()); + + // 过滤 JSON 字段列表 + String[] jsonTypes = {"FormRadio", "FormCheckbox", "FormDateScope", "FormTimeScope"}; + const jsonFieldList: DiyFormFieldsListVo[] = fieldsList.stream() + .filter(e => Arrays.asList(jsonTypes).includes(e.getFieldType())) + .collect(Collectors.toList()); + + const totalCount: number = 0; + for (const field of simpleFieldList) { + // 统计每个字段值的填写数量 + const valueQueryWrapper: QueryWrapper = new QueryWrapper<>(); + valueQueryWrapper.eq("site_id", RequestUtils.siteId()) + .eq("field_key", field.getFieldKey()) + .eq("field_type", field.getFieldType()); + if (searchParam.getFormId() != null) { + valueQueryWrapper.eq("form_id", searchParam.getFormId()); + } + const valueList: Record[] = diyFormRecordsFieldsMapper.selectMaps(valueQueryWrapper + .select("form_id, field_key, field_type, field_value, count(*) as write_count") + .groupBy("field_value")); + for (const i of number = 0; i < valueList.size(); i++) { + const value: Record = valueList.get(i); + const diyFormComponentEnum: DiyFormComponentEnum = new DiyFormComponentEnum(); + const component: Record = diyFormComponentEnum.getComponent(value.get("field_type").toString()); + if(component.containsKey("render")){ + const driver: string = component.getStr("render"); + if(ObjectUtil.isNotEmpty(driver)) + { + try{ + Class clazz = ClassLoaderUtil.loadClass(driver); + const obj: any = clazz.getDeclaredConstructor().newInstance(); + const method: Method = clazz.getMethod("render", String.class, String.class); + value.put("render_value", method.invoke(obj, value.get("field_value").toString(), value.get("field_type").toString())); + }catch (Exception e){ + e.printStackTrace(); + } + + } + }else{ + value.put("render_value", value.get("field_value")); + } + } + + // 计算总数量 + totalCount = diyFormRecordsFieldsMapper.selectCount(new QueryWrapper().eq("site_id", RequestUtils.siteId()) + .eq("field_key", field.getFieldKey()) + .eq("field_type", field.getFieldType())); + + if (totalCount > 0) { + const totalPercent: number = 100; + for (const i of number = 0; i < valueList.size(); i++) { + const value: Record = valueList.get(i); + double itemPercent; + if (i == valueList.size() - 1) { + itemPercent = totalPercent; + } else { + itemPercent = Math.round((number.parseInt(value.get("write_count").toString()) / totalCount) * 100 * 100) / 100.0; + } + value.put("write_percent", itemPercent); + totalPercent = totalPercent - itemPercent; + } + } + field.setValueList(valueList); + } + + // 处理 JSON 字段列表 + for (const field of jsonFieldList) { + // 查询字段记录 + const fieldQueryWrapper: QueryWrapper = new QueryWrapper<>(); + fieldQueryWrapper.eq("site_id", RequestUtils.siteId()) + .eq("field_key", field.getFieldKey()) + .eq("field_type", field.getFieldType()); + if (searchParam.getFormId() != null) { + fieldQueryWrapper.eq("form_id", searchParam.getFormId()); + } + const fieldList: Record[] = diyFormRecordsFieldsMapper.selectMaps(fieldQueryWrapper); + for (const i of number = 0; i < fieldList.size(); i++) { + const value: Record = fieldList.get(i); + const diyFormComponentEnum: DiyFormComponentEnum = new DiyFormComponentEnum(); + const component: Record = diyFormComponentEnum.getComponent(value.get("field_type").toString()); + if(component.containsKey("render")){ + const driver: string = component.getStr("render"); + if(ObjectUtil.isNotEmpty(driver)) + { + try{ + Class clazz = ClassLoaderUtil.loadClass(driver); + const obj: any = clazz.getDeclaredConstructor().newInstance(); + const method: Method = clazz.getMethod("render", String.class, String.class); + value.put("render_value", method.invoke(obj, value.get("field_value").toString(), value.get("field_type").toString())); + }catch (Exception e){ + e.printStackTrace(); + } + + } + }else{ + value.put("render_value", value.get("field_value")); + } + } + totalCount = 0; + const valueMap: Record = {}; + for (const record of fieldList) { + if (!"FormCheckbox" === record.get("field_type")) { + const key: string = record.get("field_key") + "_" + record.get("render_value"); + if (valueMap.containsKey(key)) { + valueMap.get(key).put("write_count", valueMap.get(key).get("write_count") + 1); + totalCount++; + } else { + valueMap.put(key, record); + valueMap.get(key).put("write_count", 1); + totalCount++; + } + } else { + String[] values = record.get("render_value").toString().split(","); + for (const value of values) { + const key: string = record.get("field_key") + "_" + value; + if (valueMap.containsKey(key)) { + valueMap.get(key).put("write_count", valueMap.get(key).get("write_count") + 1); + totalCount++; + } else { + const newRecord: Record = new HashMap<>(record); + newRecord.put("render_value", value); + newRecord.put("write_count", 1); + valueMap.put(key, newRecord); + totalCount++; + } + } + } + } + + if (totalCount > 0) { + const valueList: Record[] = new ArrayList<>(valueMap.values()); + const totalPercent: number = 100; + for (const i of number = 0; i < valueList.size(); i++) { + const value: Record = valueList.get(i); + double itemPercent; + if (i == valueList.size() - 1) { + itemPercent = totalPercent; + } else { + itemPercent = Math.round((number.parseInt(value.get("write_count").toString()) / totalCount) * 100 * 100) / 100.0; + } + value.put("write_percent", itemPercent); + totalPercent = totalPercent - itemPercent; + } + field.setValueList(valueList); + } + } + + // 合并结果 + const resultList: DiyFormFieldsListVo[] = []; + resultList.addAll(simpleFieldList); + resultList.addAll(jsonFieldList); + + return resultList; } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/diy_form/impl/diy-form-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/diy_form/impl/diy-form-service-impl.service.ts index c202e273..c1108631 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/diy_form/impl/diy-form-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/diy_form/impl/diy-form-service-impl.service.ts @@ -14,167 +14,628 @@ export class DiyFormServiceImplService { * getPage */ async getPage(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const page: number = pageParam.getPage(); + const limit: number = pageParam.getLimit(); + + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + + queryWrapper.eq("site_id", RequestUtils.siteId()); + + if (ObjectUtil.isNotEmpty(searchParam.getTitle())) { + queryWrapper.eq("title", searchParam.getTitle()); + } + if (ObjectUtil.isNotEmpty(searchParam.getTitle())) { + queryWrapper.and(i => i.or(j => j.like("title", searchParam.getTitle())) + .or(j => j.like("page_title", searchParam.getTitle())) + ); + } + if (ObjectUtil.isNotEmpty(searchParam.getType())) { + queryWrapper.eq("type", searchParam.getType()); + } + + if (ObjectUtil.isNotEmpty(searchParam.getAddon())) { + queryWrapper.eq("addon", searchParam.getAddon()); + } + + queryWrapper.orderByDesc("form_id"); + + const iPage: IPage = diyFormMapper.selectPage(new Page<>(page, limit), queryWrapper); + const list: DiyFormListVo[] = []; + for (const item of iPage.getRecords()) { + const vo: DiyFormListVo = new DiyFormListVo(); + BeanUtils.copyProperties(item, vo); + list.add(vo); + } + return PageResult.build(page, limit, iPage.getTotal()).setData(list); } /** * getList */ async getList(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + + queryWrapper.eq("site_id", RequestUtils.siteId()); + + if (ObjectUtil.isNotEmpty(searchParam.getTitle())) { + queryWrapper.eq("title", searchParam.getTitle()); + } + if (ObjectUtil.isNotEmpty(searchParam.getTitle())) { + queryWrapper.and(i => i.or(j => j.like("title", searchParam.getTitle())) + .or(j => j.like("page_title", searchParam.getTitle())) + ); + } + if (ObjectUtil.isNotEmpty(searchParam.getType())) { + queryWrapper.eq("type", searchParam.getType()); + } + + if (ObjectUtil.isNotEmpty(searchParam.getAddon())) { + queryWrapper.eq("addon", searchParam.getAddon()); + } + if (ObjectUtil.isNotEmpty(searchParam.getStatus())) { + queryWrapper.eq("status", searchParam.getStatus()); + } + queryWrapper.orderByDesc("form_id"); + const list: DiyForm[] = diyFormMapper.selectList(queryWrapper); + const voList: DiyFormListVo[] = []; + for (const item of list) { + const vo: DiyFormListVo = new DiyFormListVo(); + BeanUtils.copyProperties(item, vo); + voList.add(vo); + } + return voList; } /** * getInfo */ async getInfo(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: DiyForm = diyFormMapper.selectOne( + new QueryWrapper() + .eq("form_id", id) + .eq("site_id", RequestUtils.siteId())); + + + Assert.notNull(model, "万能表单不存在"); + + const vo: DiyFormInfoVo = new DiyFormInfoVo(); + BeanUtils.copyProperties(model, vo); + return vo; } /** * getCount */ async getCount(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + + queryWrapper.eq("site_id", RequestUtils.siteId()); + if (ObjectUtil.isNotEmpty(searchParam.getType())) { + queryWrapper.eq("type", searchParam.getType()); + } + const count: number = diyFormMapper.selectCount(queryWrapper); + if(ObjectUtil.isEmpty(count)) + { + count = 0L; + } + return count; } /** * add */ async add(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: DiyForm = new DiyForm(); + + model.setPageTitle(addParam.getPageTitle()); + model.setTitle(addParam.getTitle()); + model.setType(addParam.getType()); + model.setStatus(1); + model.setTemplate(addParam.getTemplate()); + model.setValue(addParam.getValue()); + const diyFormTypeEnum: DiyFormTypeEnum = new DiyFormTypeEnum(); + const type: Record = diyFormTypeEnum.getType(addParam.getType()); + if(type.containsKey("addon")) + { + model.setAddon(type.getStr("addon")); + }else{ + model.setAddon(""); + } + + model.setShare(addParam.getShare()); + model.setRemark(addParam.getRemark()); + model.setSiteId(RequestUtils.siteId()); + model.setCreateTime(System.currentTimeMillis() / 1000); + model.setUpdateTime(System.currentTimeMillis() / 1000); + diyFormMapper.insert(model); + const diyFormFields: DiyFormFields[] = []; + if (ObjectUtil.isNotEmpty(addParam.getValue())) { + const value: Record = JSONUtil.parseObj(addParam.getValue()); + const components: JSONArray = value.getJSONArray("value"); + for (const componentObj of components) { + const component: Record = JSONUtil.parseObj(componentObj); + const componentType: string = component.getStr("componentType"); + const componentName: string = component.getStr("componentName"); + if (!"diy_form" === componentType || "FormSubmit" === componentName) { + continue; + } + const field: Record = component.getJSONObject("field"); + + const fieldRecord: DiyFormFields = new DiyFormFields(); + fieldRecord.setSiteId(RequestUtils.siteId()); + fieldRecord.setFormId(model.getFormId()); + fieldRecord.setFieldKey(component.get("id").toString()); + fieldRecord.setFieldType(componentName); + fieldRecord.setFieldName(field.containsKey("name") ? field.getStr("name") : ""); + if(field.containsKey("remark")) + { + const remark: Record = field.getJSONObject("remark"); + if(remark.containsKey("text")) + { + fieldRecord.setFieldRemark(remark.getStr("text")); + }else{ + fieldRecord.setFieldRemark(""); + } + }else{ + fieldRecord.setFieldRemark(""); + } + fieldRecord.setFieldDefault(field.containsKey("default") ? field.get("default").toString() : ""); + fieldRecord.setFieldRequired(field.containsKey("required") ? field.getInt("required") : 0); + fieldRecord.setFieldHidden(component.getInt("isHidden")); + fieldRecord.setFieldUnique(field.containsKey("unique") ? field.getInt("unique") : 0); + fieldRecord.setPrivacyProtection(field.containsKey("privacyProtection") ? field.getInt("privacyProtection") : 0); + fieldRecord.setCreateTime(System.currentTimeMillis() / 1000); + fieldRecord.setUpdateTime(System.currentTimeMillis() / 1000); + diyFormFields.add(fieldRecord); + } + } + if (!diyFormFields.length === 0) { + diyFormFieldsMapper.insert(diyFormFields); + } + + const writeParam: DiyFormWriteConfigParam = new DiyFormWriteConfigParam(); + writeParam.setSiteId(RequestUtils.siteId()); + writeParam.setFormId(model.getFormId()); + // 初始化表单填写配置 + coreDiyFormConfigService.addWriteConfig(writeParam); + + const submitConfigParam: DiyFormSubmitConfigParam = new DiyFormSubmitConfigParam(); + submitConfigParam.setSiteId(RequestUtils.siteId()); + submitConfigParam.setFormId(model.getFormId()); + // 初始化表单提交成功页配置 + coreDiyFormConfigService.addSubmitConfig(submitConfigParam); + + return model.getFormId(); } /** * edit */ async edit(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: DiyForm = diyFormMapper.selectOne( + new QueryWrapper() + .eq("form_id", id) + .eq("site_id", RequestUtils.siteId())); + + Assert.notNull(model, "万能表单不存在"); + model.setTitle(editParam.getTitle()); + model.setPageTitle(editParam.getPageTitle()); + model.setTemplate(editParam.getTemplate()); + model.setValue(editParam.getValue()); + model.setUpdateTime(System.currentTimeMillis() / 1000); + diyFormMapper.updateById(model); + const formFieldsList: DiyFormFields[] = diyFormFieldsMapper.selectList(new QueryWrapper().eq("form_id", id)); + const formFieldsListMap: Record = formFieldsList.stream().collect(Collectors.toMap(DiyFormFields::getFieldKey, a => a)); + const existFieldKeys: string[] = []; + const diyFormFields: DiyFormFields[] = []; + if (ObjectUtil.isNotEmpty(editParam.getValue())) { + const value: Record = JSONUtil.parseObj(editParam.getValue()); + const components: JSONArray = value.getJSONArray("value"); + for (const componentObj of components) { + const component: Record = JSONUtil.parseObj(componentObj); + const componentType: string = component.getStr("componentType"); + const componentName: string = component.getStr("componentName"); + if (!"diy_form" === componentType || "FormSubmit" === componentName) { + continue; + } + const field: Record = component.getJSONObject("field"); + + const fieldRecord: DiyFormFields = new DiyFormFields(); + fieldRecord.setSiteId(RequestUtils.siteId()); + fieldRecord.setFormId(model.getFormId()); + fieldRecord.setFieldKey(component.get("id").toString()); + fieldRecord.setFieldType(componentName); + fieldRecord.setFieldName(field.containsKey("name") ? field.getStr("name") : ""); + if(field.containsKey("remark")) + { + const remark: Record = field.getJSONObject("remark"); + if(remark.containsKey("text")) + { + fieldRecord.setFieldRemark(remark.getStr("text")); + }else{ + fieldRecord.setFieldRemark(""); + } + }else{ + fieldRecord.setFieldRemark(""); + } + fieldRecord.setFieldDefault(field.containsKey("default") ? field.get("default").toString() : ""); + fieldRecord.setFieldRequired(field.containsKey("required") ? field.getInt("required") : 0); + fieldRecord.setFieldHidden(component.getInt("isHidden")); + fieldRecord.setFieldUnique(field.containsKey("unique") ? field.getInt("unique") : 0); + fieldRecord.setPrivacyProtection(field.containsKey("privacyProtection") ? field.getInt("privacyProtection") : 0); + fieldRecord.setUpdateTime(System.currentTimeMillis() / 1000); + + if(formFieldsListMap.containsKey(component.getStr("id"))) + { + diyFormFieldsMapper.update(fieldRecord, new QueryWrapper().eq("site_id", RequestUtils.siteId()).eq("field_id", formFieldsListMap.get(component.getStr("id")).getFieldId())); + existFieldKeys.add(component.getStr("id")); + }else{ + diyFormFields.add(fieldRecord); + } + + } + if (!diyFormFields.length === 0) { + diyFormFieldsMapper.insert(diyFormFields); + } + for (Map.Entry entry : formFieldsListMap.entrySet()) { + + if(!existFieldKeys.includes(entry.getKey())) { + diyFormFieldsMapper.delete(new QueryWrapper().eq("site_id", RequestUtils.siteId()).eq("field_id", entry.getValue().getFieldId())); + } + } + }else{ + diyFormFieldsMapper.delete(new QueryWrapper().eq("site_id", RequestUtils.siteId()).eq("form_id", model.getFormId())); + } } /** * del */ async del(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const count: number = diyFormMapper.selectCount(new QueryWrapper().in("form_id", formIds).eq("site_id", RequestUtils.siteId()).eq("status", 1)); + if(count > 0){ + throw new BadRequestException("存在正在使用的表单,无法删除"); + } + //事件检测是否可以被删除 + DiyFormDelBeforeEventDefiner.const event: DiyFormDelBeforeEvent = new DiyFormDelBeforeEventDefiner.DiyFormDelBeforeEvent(); + for (const formId of formIds) { + event.setFormId(formId); + event.setSiteId(RequestUtils.siteId()); + const result: DiyFormDelBeforeEventDefiner.DiyFromDelBeforeResult[] = EventAndSubscribeOfPublisher.publishAndCallback(event); + for (DiyFormDelBeforeEventDefiner.DiyFromDelBeforeResult res : result) { + if(ObjectUtil.isNotEmpty(res)) + { + if(!res.getAllowOperate()) throw new BadRequestException("存在正在使用的表单,无法删除"); + } + } + } + + diyFormMapper.delete(new QueryWrapper().eq("site_id", RequestUtils.siteId()).in("form_id", formIds)); + diyFormFieldsMapper.delete(new QueryWrapper().eq("site_id", RequestUtils.siteId()).in("form_id", formIds)); + diyFormSubmitConfigMapper.delete(new QueryWrapper().eq("site_id", RequestUtils.siteId()).in("form_id", formIds)); + diyFormWriteConfigMapper.delete(new QueryWrapper().eq("site_id", RequestUtils.siteId()).in("form_id", formIds)); } /** * getInit */ async getInit(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const time: number = System.currentTimeMillis() / 1000; + const data: DiyFormInfoVo = new DiyFormInfoVo(); + + if (!params.getFormId() === 0) { + data = getInfo(params.getFormId()); + } + + if (ObjectUtil.isNotEmpty(data.getType())) { + const diyFormTypeEnum: DiyFormTypeEnum = new DiyFormTypeEnum(); + const currentType: Record = diyFormTypeEnum.getType(data.getType()); + const typeName: string = currentType.getStr("title"); + data.setTypeName(typeName); + } else { + if (ObjectUtil.isEmpty(params.getType())) { + throw new BadRequestException("DIY_FORM_TYPE_NOT_EXIST"); + } + const type: string = params.getType(); + + // 新页面赋值 + const pageTitle: string = params.getTitle() != null ? params.getTitle() : "表单页面" + time; + + const diyFormTypeEnum: DiyFormTypeEnum = new DiyFormTypeEnum(); + const currentType: Record = diyFormTypeEnum.getType(params.getType()); + const typeName: string = currentType.getStr("title"); + const value: string = ""; + + data = new DiyFormInfoVo(); + data.setFormId(0); + data.setPageTitle(pageTitle); + data.setTitle(typeName); + data.setType(type); + data.setTypeName(typeName); + data.setValue(value); + data.setStatus(1); + } + + const initVo: DiyFormInitVo = new DiyFormInitVo(); + BeanUtils.copyProperties(data, initVo); + initVo.setComponent(getComponentList(data.getType())); + initVo.setDomainUrl(systemConfigService.getSceneDomain(RequestUtils.siteId())); + return initVo; } /** * modifyShare */ async modifyShare(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const diyForm: DiyForm = new DiyForm(); + diyForm.setShare(share); + diyFormMapper.update(diyForm, new QueryWrapper().eq("form_id", formId).eq("site_id", RequestUtils.siteId())); + return true; } /** * getComponentList */ async getComponentList(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; - } - - /** - * compare - */ - async compare(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const formComponentEunm: DiyFormComponentEnum = new DiyFormComponentEnum(); + const formComponentList: Record = formComponentEunm.getComponent(); + for (const formComponentObj of formComponentList.keySet()) { + const formComponent: Record = formComponentList.getJSONObject(formComponentObj); + const list: Record = formComponent.getJSONObject("list"); + Iterator> = list.entrySet().iterator(); + while (iterator.hasNext()) { + const cv: Record = JSONUtil.parseObj(iterator.next()); + if(cv.containsKey("support")) + { + const support: JSONArray = cv.getJSONArray("support"); + if (support != null && support.size() > 0 && !support.includes(type)) { + iterator.remove(); + continue; + } + } + cv.remove("sort"); + cv.remove("support"); + } + // 根据 sort 排序 + formComponent.put("list", sortJSONObjectBySortField(list)); + } + + componentType(formComponentList, "diy_form"); + + const data: Record = formComponentList; + if ("DIY_FORM" === type) { + const diyComponentList: Record = diyService.getComponentList(""); + componentType(diyComponentList, "diy"); + data = mergeJsonObjects(formComponentList, diyComponentList);; + } + return data; } /** * getPageData */ async getPageData(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return ObjectUtil.defaultIfNull(PagesEnum.getPages(type, name), new Record()); } /** * copy */ async copy(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const diyForm: DiyForm = diyFormMapper.selectOne(new QueryWrapper().eq("form_id", formId).eq("site_id", RequestUtils.siteId())); + if(ObjectUtil.isEmpty(diyForm)) throw new BadRequestException("万能表单不存在"); + const diyFormSubmitConfig: DiyFormSubmitConfig = diyFormSubmitConfigMapper.selectOne(new QueryWrapper().eq("form_id", formId)); + const diyFormWriteConfig: DiyFormWriteConfig = diyFormWriteConfigMapper.selectOne(new QueryWrapper().eq("form_id", formId)); + const diyFormFields: DiyFormFields[] = diyFormFieldsMapper.selectList(new QueryWrapper().eq("form_id", formId)); + + // 复制表单信息 + const newDiyForm: DiyForm = new DiyForm(); + BeanUtils.copyProperties(diyForm, newDiyForm); + newDiyForm.setFormId(null); // 清空原有的 form_id,让数据库自动生成新的 + newDiyForm.setPageTitle(newDiyForm.getPageTitle() + "_副本"); + newDiyForm.setStatus(0); + newDiyForm.setShare(""); + newDiyForm.setWriteNum(0); + const currentTime: number = System.currentTimeMillis() / 1000; + newDiyForm.setCreateTime(currentTime); + newDiyForm.setUpdateTime(currentTime); + + // 插入新的表单信息 + diyFormMapper.insert(newDiyForm); + const newFormId: number = newDiyForm.getFormId(); + + // 复制表单字段 + if (!ObjectUtil.isEmpty(diyFormFields)) { + const newFormFieldList: DiyFormFields[] = []; + for (const item of diyFormFields) { + const newField: DiyFormFields = new DiyFormFields(); + BeanUtils.copyProperties(item, newField); + newField.setFieldId(null); // 清空原有的 field_id,让数据库自动生成新的 + newField.setFormId(newFormId); + newField.setWriteNum(0); + newField.setCreateTime(currentTime); + newField.setUpdateTime(currentTime); + newFormFieldList.add(newField); + } + const mybatisBatch: MybatisBatch = new MybatisBatch<>(sqlSessionFactory, newFormFieldList); + MybatisBatch.const method: Method = new MybatisBatch.Method<>(DiyFormFieldsMapper.class); + mybatisBatch.execute(method.insert()); + } + + // 复制填写配置 + if (!ObjectUtil.isEmpty(diyFormWriteConfig)) { + const newWriteConfig: DiyFormWriteConfigParam = new DiyFormWriteConfigParam(); + BeanUtils.copyProperties(diyFormWriteConfig, newWriteConfig); + newWriteConfig.setFormId(newFormId); + newWriteConfig.setId(null); + coreDiyFormConfigService.addWriteConfig(newWriteConfig); + } + + // 复制提交配置 + if (!ObjectUtil.isEmpty(diyFormSubmitConfig)) { + const newSubmitConfig: DiyFormSubmitConfigParam = new DiyFormSubmitConfigParam(); + BeanUtils.copyProperties(diyFormSubmitConfig, newSubmitConfig); + newSubmitConfig.setFormId(newFormId); + newSubmitConfig.setId(null); + coreDiyFormConfigService.addSubmitConfig(newSubmitConfig); + } + + return newFormId; } /** * getTemplate */ async getTemplate(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const diyFormTemplateEnum: DiyFormTemplateEnum = new DiyFormTemplateEnum(); + return diyFormTemplateEnum.getTemplate(params.getType(), params.getTemplateKey()); } /** * getFormType */ async getFormType(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const types: DiyFormTypeEnum = new DiyFormTypeEnum(); + return types.getType(); } /** * modifyStatus */ async modifyStatus(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const diyForm: DiyForm = new DiyForm(); + diyForm.setStatus(formStatusParam.getStatus()); + diyFormMapper.update(diyForm, new QueryWrapper().eq("form_id", formStatusParam.getFormId()).eq("site_id", RequestUtils.siteId())); + return true; } /** * getRecordPages */ async getRecordPages(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + searchParam.setSiteId(RequestUtils.siteId()); + return coreDiyFormRecordsService.page(pageParam, searchParam); } /** * getRecordInfo */ async getRecordInfo(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return coreDiyFormRecordsService.info(recordId); } /** * delRecord */ async delRecord(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + try { + // 减少填写数量 + const formQueryWrapper: QueryWrapper = new QueryWrapper<>(); + formQueryWrapper.eq("form_id", formId); + const diyForm: DiyForm = diyFormMapper.selectOne(formQueryWrapper); + if (diyForm != null) { + diyForm.setWriteNum(diyForm.getWriteNum() - 1); + diyFormMapper.updateById(diyForm); + } + + // 删除记录 + const recordsQueryWrapper: QueryWrapper = new QueryWrapper<>(); + recordsQueryWrapper.eq("site_id", RequestUtils.siteId()) + .eq("record_id", recordId); + diyFormRecordsMapper.delete(recordsQueryWrapper); + + // 删除万能表单填写字段 + const fieldsQueryWrapper: QueryWrapper = new QueryWrapper<>(); + fieldsQueryWrapper.eq("site_id", RequestUtils.siteId()) + .eq("record_id", recordId); + diyFormRecordsFieldsMapper.delete(fieldsQueryWrapper); + + return true; + } catch (Exception e) { + // 事务会自动回滚,因为使用了 @Transactional 注解 + throw new BadRequestException("删除记录失败: " + e.getMessage()); + } } /** * getFieldsList */ async getFieldsList(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + queryWrapper.eq("site_id", RequestUtils.siteId()) + .eq("form_id", diyFormRecordsFieldsSearchParam.getFormId()); + if(diyFormRecordsFieldsSearchParam.getSort() === "asc") + { + queryWrapper.orderByAsc(diyFormRecordsFieldsSearchParam.getOrder()); + }else { + queryWrapper.orderByDesc(diyFormRecordsFieldsSearchParam.getOrder()); + } + const list: DiyFormFields[] = diyFormFieldsMapper.selectList(queryWrapper); + const listVo: DiyFormFieldsListVo[] = []; + for (const item of list) { + const vo: DiyFormFieldsListVo = new DiyFormFieldsListVo(); + BeanUtils.copyProperties(item, vo); + listVo.add(vo); + } + return listVo; } /** * getSelectPage */ async getSelectPage(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const page: number = pageParam.getPage(); + const limit: number = pageParam.getLimit(); + // 验证表单ID集合 + const verifyFormIds: number[] = []; + if (param.getVerifyFormIds() != null && !param.getVerifyFormIds().isEmpty()) { + // 查询存在的表单const existForms: ID + List = diyFormMapper.selectList( + new QueryWrapper() + .select("form_id") + .in("form_id", param.getVerifyFormIds()) + ); + + verifyFormIds = existForms.stream() + .map(DiyForm::getFormId) + .collect(Collectors.toList()); + } + + // 构建查询条件 + const queryWrapper: LambdaQueryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(DiyForm::getSiteId, RequestUtils.siteId()) + .eq(DiyForm::getStatus, 1) + .orderByDesc(DiyForm::getFormId); + + // 添加搜索条件 + if (StringUtils.hasText(param.getTitle())) { + queryWrapper.like(DiyForm::getTitle, param.getTitle()); + } + if (StringUtils.hasText(param.getType())) { + queryWrapper.eq(DiyForm::getType, param.getType()); + } + if (StringUtils.hasText(param.getAddon())) { + queryWrapper.eq(DiyForm::getAddon, param.getAddon()); + } + + // 分页查询 + const formPage: IPage = diyFormMapper.selectPage(new Page<>(page, limit), queryWrapper); + + if (formPage.getTotal() == 0){ + return PageResult.build(page, limit, 0, []); + } + const resultList: DiyFormInfoVo[] = []; + formPage.getRecords().forEach(item => { + const diyFormInfoVo: DiyFormInfoVo = new DiyFormInfoVo(); + BeanUtils.copyProperties(item, diyFormInfoVo); + const currentType: Record = new DiyFormTypeEnum().getType(item.getType()); + const typeName: string = currentType.getStr("title"); + diyFormInfoVo.setTypeName(typeName); + const addon: Addon = addonMapper.selectOne(new LambdaQueryWrapper().eq(Addon::getKey, item.getAddon())); + const addonName: string = ObjectUtil.isNotEmpty(addon) ? addon.getTitle() : ""; + diyFormInfoVo.setAddonName(addonName); + resultList.add(diyFormInfoVo); + }); + return PageResult.build(page, limit, formPage.getTotal(), resultList); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/generator/impl/generate-column-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/generator/impl/generate-column-service-impl.service.ts index d0156404..c3b5e26e 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/generator/impl/generate-column-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/generator/impl/generate-column-service-impl.service.ts @@ -14,7 +14,6 @@ export class GenerateColumnServiceImplService { * insertAll */ async insertAll(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + super.saveOrUpdateBatch(list); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/generator/impl/generate-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/generator/impl/generate-service-impl.service.ts index 7c8b56b5..8885d600 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/generator/impl/generate-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/generator/impl/generate-service-impl.service.ts @@ -14,79 +14,384 @@ export class GenerateServiceImplService { * getPage */ async getPage(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const page: number = pageParam.getPage(); + const limit: number = pageParam.getLimit(); + + const queryWrapper: MPJQueryWrapper = new MPJQueryWrapper<>(); + queryWrapper.setAlias("ngt"); + queryWrapper.select("ngt.id, ngt.table_name, ngt.table_content, ngt.module_name, ngt.class_name, ngt.create_time, ngt.edit_type, ngt.addon_name, ngt.order_type, ngt.parent_menu, ngt.relations, ngt.synchronous_number, na.title, na.`key`"); + queryWrapper.leftJoin("?_addon na ON na.`key` = ngt.addon_name".replace("?_", this.config.get('tablePrefix'))); + if (ObjectUtil.isNotEmpty(searchParam.getTableName())) { + queryWrapper.like("ngt.table_name", searchParam.getTableName()); + } + + if (ObjectUtil.isNotEmpty(searchParam.getTableContent())) { + queryWrapper.eq("ngt.table_content", searchParam.getTableContent()); + } + + if (ObjectUtil.isNotEmpty(searchParam.getAddonName())) { + if (searchParam.getAddonName() === "2") { + queryWrapper.eq("ngt.addon_name", ""); + } else { + queryWrapper.like("ngt.addon_name", searchParam.getAddonName()); + } + } + + queryWrapper.orderByDesc("ngt.create_time"); + + const iPage: IPage = generateTableMapper.selectJoinPage(new Page<>(page, limit), GenerateListVo.class, queryWrapper); + return PageResult.build(iPage); } /** * getInfo */ async getInfo(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const generateTable: GenerateTable = generateTableMapper.selectById(id); + if (ObjectUtil.isEmpty(generateTable)) throw new AdminException("生成表不存在"); + const vo: GenerateDetailVo = new GenerateDetailVo(); + BeanUtils.copyProperties(generateTable, vo); + + if (vo.getOrderType() != 0) { + const orderColumn: GenerateColumn = generateColumnMapper.selectOne(new QueryWrapper().eq("table_id", id).eq("is_order", 1)); + if (ObjectUtil.isNotEmpty(orderColumn)) { + vo.setOrderColumnName(orderColumn.getColumnName()); + } else { + vo.setOrderColumnName(""); + } + } + const deleteColumn: GenerateColumn = generateColumnMapper.selectOne(new QueryWrapper().eq("table_id", id).eq("is_delete", 1)); + if (ObjectUtil.isNotEmpty(deleteColumn)) { + vo.setDeleteColumnName(deleteColumn.getColumnName()); + vo.setIsDelete(1); + } else { + vo.setDeleteColumnName(""); + vo.setIsDelete(0); + } + const columnList: GenerateColumn[] = generateColumnMapper.selectList(new QueryWrapper().eq("table_id", id)); + if (ObjectUtil.isNotEmpty(columnList)) { + const columnVoList: GenerateColumnVo[] = []; + for (const column of columnList) { + const generateColumnVo: GenerateColumnVo = new GenerateColumnVo(); + BeanUtils.copyProperties(column, generateColumnVo); + if (column.getViewType() === "number") { + if (!column.getValidateType().isEmpty()) { + if (column.getValidateType().startsWith("[")) { + const numValidate: JSONArray = JSONUtil.parseArray(column.getValidateType()); + if (numValidate.get(0).toString() === "between") { + generateColumnVo.setViewMax(JSONUtil.parseArray(numValidate.get(1)).get(1).toString()); + generateColumnVo.setViewMin(JSONUtil.parseArray(numValidate.get(1)).get(0).toString()); + } else if (numValidate.get(0).toString() === "max") { + generateColumnVo.setViewMax(JSONUtil.parseArray(numValidate.get(1)).get(0).toString()); + } else if (numValidate.get(0).toString() === "min") { + generateColumnVo.setViewMin(JSONUtil.parseArray(numValidate.get(1)).get(0).toString()); + } else { + generateColumnVo.setViewMax("100"); + generateColumnVo.setViewMin("0"); + } + } else { + generateColumnVo.setViewMax("100"); + generateColumnVo.setViewMin("0"); + } + + } else { + generateColumnVo.setViewMax("100"); + generateColumnVo.setViewMin("0"); + } + } else { + generateColumnVo.setViewMax(""); + generateColumnVo.setViewMin(""); + } + if (!column.getValidateType().isEmpty()) { + if (column.getValidateType().startsWith("[")) { + const num1Validate: JSONArray = JSONUtil.parseArray(column.getValidateType()); + if (num1Validate.get(0).toString() === "between") { + generateColumnVo.setMaxNumber(JSONUtil.parseArray(num1Validate.get(1)).get(1).toString()); + generateColumnVo.setMinNumber(JSONUtil.parseArray(num1Validate.get(1)).get(0).toString()); + } else if (num1Validate.get(0).toString() === "max") { + generateColumnVo.setMaxNumber(JSONUtil.parseArray(num1Validate.get(1)).get(0).toString()); + } else if (num1Validate.get(0).toString() === "min") { + generateColumnVo.setMinNumber(JSONUtil.parseArray(num1Validate.get(1)).get(0).toString()); + } else { + generateColumnVo.setMaxNumber("120"); + generateColumnVo.setMinNumber("1"); + } + } else { + generateColumnVo.setMaxNumber("120"); + generateColumnVo.setMinNumber("1"); + } + + } else { + generateColumnVo.setMaxNumber("120"); + generateColumnVo.setMinNumber("1"); + } + if (!column.getModel().isEmpty()) { + generateColumnVo.setSelectType(2); + } else { + generateColumnVo.setSelectType(1); + } + columnVoList.add(generateColumnVo); + } + vo.setTableColumn(columnVoList); + } + return vo; } /** * add */ async add(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const sql: string = "SHOW TABLE STATUS WHERE 1=1 "; + const tablePrefix: string = this.config.get('tablePrefix'); + if (!generateParam.getTableName().isEmpty()) { + sql += " const Name: AND = '" + generateParam.getTableName() + "'"; + } + const listData: Record[] = jdbcTemplate.queryForList(sql); + if (ObjectUtil.isEmpty(listData)) throw new AdminException("数据表不存在"); + const table: Record = listData.get(0); + if (ObjectUtil.isEmpty(table)) throw new AdminException("数据表不存在"); + const tableName: string = table.get("Name").toString().substring(tablePrefix.length()); + + //添加生成表数据 + const generateTable: GenerateTable = new GenerateTable(); + generateTable.setTableName(tableName); + generateTable.setTableContent(table.get("Comment").toString()); + generateTable.setClassName(tableName); + generateTable.setCreateTime(System.currentTimeMillis() / 1000); + generateTable.setModuleName(tableName); + generateTableMapper.insert(generateTable); + + //添加生成字段数据 + const columns: Record[] = jdbcTemplate.queryForList("SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = (SELECT DATABASE()) and TABLE_NAME='" + tablePrefix + tableName + "'"); + const id: number = generateTable.getId(); + const list: GenerateColumn[] = []; + for (const column of columns) { + const generateColumn: GenerateColumn = new GenerateColumn(); + + generateColumn.setIsRequired(0); + String[] defaultColumn = {"id", "create_time", "update_time"}; + if (column.get("IS_NULLABLE").toString() === "NO" && !column.get("COLUMN_KEY") === "PRI" && Arrays.asList(defaultColumn).includes(column.get("COLUMN_NAME").toString())) { + generateColumn.setIsRequired(1); + } + + generateColumn.setTableId(id); + generateColumn.setColumnName(column.get("COLUMN_NAME").toString()); + generateColumn.setColumnType(getDbFieldType(column.get("DATA_TYPE").toString())); + if (generateColumn.getColumnType() === "number" && generateColumn.getColumnName().includes("time")) { + generateColumn.setColumnType("number"); + } + generateColumn.setColumnComment(column.get("COLUMN_COMMENT").toString()); + generateColumn.setIsPk(column.get("COLUMN_KEY") === "PRI" ? 1 : 0); + generateColumn.setIsInsert(Arrays.asList(defaultColumn).includes(column.get("COLUMN_NAME").toString()) ? 0 : 1); + generateColumn.setIsUpdate(Arrays.asList(defaultColumn).includes(column.get("COLUMN_NAME").toString()) ? 0 : 1); + generateColumn.setIsLists(Arrays.asList(defaultColumn).includes(column.get("COLUMN_NAME").toString()) ? 0 : 1); + generateColumn.setIsDelete(0); + generateColumn.setQueryType("="); + generateColumn.setViewType("input"); + generateColumn.setDictType(""); + generateColumn.setAddon(""); + generateColumn.setModel(""); + generateColumn.setLabelKey(""); + generateColumn.setValueKey(""); + generateColumn.setCreateTime(System.currentTimeMillis() / 1000); + generateColumn.setUpdateTime(System.currentTimeMillis() / 1000); + list.add(generateColumn); + + } + generateColumnService.insertAll(list); + return id; } /** * edit */ async edit(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + //添加生成表数据 + const generateTable: GenerateTable = new GenerateTable(); + generateTable.setId(id); + generateTable.setTableName(generateParam.getTableName()); + generateTable.setTableContent(generateParam.getTableContent()); + generateTable.setModuleName(generateParam.getModuleName()); + generateTable.setClassName(generateParam.getClassName()); + generateTable.setEditType(generateParam.getEditType()); + generateTable.setAddonName(generateParam.getAddonName()); + generateTable.setOrderType(generateParam.getOrderType()); + generateTable.setParentMenu(generateParam.getParentMenu()); + generateTable.setRelations(generateParam.getRelations()); + generateTableMapper.updateById(generateTable); + //更新表字段 + generateColumnMapper.delete(new QueryWrapper().eq("table_id", id)); + const columns: JSONArray = JSONUtil.parseArray(generateParam.getTableColumn()); + const list: GenerateColumn[] = []; + + for (const i of number = 0; i < columns.size(); i++) { + const generateColumn: GenerateColumn = new GenerateColumn(); + const column: Record = columns.getJSONObject(i); + generateColumn.setTableId(id); + generateColumn.setColumnName(column.getStr("column_name")); + generateColumn.setColumnComment(column.getStr("column_comment")); + generateColumn.setIsPk(column.getInt("is_pk")); + generateColumn.setIsRequired(column.getInt("is_required")); + generateColumn.setIsInsert(column.getInt("is_insert")); + generateColumn.setIsUpdate(column.getInt("is_update")); + generateColumn.setIsLists(column.getInt("is_lists")); + generateColumn.setIsSearch(column.getInt("is_search")); + generateColumn.setIsDelete(0); + generateColumn.setIsOrder(0); + generateColumn.setQueryType(column.getStr("query_type")); + generateColumn.setViewType(ObjectUtil.isEmpty(column.getStr("view_type")) ? "input" : column.getStr("view_type")); + generateColumn.setDictType(ObjectUtil.isEmpty(column.getStr("dict_type")) ? "" : column.getStr("dict_type")); + generateColumn.setAddon(ObjectUtil.isEmpty(column.getStr("addon")) ? "" : column.getStr("addon")); + generateColumn.setModel(ObjectUtil.isEmpty(column.getStr("model")) ? "" : column.getStr("model")); + generateColumn.setLabelKey(ObjectUtil.isEmpty(column.getStr("label_key")) ? "" : column.getStr("label_key")); + generateColumn.setValueKey(ObjectUtil.isEmpty(column.getStr("value_key")) ? "" : column.getStr("value_key")); + generateColumn.setUpdateTime(System.currentTimeMillis() / 1000); + generateColumn.setCreateTime(System.currentTimeMillis() / 1000); + generateColumn.setColumnType(ObjectUtil.isEmpty(column.getStr("column_type")) ? "String" : column.getStr("column_type")); + generateColumn.setValidateType(ObjectUtil.isEmpty(column.getStr("validate_type")) ? "" : column.getStr("validate_type")); + //传入字段rule暂时不知含义,待定 + + if (generateParam.getIsDelete() == 1) { + if (column.getStr("column_name") === generateParam.getDeleteColumnName()) { + generateColumn.setIsDelete(1); + } + } + if (generateParam.getOrderType() != 0) { + if (column.getStr("column_name") === generateParam.getOrderColumnName()) { + generateColumn.setIsOrder(1); + } + } + + if (ObjectUtil.isNotEmpty(column.getStr("validate_type")) && !column.getStr("view_type") === "number") { + if (column.getStr("validate_type") === "between") { + const jsonArray: JSONArray = new JSONArray(); + jsonArray.add("between"); + jsonArray.add(new String[]{column.getStr("min_number"), column.getStr("max_number")}); + generateColumn.setValidateType(jsonArray.toString()); + } else if (column.getStr("validate_type") === "max") { + const jsonArray: JSONArray = new JSONArray(); + jsonArray.add("max"); + jsonArray.add(new String[]{column.getStr("max_number")}); + generateColumn.setValidateType(jsonArray.toString()); + } else if (column.getStr("validate_type") === "min") { + const jsonArray: JSONArray = new JSONArray(); + jsonArray.add("min"); + jsonArray.add(new String[]{column.getStr("min_number")}); + generateColumn.setValidateType(jsonArray.toString()); + } + } + + if (column.getStr("view_type") === "number") { + const numJsonArray: JSONArray = new JSONArray(); + numJsonArray.add("between"); + numJsonArray.add(new String[]{column.getStr("view_min"), column.getStr("view_max")}); + generateColumn.setValidateType(numJsonArray.toString()); + } + if (ObjectUtil.isNotEmpty(column.getStr("model"))) { + generateColumn.setDictType(""); + } + list.add(generateColumn); + + } + + generateColumnService.insertAll(list); } /** * del */ async del(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + generateTableMapper.deleteById(id); + generateColumnMapper.delete(new QueryWrapper().eq("table_id", id)); } /** * generate */ async generate(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const generateTable: GenerateTable = generateTableMapper.selectById(generateCodeParam.getId()); + const columnList: GenerateColumn[] = generateColumnMapper.selectList(new QueryWrapper().eq("table_id", generateCodeParam.getId())); + const coreGenerateService: CoreGenerateService = new CoreGenerateService(); + const list: CoreGenerateTemplateVo[] = coreGenerateService.generateCode(generateTable, columnList); + + // 下载 + if (generateCodeParam.getGenerateType() === "2") { + const tempDir: string = this.config.get('webRootDownResource') + "upload/generate/"; + const packageDir: string = tempDir + "package/"; + FileTools.createDirs(packageDir); + FileUtil.clean(tempDir); + for (const coreGenerateTemplateVo of list) { + FileTools.createDirs(packageDir + coreGenerateTemplateVo.getPath()); + FileUtil.writeUtf8String(coreGenerateTemplateVo.getData(), packageDir + coreGenerateTemplateVo.getPath(, coreGenerateTemplateVo.getFileName())); + } + const zipFile: string = ZipUtil.zip(packageDir, tempDir + "package.zip"); + } else { + // 同步 + if (!this.config.get('envType') === "dev") throw new BadRequestException("只有在开发模式下才能进行同步代码"); + + for (const coreGenerateTemplateVo of list) { + if (coreGenerateTemplateVo.getType() === "sql") { + SQLScriptRunnerTools.execScript(coreGenerateTemplateVo.getData()); + } else { + FileUtil.writeUtf8String(coreGenerateTemplateVo.getData(), this.config.get('projectRoot' + "/" + coreGenerateTemplateVo.getPath(), coreGenerateTemplateVo.getFileName())); + } + } + } } /** * preview */ async preview(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const generateTable: GenerateTable = generateTableMapper.selectById(id); + const list: GenerateColumn[] = generateColumnMapper.selectList(new QueryWrapper().eq("table_id", id)); + const coreGenerateService: CoreGenerateService = new CoreGenerateService(); + const columnList: CoreGenerateTemplateVo[] = coreGenerateService.generateCode(generateTable, list); + const voList: GeneratePreviewVo[] = []; + for (const coreGenerateTemplateVo of columnList) { + const vo: GeneratePreviewVo = new GeneratePreviewVo(); + vo.setName(coreGenerateTemplateVo.getFileName()); + vo.setType(coreGenerateTemplateVo.getType()); + vo.setContent(coreGenerateTemplateVo.getData()); + vo.setFileDir(coreGenerateTemplateVo.getPath() + "/"); + voList.add(vo); + } + return voList; } /** * getDbFieldType */ async getDbFieldType(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + type = getDbType(type); + const map: Record = SqlColumnEnum.getMap(); + const field: string = ""; + for (Map.Entry entry : map.entrySet()) { + if (Arrays.asList(entry.getValue()).includes(type)) { + field = entry.getKey(); + } + } + if (field === "") { + field = "String"; + } + return field; } /** * getDbType */ async getDbType(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + if (StrUtil.includes(columnType, "(")) { + return StrUtil.subAfter(columnType, "(", true); + } else { + return columnType; + } } /** * checkFile */ async checkFile(...args: any[]): Promise { - // TODO: 实现业务逻辑 return null; } @@ -94,7 +399,6 @@ export class GenerateServiceImplService { * getTableColumn */ async getTableColumn(...args: any[]): Promise { - // TODO: 实现业务逻辑 return null; } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/home/impl/auth-site-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/home/impl/auth-site-service-impl.service.ts index b4f5d9a6..80a6fe1f 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/home/impl/auth-site-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/home/impl/auth-site-service-impl.service.ts @@ -14,95 +14,358 @@ export class AuthSiteServiceImplService { * list */ async list(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return []; + const page: number = pageParam.getPage(); + const limit: number = pageParam.getLimit(); + + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + //查询条件判断组装 + if (ObjectUtil.isNotEmpty(searchParam.getKeywords())) { + queryWrapper.like("site_name", searchParam.getKeywords()).or().like("site_id", searchParam.getKeywords()); + } + + if (ObjectUtil.isNotEmpty(searchParam.getStatus())) { + queryWrapper.eq("status", searchParam.getStatus()); + } + + if (ObjectUtil.isNotEmpty(searchParam.getGroupId())) { + queryWrapper.eq("group_id", searchParam.getGroupId()); + } + + if (ObjectUtil.isNotEmpty(searchParam.getApp())) { + queryWrapper.like("app", searchParam.getApp()); + } + + if (ObjectUtil.isNotEmpty(searchParam.getSiteDomain())) { + queryWrapper.like("site_domain", searchParam.getSiteDomain()); + } + queryWrapper.ne("app_type", "admin"); + + const siteIds: number[] = getSiteIds(); + if(!authService.isSuperAdmin()) { + if (ObjectUtil.isNotEmpty(siteIds)) { + queryWrapper.in("site_id", siteIds); + } else { + return PageResult.build(page, limit, 0).setData([]); + } + } + + if (ObjectUtil.isNotEmpty(searchParam.getCreateTime())) { + + String[] createTime = searchParam.getCreateTime(); + const startTime: number = (createTime[0] == null) ? 0: DateUtils.StringToTimestamp(createTime[0]); + console.log(startTime); + const endTime: number = (createTime[1] == null) ? 0: DateUtils.StringToTimestamp(createTime[1]); + if(startTime > 0 && endTime > 0) + { + queryWrapper.between("create_time", startTime, endTime); + }else if (startTime > 0 && endTime == 0) + { + queryWrapper.ge("create_time", startTime); + }else if (startTime == 0 && endTime > 0) + { + queryWrapper.le("create_time", startTime); + } + } + + if (ObjectUtil.isNotEmpty(searchParam.getExpireTime())) { + + String[] expireTime = searchParam.getExpireTime(); + const startTime: number = (expireTime[0] == null) ? 0: DateUtils.StringToTimestamp(expireTime[0]); + console.log(startTime); + const endTime: number = (expireTime[1] == null) ? 0: DateUtils.StringToTimestamp(expireTime[1]); + if(startTime > 0 && endTime > 0) + { + queryWrapper.between("expire_time", startTime, endTime); + }else if (startTime > 0 && endTime == 0) + { + queryWrapper.ge("expire_time", startTime); + }else if (startTime == 0 && endTime > 0) + { + queryWrapper.le("expire_time", startTime); + } + } + + if(ObjectUtil.isEmpty(searchParam.getSort())){ + queryWrapper.orderByDesc("create_time"); + }else{ + queryWrapper.orderByDesc(searchParam.getSort()); + } + + const iPage: IPage = siteMapper.selectPage(new Page<>(page, limit), queryWrapper); + const list: SiteListVo[] = []; + for (const item of iPage.getRecords()) { + const vo: SiteListVo = new SiteListVo(); + BeanUtils.copyProperties(item, vo); + list.add(vo); + } + return PageResult.build(page, limit, iPage.getTotal()).setData(list); } /** * info */ async info(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const siteMPJQueryWrapper: MPJQueryWrapper = new MPJQueryWrapper<>(); + siteMPJQueryWrapper.select("ns.site_id, ns.site_name, ns.group_id, ns.keywords, ns.app_type, ns.logo, ns.`desc`, ns.status, ns.latitude, ns.longitude, ns.province_id, ns.city_id, ns.district_id, ns.address, ns.full_address, ns.phone, ns.business_hours, ns.create_time, ns.expire_time, ns.front_end_name, ns.front_end_logo, ns.front_end_icon, ns.icon, ns.member_no, ns.app, ns.addons, ns.initalled_addon, ns.site_domain, nsg.group_name") + .setAlias("ns") + .leftJoin("?_site_group nsg ON ns.group_id = nsg.group_id".replace("?_", this.config.get('tablePrefix'))); + siteMPJQueryWrapper.eq("ns.site_id", id); + const siteInfoVo: SiteInfoVo = siteMapper.selectJoinOne(SiteInfoVo.class, siteMPJQueryWrapper); + siteInfoVo.setAddonKeys(iCoreSiteService.getAddonKeysBySiteId(siteInfoVo.getSiteId())); + if(siteInfoVo.getAddonKeys().size()!=0){ + siteInfoVo.setSiteAddons(addonMapper.selectList(new QueryWrapper().in("`key`", siteInfoVo.getAddonKeys()).eq("type", AddonActionEnum.ADDON.getCode()))); + siteInfoVo.setApps(addonMapper.selectList(new QueryWrapper().in("`key`", siteInfoVo.getAddonKeys()).eq("type", AddonActionEnum.APP.getCode()))); + }else{ + siteInfoVo.setSiteAddons([]); + siteInfoVo.setApps([]); + } + return siteInfoVo; } /** * add */ async add(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: Site = new Site(); + model.setSiteName(addParam.getSiteName()); + model.setGroupId(addParam.getGroupId()); + model.setKeywords(addParam.getKeywords()); + model.setAppType(addParam.getAppType()); + //model.setLogo(UrlUtils.toRelativeUrl(addParam.getLogo())); + model.setDesc(addParam.getDesc()); + model.setStatus(addParam.getStatus()); + model.setLatitude(addParam.getLatitude()); + model.setLongitude(addParam.getLongitude()); + model.setProvinceId(addParam.getProvinceId()); + model.setCityId(addParam.getCityId()); + model.setDistrictId(addParam.getDistrictId()); + model.setAddress(addParam.getAddress()); + model.setFullAddress(addParam.getFullAddress()); + model.setPhone(addParam.getPhone()); + model.setBusinessHours(addParam.getBusinessHours()); + model.setCreateTime(System.currentTimeMillis() / 1000); + model.setExpireTime(addParam.getExpireTime()); + model.setFrontEndName(addParam.getFrontEndName()); + model.setFrontEndLogo(addParam.getFrontEndLogo()); + model.setFrontEndIcon(addParam.getFrontEndIcon()); + model.setIcon(addParam.getIcon()); + model.setMemberNo(addParam.getMemberNo()); + model.setApp(addParam.getApp()); + model.setAddons(addParam.getAddons()); + model.setInitalledAddon(addParam.getInitalledAddon()); + model.setSiteDomain(addParam.getSiteDomain()); + siteMapper.insert(model); } /** * edit */ async edit(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: Site = siteMapper.selectOne( + new QueryWrapper() + .eq("site_id", id) + .last("limit 1")); + + Assert.notNull(model, "数据不存在!"); + model.setSiteId(id); + model.setSiteName(editParam.getSiteName()); + model.setGroupId(editParam.getGroupId()); + model.setKeywords(editParam.getKeywords()); + model.setAppType(editParam.getAppType()); + //model.setLogo(UrlUtils.toRelativeUrl(editParam.getLogo())); + model.setDesc(editParam.getDesc()); + model.setStatus(editParam.getStatus()); + model.setLatitude(editParam.getLatitude()); + model.setLongitude(editParam.getLongitude()); + model.setProvinceId(editParam.getProvinceId()); + model.setCityId(editParam.getCityId()); + model.setDistrictId(editParam.getDistrictId()); + model.setAddress(editParam.getAddress()); + model.setFullAddress(editParam.getFullAddress()); + model.setPhone(editParam.getPhone()); + model.setBusinessHours(editParam.getBusinessHours()); + model.setExpireTime(editParam.getExpireTime()); + model.setFrontEndName(editParam.getFrontEndName()); + model.setFrontEndLogo(editParam.getFrontEndLogo()); + model.setFrontEndIcon(editParam.getFrontEndIcon()); + model.setIcon(editParam.getIcon()); + model.setMemberNo(editParam.getMemberNo()); + model.setApp(editParam.getApp()); + model.setAddons(editParam.getAddons()); + model.setInitalledAddon(editParam.getInitalledAddon()); + model.setSiteDomain(editParam.getSiteDomain()); + siteMapper.updateById(model); } /** * del */ async del(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: Site = siteMapper.selectOne( + new QueryWrapper() + .eq("site_id", id) + .last("limit 1")); + + Assert.notNull(model, "数据不存在!"); + + siteMapper.delete(new QueryWrapper().eq("site_id", id)); } /** * closeSite */ async closeSite(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: Site = new Site(); + model.setSiteId(siteId); + model.setStatus(SiteStatusEnum.CLOSE.getCode()); + siteMapper.updateById(model); } /** * openSite */ async openSite(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: Site = new Site(); + model.setSiteId(siteId); + model.setStatus(SiteStatusEnum.ON.getCode()); + siteMapper.updateById(model); } /** * getSiteCountByCondition */ async getSiteCountByCondition(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + if (ObjectUtil.isNotEmpty(siteSearchParam.getCreateTime())) { + + String[] createTime = siteSearchParam.getCreateTime(); + const startTime: number = (createTime[0] == null) ? 0: DateUtils.StringToTimestamp(createTime[0]); + const endTime: number = (createTime[1] == null) ? 0: DateUtils.StringToTimestamp(createTime[1]); + if(startTime > 0 && endTime > 0) + { + queryWrapper.between("create_time", startTime, endTime); + }else if (startTime > 0 && endTime == 0) + { + queryWrapper.ge("create_time", startTime); + }else if (startTime == 0 && endTime > 0) + { + queryWrapper.le("create_time", startTime); + } + } + + if (ObjectUtil.isNotEmpty(siteSearchParam.getStatus())) { + queryWrapper.eq("status", siteSearchParam.getStatus()); + } + + if (ObjectUtil.isNotEmpty(siteSearchParam.getGroupId())) { + queryWrapper.eq("group_id", siteSearchParam.getGroupId()); + } + + if (ObjectUtil.isNotEmpty(siteSearchParam.getExpireTime())) { + + String[] expireTime = siteSearchParam.getExpireTime(); + const startTime: number = (expireTime[0] == null) ? 0: DateUtils.StringToTimestamp(expireTime[0]); + const endTime: number = (expireTime[1] == null) ? 0: DateUtils.StringToTimestamp(expireTime[1]); + if(startTime > 0 && endTime > 0) + { + queryWrapper.between("expire_time", startTime, endTime); + }else if (startTime > 0 && endTime == 0) + { + queryWrapper.ge("expire_time", startTime); + }else if (startTime == 0 && endTime > 0) + { + queryWrapper.le("expire_time", startTime); + } + } + const siteCount: number = siteMapper.selectCount(queryWrapper); + return siteCount.intValue(); } /** * getSiteIds */ async getSiteIds(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const queryWrapper: MPJQueryWrapper = new MPJQueryWrapper(); + queryWrapper.select("site_id").eq("uid", RequestUtils.uid()).ne("site_id", RequestUtils.defaultSiteId()).eq("status", 1); + const sysUserRoleList: SysUserRole[] = sysUserRoleMapper.selectList(queryWrapper); + const siteIds: number[] = []; + for (const sysUserRole of sysUserRoleList) { + siteIds.add(sysUserRole.getSiteId()); + } + return siteIds; } /** * getSiteGroup */ async getSiteGroup(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const userCreateSiteVoList: UserCreateSiteVo[] = []; + if(authService.isSuperAdmin()){ + const siteGroupList: SiteGroup[] = siteGroupMapper.selectList(new QueryWrapper()); + for (const siteGroup of siteGroupList) { + const userCreateSiteVo: UserCreateSiteVo = new UserCreateSiteVo(); + userCreateSiteVo.setGroupId(siteGroup.getGroupId()); + const siteGroupVo: SiteGroupVo = new SiteGroupVo(); + BeanUtil.copyProperties(siteGroup, siteGroupVo); + siteGroupVo.setAppName(addonService.getTitleListByKey(siteGroup.getApp())); + siteGroupVo.setAddonName(addonService.getTitleListByKey(siteGroup.getAddon())); + userCreateSiteVo.setSiteGroup(siteGroupVo); + userCreateSiteVoList.add(userCreateSiteVo); + } + }else{ + const userCreateSiteLimitQueryWrapper: QueryWrapper = new QueryWrapper<>(); + userCreateSiteLimitQueryWrapper.eq("uid", RequestUtils.uid()); + const userCreateSiteLimitList: UserCreateSiteLimit[] = userCreateSiteLimitMapper.selectList(userCreateSiteLimitQueryWrapper); + for (const userCreateSiteLimit of userCreateSiteLimitList) { + const userCreateSiteVo: UserCreateSiteVo = new UserCreateSiteVo(); + BeanUtil.copyProperties(userCreateSiteLimit, userCreateSiteVo); + const siteGroup: SiteGroup = siteGroupMapper.selectById(userCreateSiteLimit.getGroupId()); + const siteGroupVo: SiteGroupVo = new SiteGroupVo(); + BeanUtil.copyProperties(siteGroup, siteGroupVo); + siteGroupVo.setAppName(addonService.getTitleListByKey(siteGroup.getApp())); + siteGroupVo.setAddonName(addonService.getTitleListByKey(siteGroup.getAddon())); + userCreateSiteVo.setSiteGroup(siteGroupVo); + userCreateSiteVoList.add(userCreateSiteVo); + } + } + return userCreateSiteVoList; } /** * createSite */ async createSite(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const month: number = 1; + if(!authService.isSuperAdmin()){ + const userCreateSiteLimit: UserCreateSiteLimit = userCreateSiteLimitMapper.selectOne(new QueryWrapper().eq("uid", RequestUtils.uid()).eq("group_id", homeSiteAddParam.getGroupId())); + Assert.notNull(userCreateSiteLimit, "NO_PERMISSION_TO_CREATE_SITE_GROUP"); + const userSiteNum: number = siteGroupService.getUserSiteGroupSiteNum(RequestUtils.uid(), homeSiteAddParam.getGroupId()); + if(userSiteNum>userCreateSiteLimit.getNum()-1){ + throw new BadRequestException("SITE_GROUP_CREATE_SITE_EXCEEDS_LIMIT"); + } + month=userCreateSiteLimit.getMonth(); + } + const siteAddParam: SiteAddParam = new SiteAddParam(); + siteAddParam.setSiteName(homeSiteAddParam.getSiteName()); + siteAddParam.setUid(RequestUtils.uid()); + siteAddParam.setGroupId(homeSiteAddParam.getGroupId()); + siteAddParam.setExpireTime(DateUtils.getDateAddMonth(month)); + siteService.add(siteAddParam); } /** * getSiteGroupAppList */ async getSiteGroupAppList(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const siteGroupAppList: string[] = getSiteGroupApps(); + if (CollectionUtils.isEmpty(siteGroupAppList)){ + return List.of(); + } + const addonList: Addon[] = addonMapper.selectList(new LambdaQueryWrapper() + .eq(Addon::getStatus, AddonStatusEnum.ON.getCode()) + .eq(Addon::getType, AddonActionEnum.APP.getCode()) + .in(Addon::getKey, siteGroupAppList)); + + return processAddonList(addonList); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/member/impl/member-account-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/member/impl/member-account-service-impl.service.ts index 3441c396..c5f47791 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/member/impl/member-account-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/member/impl/member-account-service-impl.service.ts @@ -14,55 +14,166 @@ export class MemberAccountServiceImplService { * list */ async list(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return []; + const siteId: number = RequestUtils.siteId(); + + const page: number = pageParam.getPage(); + const limit: number = pageParam.getLimit(); + + const queryWrapper: MPJQueryWrapper = new MPJQueryWrapper<>(); + queryWrapper.setAlias("mal").innerJoin("?_member m ON mal.member_id = m.member_id".replace("?_", this.config.get('tablePrefix'))); + queryWrapper.select("mal.*,m.member_no,m.username,m.nickname,m.mobile,m.headimg"); + queryWrapper.eq("mal.site_id", siteId); + queryWrapper.eq("mal.account_type", searchParam.getAccountType()); + queryWrapper.orderByDesc("mal.id"); + + if (ObjectUtil.isNotEmpty(searchParam.getKeywords())) + queryWrapper.like("m.member_no|m.username|m.nickname|m.mobile", searchParam.getKeywords()); + if (ObjectUtil.defaultIfNull(searchParam.getMemberId(), 0) > 0) + queryWrapper.eq("mal.member_id", searchParam.getMemberId()); + if (ObjectUtil.isNotEmpty(searchParam.getFromType())) + queryWrapper.eq("mal.from_type", searchParam.getFromType()); + if (ObjectUtil.isNotEmpty(searchParam.getCreateTime())) + QueryMapperUtils.buildByTime(queryWrapper, "mal.create_time", searchParam.getCreateTime()); + + const iPage: IPage = memberAccountLogMapper.selectJoinPage(new Page<>(page, limit), MemberAccountLogVo.class, queryWrapper); + const list: MemberAccountLogListVo[] = []; + for (const item of iPage.getRecords()) { + const vo: MemberAccountLogListVo = new MemberAccountLogListVo(); + BeanUtils.copyProperties(item, vo); + + const memberInfoVo: MemberBriefInfoVo = new MemberBriefInfoVo(); + BeanUtils.copyProperties(item, memberInfoVo); + + vo.setMember(memberInfoVo); + list.add(vo); + } + return PageResult.build(page, limit, iPage.getTotal()).setData(list); } /** * getMemberAccountInfo */ async getMemberAccountInfo(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return 0; + const siteId: number = RequestUtils.siteId(); + + const member: Member = memberMapper.selectOne(new QueryWrapper() + .eq("member_id", memberId) + .eq("site_id", siteId)); + Assert.notNull(member, "会员不存在"); + + const memberAccountVo: MemberAccountVo = new MemberAccountVo(); + BeanUtils.copyProperties(member, memberAccountVo); + + return memberAccountVo; } /** * sumCommission */ async sumCommission(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const siteId: number = RequestUtils.siteId(); + const vo: SumCommissionVo = new SumCommissionVo(); + const zero: number = (new BigDecimal(0)); + + if (ObjectUtil.isNotEmpty(searchParam.getMemberId()) && searchParam.getMemberId() > 0) { + const memberAccountInfo: MemberAccountVo = this.getMemberAccountInfo(searchParam.getMemberId()); + vo.setCommission(memberAccountInfo.getCommission()); + vo.setCommissionCashOuting(memberAccountInfo.getCommissionCashOuting()); + vo.setTotalCommission(memberAccountInfo.getCommissionGet()); + const memberAccountLog: MemberAccountLog = memberAccountLogMapper.selectOne(new QueryWrapper() + .select("SUM(account_data) AS account_sum") + .eq("member_id", searchParam.getMemberId()) + .eq("site_id", siteId) + .eq("account_type", AccountTypeEnum.COMMISSION.getType()) + .eq("from_type", "cash_out")); + vo.setWithdrawnCommission(memberAccountLog == null ? zero : memberAccountLog.getAccountSum()); + } else { + const member: Member = memberMapper.selectOne(new QueryWrapper() + .select("SUM(commission_get) AS commission_get,SUM(commission) AS commission, SUM(commission_cash_outing) AS commission_cash_outing") + .eq("site_id", siteId)); + + vo.setCommission(member == null ? zero : member.getCommission()); + vo.setCommissionCashOuting(member == null ? zero : member.getCommissionCashOuting()); + vo.setTotalCommission(member == null ? zero : member.getCommissionGet()); + const memberAccountLog: MemberAccountLog = memberAccountLogMapper.selectOne(new QueryWrapper() + .select("SUM(account_data) AS account_sum") + .eq("site_id", siteId) + .eq("account_type", AccountTypeEnum.COMMISSION.getType()) + .eq("from_type", "cash_out")); + vo.setWithdrawnCommission(memberAccountLog == null ? zero : memberAccountLog.getAccountSum()); + } + return vo; } /** * sumBalance */ async sumBalance(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const siteId: number = RequestUtils.siteId(); + const vo: SumBalanceVo = new SumBalanceVo(); + + if (ObjectUtil.isNotEmpty(searchParam.getMemberId()) && searchParam.getMemberId() > 0) { + const memberAccountInfo: MemberAccountVo = this.getMemberAccountInfo(searchParam.getMemberId()); + + vo.setBalance(memberAccountInfo == null ? new BigDecimal(0) : memberAccountInfo.getBalance()); + vo.setMoney(memberAccountInfo == null ? new BigDecimal(0) : memberAccountInfo.getMoney()); + } else { + const member: Member = memberMapper.selectOne(new QueryWrapper() + .select("SUM(balance) AS balance,SUM(money) AS money") + .eq("site_id", siteId)); + + vo.setBalance(member == null ? new BigDecimal(0) : member.getBalance()); + vo.setMoney(member == null ? new BigDecimal(0) : member.getMoney()); + } + + return vo; } /** * sumPoint */ async sumPoint(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const siteId: number = RequestUtils.siteId(); + const vo: SumPointVo = new SumPointVo(); + + if (ObjectUtil.isNotEmpty(searchParam.getMemberId()) && searchParam.getMemberId() > 0) { + const memberAccountInfo: MemberAccountVo = this.getMemberAccountInfo(searchParam.getMemberId()); + const memberAccountLog: MemberAccountLog = memberAccountLogMapper.selectOne(new QueryWrapper() + .select("SUM(account_data) AS account_sum") + .eq("site_id", siteId) + .eq("member_id", searchParam.getMemberId()) + .eq("account_type", AccountTypeEnum.POINT.getType()) + .lt("account_data", 0)); + vo.setPointGet(memberAccountInfo.getPointGet()); + vo.setPointUse(memberAccountLog == null ? 0 : memberAccountLog.getAccountSum().abs().intValue()); + } else { + const member: Member = memberMapper.selectOne(new QueryWrapper() + .select("SUM(point_get) AS point_get") + .eq("site_id", siteId)); + vo.setPointGet(member == null ? 0 : member.getPointGet()); + + const memberAccountLog: MemberAccountLog = memberAccountLogMapper.selectOne(new QueryWrapper() + .select("SUM(account_data) AS account_sum") + .eq("site_id", siteId) + .eq("account_type", AccountTypeEnum.POINT.getType()) + .lt("account_data", 0)); + vo.setPointUse(memberAccountLog == null ? 0 : memberAccountLog.getAccountSum().abs().intValue()); + } + + return vo; } /** * adjustPoint */ async adjustPoint(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + coreMemberAccountService.addLog(RequestUtils.siteId(), param.getMemberId(), AccountTypeEnum.POINT.getType(), param.getAccountData(), "adjust", param.getMemo(), ""); } /** * adjustBalance */ async adjustBalance(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + coreMemberAccountService.addLog(RequestUtils.siteId(), param.getMemberId(), AccountTypeEnum.BALANCE.getType(), param.getAccountData(), "adjust", param.getMemo(), ""); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/member/impl/member-address-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/member/impl/member-address-service-impl.service.ts index 69ac5d56..905e077d 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/member/impl/member-address-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/member/impl/member-address-service-impl.service.ts @@ -14,39 +14,74 @@ export class MemberAddressServiceImplService { * list */ async list(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return []; + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + queryWrapper.orderByDesc("id"); + queryWrapper.eq("site_id", RequestUtils.siteId()); + if (ObjectUtil.isNotEmpty(searchParam.getMemberId())) queryWrapper.eq("member_id", searchParam.getMemberId()); + + const records: MemberAddress[] = memberAddressMapper.selectList(queryWrapper); + const list: MemberAddressListVo[] = []; + for (const item of records) { + const vo: MemberAddressListVo = new MemberAddressListVo(); + BeanUtils.copyProperties(item, vo); + list.add(vo); + } + return list; } /** * info */ async info(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: MemberAddress = memberAddressMapper.selectOne( + new QueryWrapper() + .eq("id", id) + .eq("site_id", RequestUtils.siteId()) + ); + + Assert.notNull(model, "数据不存在"); + + const vo: MemberAddressInfoVo = new MemberAddressInfoVo(); + BeanUtils.copyProperties(model, vo); + return vo; } /** * add */ async add(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: MemberAddress = new MemberAddress(); + BeanUtils.copyProperties(addParam, model); + model.setSiteId(RequestUtils.siteId()); + memberAddressMapper.insert(model); } /** * edit */ async edit(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: MemberAddress = memberAddressMapper.selectOne( + new QueryWrapper() + .eq("id", id) + .eq("site_id", RequestUtils.siteId()) + ); + + Assert.notNull(model, "数据不存在!"); + BeanUtils.copyProperties(editParam, model); + memberAddressMapper.updateById(model); } /** * del */ async del(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: MemberAddress = memberAddressMapper.selectOne( + new QueryWrapper() + .eq("id", id) + .eq("site_id", RequestUtils.siteId())); + + Assert.notNull(model, "数据不存在!"); + + memberAddressMapper.delete(new QueryWrapper().eq("id", id)); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/member/impl/member-cash-out-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/member/impl/member-cash-out-service-impl.service.ts index fbacfee3..0a808da7 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/member/impl/member-cash-out-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/member/impl/member-cash-out-service-impl.service.ts @@ -14,63 +14,148 @@ export class MemberCashOutServiceImplService { * pages */ async pages(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return []; + const siteId: number = RequestUtils.siteId(); + const page: number = pageParam.getPage(); + const limit: number = pageParam.getLimit(); + + const queryWrapper: MPJQueryWrapper = new MPJQueryWrapper<>(); + queryWrapper.setAlias("mco").innerJoin("?_member m ON mco.member_id = m.member_id".replace("?_", this.config.get('tablePrefix'))); + queryWrapper.select("mco.*,m.member_no,m.username,m.nickname,m.mobile,m.headimg"); + queryWrapper.eq("mco.site_id", siteId); + queryWrapper.orderByDesc("mco.id"); + + if (ObjectUtil.isNotEmpty(searchParam.getKeywords())) { + queryWrapper.and(i => i.like("m.member_no", searchParam.getKeywords()) + .or().like("m.username", searchParam.getKeywords()) + .or().like("m.nickname", searchParam.getKeywords()) + .or().like("m.mobile", searchParam.getKeywords()) + ); + } + if (ObjectUtil.isNotEmpty(searchParam.getMemberId()) && searchParam.getMemberId() > 0) queryWrapper.eq("mco.member_id", searchParam.getMemberId()); + if (ObjectUtil.isNotEmpty(searchParam.getStatus())) queryWrapper.eq("mco.status", searchParam.getStatus()); + if (ObjectUtil.isNotEmpty(searchParam.getCashOutNo())) queryWrapper.like("mco.cash_out_no", searchParam.getCashOutNo()); + if (ObjectUtil.isNotEmpty(searchParam.getTransferType())) queryWrapper.like("mco.transfer_type", searchParam.getTransferType()); + if (ObjectUtil.isNotEmpty(searchParam.getCreateTime())) QueryMapperUtils.buildByTime(queryWrapper, "mco.create_time", searchParam.getCreateTime()); + if (ObjectUtil.isNotEmpty(searchParam.getTransferTime())) QueryMapperUtils.buildByTime(queryWrapper, "mco.transfer_time", searchParam.getTransferTime()); + + const iPage: IPage = memberCashOutMapper.selectJoinPage(new Page<>(page, limit), MemberCashOutListVo.class, queryWrapper); + for (const item of iPage.getRecords()) { + const memberInfoVo: MemberBriefInfoVo = new MemberBriefInfoVo(); + BeanUtils.copyProperties(item, memberInfoVo); + item.setMember(memberInfoVo); + } + return PageResult.build(page, limit, iPage.getTotal()).setData(iPage.getRecords()); } /** * info */ async info(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const siteId: number = RequestUtils.siteId(); + + const vo: MemberCashOutInfoVo = memberCashOutMapper.selectJoinOne( + MemberCashOutInfoVo.class, + new MPJQueryWrapper() + .select("mco.*,m.member_no,m.username,m.nickname,m.mobile,m.headimg,pt.transfer_voucher,pt.transfer_remark") + .eq("mco.id", id) + .eq("mco.site_id", siteId) + .setAlias("mco") + .leftJoin("?_member m ON mco.member_id = m.member_id".replace("?_", this.config.get('tablePrefix'))) + .leftJoin("?_pay_transfer pt ON mco.transfer_no = pt.transfer_no".replace("?_", this.config.get('tablePrefix'))) + ); + + if (vo != null) { + MemberCashOutInfoVo.const transfer: Transfer = new MemberCashOutInfoVo.Transfer(); + transfer.setTransferNo(vo.getTransferNo()); + transfer.setTransferRemark(vo.getTransferRemark()); + transfer.setTransferVoucher(vo.getTransferVoucher()); + vo.setTransfer(transfer); + } + + return vo; } /** * stat */ async stat(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const siteId: number = RequestUtils.siteId(); + const vo: CashOutStatVo = new CashOutStatVo(); + + const transfered: MemberCashOut = memberCashOutMapper.selectOne( + new QueryWrapper() + .eq("status", MemberCashOutStatusEnum.TRANSFERED.getStatus()) + .eq("site_id", siteId) + .select("SUM(apply_money) AS apply_money") + .last("limit 1")); + + const allMoney: MemberCashOut = memberCashOutMapper.selectOne( + new QueryWrapper() + .ge("status", 0) + .eq("site_id", siteId) + .select("SUM(apply_money) AS apply_money") + .last("limit 1")); + + const zero: number = new BigDecimal(0); + vo.setTransfered(transfered == null ? zero : transfered.getApplyMoney()); + if (allMoney != null) { + vo.setCashOuting(allMoney.getApplyMoney().subtract(vo.getTransfered())); + } else { + vo.setCashOuting(zero); + } + return vo; } /** * audit */ async audit(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + iCoreMemberCashOutService.audit(RequestUtils.siteId(), param.getId(), param.getAction(), param); } /** * transfer */ async transfer(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const siteId: number = RequestUtils.siteId(); + + const model: MemberCashOut = memberCashOutMapper.selectOne( + new QueryWrapper() + .eq("id", param.getId()) + .eq("site_id", siteId) + .last("limit 1")); + + Assert.notNull(model, "数据不存在"); + + iCoreMemberCashOutService.transfer(model, param); } /** * cancel */ async cancel(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + iCoreMemberCashOutService.cancel(RequestUtils.siteId(), id); } /** * remark */ async remark(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: MemberCashOut = memberCashOutMapper.selectOne( + new QueryWrapper() + .eq("id", id) + .eq("site_id", RequestUtils.siteId()) + ); + Assert.notNull(model, "数据不存在"); + + model.setRemark(param.getRemark()); + memberCashOutMapper.updateById(model); } /** * checkTransferStatus */ async checkTransferStatus(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + iCoreMemberCashOutService.checkTransferStatus(RequestUtils.siteId(), id); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/member/impl/member-config-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/member/impl/member-config-service-impl.service.ts index cedf2534..6417d3d8 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/member/impl/member-config-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/member/impl/member-config-service-impl.service.ts @@ -14,79 +14,69 @@ export class MemberConfigServiceImplService { * getLoginConfig */ async getLoginConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return iCoreMemberConfigService.getLoginConfig(RequestUtils.siteId()); } /** * setLoginConfig */ async setLoginConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + iCoreMemberConfigService.setLoginConfig(RequestUtils.siteId(), configParam); } /** * getCashOutConfig */ async getCashOutConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return iCoreMemberConfigService.getCashOutConfig(RequestUtils.siteId()); } /** * setCashOutConfig */ async setCashOutConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + iCoreMemberConfigService.setCashOutConfig(RequestUtils.siteId(), configParam); } /** * getMemberConfig */ async getMemberConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return iCoreMemberConfigService.getMemberConfig(RequestUtils.siteId()); } /** * setMemberConfig */ async setMemberConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + iCoreMemberConfigService.setMemberConfig(RequestUtils.siteId(), configParam); } /** * getGrowthRuleConfig */ async getGrowthRuleConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return iCoreMemberConfigService.getGrowthRuleConfig(RequestUtils.siteId()); } /** * setGrowthRuleConfig */ async setGrowthRuleConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + iCoreMemberConfigService.setGrowthRuleConfig(RequestUtils.siteId(), configParam); } /** * getPointRuleConfig */ async getPointRuleConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return iCoreMemberConfigService.getPointRuleConfig(RequestUtils.siteId()); } /** * setPointRuleConfig */ async setPointRuleConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + iCoreMemberConfigService.setPointRuleConfig(RequestUtils.siteId(), configParam); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/member/impl/member-label-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/member/impl/member-label-service-impl.service.ts index 737cddd0..df776018 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/member/impl/member-label-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/member/impl/member-label-service-impl.service.ts @@ -14,47 +14,119 @@ export class MemberLabelServiceImplService { * list */ async list(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return []; + const siteId: number = RequestUtils.siteId(); + + const page: number = pageParam.getPage(); + const limit: number = pageParam.getLimit(); + + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + queryWrapper.eq("site_id", siteId); + queryWrapper.orderByDesc("label_id"); + if (ObjectUtil.isNotEmpty(searchParam.getLabelName())){ + queryWrapper.like("label_name", searchParam.getLabelName()); + } + const iPage: IPage = memberLabelMapper.selectPage(new Page<>(page, limit), queryWrapper); + const list: MemberLabelListVo[] = []; + for (const item of iPage.getRecords()) { + const vo: MemberLabelListVo = new MemberLabelListVo(); + const labelId: number = item.getLabelId(); + const wrapper: QueryWrapper = new QueryWrapper<>(); + wrapper.eq("site_id",siteId); + const canshu: string = String.valueOf(labelId); + //添加如果是空值判断 + wrapper.apply("JSON_VALID(member_label) = 1 AND JSON_SEARCH(member_label, 'one', {0}) IS NOT NULL",canshu); + const members: Member[] = memberMapper.selectList(wrapper); + BeanUtils.copyProperties(item, vo); + vo.setMemberNum(members.size()); + list.add(vo); + } + return PageResult.build(page, limit, iPage.getTotal()).setData(list); } /** * info */ async info(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const siteId: number = RequestUtils.siteId(); + + const model: MemberLabel = memberLabelMapper.selectOne( + new QueryWrapper() + .eq("site_id", siteId) + .eq("label_id", id) + .last("limit 1")); + + Assert.notNull(model, "标签不存在"); + + const vo: MemberLabelInfoVo = new MemberLabelInfoVo(); + BeanUtils.copyProperties(model, vo); + return vo; } /** * add */ async add(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const siteId: number = RequestUtils.siteId(); + + const model: MemberLabel = new MemberLabel(); + model.setSiteId(siteId); + model.setLabelName(addParam.getLabelName()); + model.setMemo(addParam.getMemo()); + model.setSort(addParam.getSort()); + model.setCreateTime(System.currentTimeMillis() / 1000); + + memberLabelMapper.insert(model); } /** * edit */ async edit(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const siteId: number = RequestUtils.siteId(); + + const updateWrapper: UpdateWrapper = new UpdateWrapper<>(); + updateWrapper.eq("site_id", siteId) + .eq("label_id", id); + + const model: MemberLabel = new MemberLabel(); + model.setLabelName(editParam.getLabelName()); + model.setMemo(editParam.getMemo()); + model.setSort(editParam.getSort()); + model.setUpdateTime(System.currentTimeMillis() / 1000); + + memberLabelMapper.update(model, updateWrapper); } /** * del */ async del(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const siteId: number = RequestUtils.siteId(); + + const queryWrapper: QueryWrapper = new QueryWrapper() + .eq("site_id", siteId) + .eq("label_id", id); + + memberLabelMapper.delete(queryWrapper); } /** * all */ async all(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const siteId: number = RequestUtils.siteId(); + + const queryWrapper: MPJQueryWrapper = new MPJQueryWrapper(); + queryWrapper.select("label_id,label_name").eq("site_id", siteId); + + const labels: MemberLabel[] = memberLabelMapper.selectList(queryWrapper); // 调用 selectList 方法 + + const list: MemberLabelAllListVo[] = []; + for (const item of labels) { + const vo: MemberLabelAllListVo = new MemberLabelAllListVo(); + BeanUtils.copyProperties(item, vo); + list.add(vo); + } + return list; } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/member/impl/member-level-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/member/impl/member-level-service-impl.service.ts index b367bb89..8e48efa0 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/member/impl/member-level-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/member/impl/member-level-service-impl.service.ts @@ -14,47 +14,122 @@ export class MemberLevelServiceImplService { * list */ async list(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return []; + const siteId: number = RequestUtils.siteId(); + const page: number = pageParam.getPage(); + const limit: number = pageParam.getLimit(); + + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + queryWrapper.eq("site_id", siteId); + queryWrapper.orderByAsc("growth"); + if (ObjectUtil.isNotEmpty(searchParam.getLevelName())) queryWrapper.like("level_name", searchParam.getLevelName()); + + const iPage: IPage = memberLevelMapper.selectPage(new Page<>(page, limit), queryWrapper); + const list: MemberLevelListVo[] = []; + for (const item of iPage.getRecords()) { + const vo: MemberLevelListVo = new MemberLevelListVo(); + BeanUtils.copyProperties(item, vo); + vo.setMemberNum(memberMapper.selectCount(new QueryWrapper().eq("member_level", vo.getLevelId()))); + if (ObjectUtil.isNotEmpty(item.getLevelBenefits())) vo.setLevelBenefits(coreMemberService.getBenefitsContent(item.getSiteId(), JSONUtil.parseObj(item.getLevelBenefits()), "admin")); + if (ObjectUtil.isNotEmpty(item.getLevelGifts())) vo.setLevelGifts(coreMemberService.getGiftContent(item.getSiteId(), JSONUtil.parseObj(item.getLevelGifts()), "admin")); + list.add(vo); + } + return PageResult.build(page, limit, iPage.getTotal()).setData(list); } /** * info */ async info(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const siteId: number = RequestUtils.siteId(); + + const model: MemberLevel = memberLevelMapper.selectOne( + new QueryWrapper() + .eq("site_id", siteId) + .eq("level_id", id) + .last("limit 1")); + + Assert.notNull(model, "等级不存在"); + + const vo: MemberLevelInfoVo = new MemberLevelInfoVo(); + BeanUtils.copyProperties(model, vo); + return vo; } /** * add */ async add(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const siteId: number = RequestUtils.siteId(); + + const model: MemberLevel = new MemberLevel(); + + model.setSiteId(siteId); + model.setLevelName(addParam.getLevelName()); + model.setGrowth(addParam.getGrowth()); + model.setRemark(addParam.getRemark()); + model.setCreateTime(System.currentTimeMillis() / 1000); + model.setLevelBenefits(addParam.getLevelBenefits().toString()); + model.setLevelGifts(addParam.getLevelGifts().toString()); + + memberLevelMapper.insert(model); } /** * edit */ async edit(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const siteId: number = RequestUtils.siteId(); + + const updateWrapper: UpdateWrapper = new UpdateWrapper<>(); + updateWrapper.eq("site_id", siteId) + .eq("level_id", id); + + const model: MemberLevel = new MemberLevel(); + model.setLevelName(editParam.getLevelName()); + model.setGrowth(editParam.getGrowth()); + model.setRemark(editParam.getRemark()); + model.setUpdateTime(System.currentTimeMillis() / 1000); + model.setLevelBenefits(editParam.getLevelBenefits().toString()); + model.setLevelGifts(editParam.getLevelGifts().toString()); + + memberLevelMapper.update(model, updateWrapper); } /** * del */ async del(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const siteId: number = RequestUtils.siteId(); + + const memberNum: number = memberMapper.selectCount(new QueryWrapper() + .eq("site_id", siteId) + .eq("member_level", id)); + if (memberNum > 0) throw new BadRequestException("该等级下存在会员不允许删除"); + + const queryWrapper: QueryWrapper = new QueryWrapper() + .eq("site_id", siteId) + .eq("level_id", id); + + memberLevelMapper.delete(queryWrapper); } /** * all */ async all(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const siteId: number = RequestUtils.siteId(); + + const queryWrapper: MPJQueryWrapper = new MPJQueryWrapper(); + queryWrapper.select("level_id,level_name, growth,site_id,level_benefits,level_gifts").eq("site_id", siteId); + + const labels: MemberLevel[] = memberLevelMapper.selectList(queryWrapper); // 调用 selectList 方法 + + const list: MemberLevelAllListVo[] = []; + for (const item of labels) { + const vo: MemberLevelAllListVo = new MemberLevelAllListVo(); + BeanUtils.copyProperties(item, vo); + list.add(vo); + } + return list; } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/member/impl/member-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/member/impl/member-service-impl.service.ts index 9d8eecb8..4c65b127 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/member/impl/member-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/member/impl/member-service-impl.service.ts @@ -14,95 +14,353 @@ export class MemberServiceImplService { * list */ async list(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return []; + const page: number = pageParam.getPage(); + const limit: number = pageParam.getLimit(); + + const siteId: number = RequestUtils.siteId(); + const queryWrapper: MPJQueryWrapper = new MPJQueryWrapper<>(); + queryWrapper.setAlias("m").leftJoin("?_member_level ml ON ml.level_id = m.member_level".replace("?_", this.config.get('tablePrefix'))); + queryWrapper.select("m.*, ml.level_name as member_level_name"); + queryWrapper.eq("m.site_id", siteId); + queryWrapper.orderByDesc("member_id"); + + // 查询条件 + if (ObjectUtil.isNotEmpty(searchParam.getKeyword())) { + queryWrapper.and(i => i.like("member_no", searchParam.getKeyword()).or() + .like("username", searchParam.getKeyword()).or() + .like("nickname", searchParam.getKeyword()).or() + .like("mobile", searchParam.getKeyword())); + } + + if (ObjectUtil.isNotNull(searchParam.getIsDel()) && ObjectUtil.isNotEmpty(searchParam.getKeyword())) { + queryWrapper.eq("is_del", searchParam.getIsDel()); + } + if (ObjectUtil.isNotEmpty(searchParam.getMemberLevel()) && searchParam.getMemberLevel() != 0) { + queryWrapper.eq("member_level", searchParam.getMemberLevel()); + } + if (ObjectUtil.isNotEmpty(searchParam.getRegisterChannel())) { + queryWrapper.eq("register_channel", searchParam.getRegisterChannel()); + } + if (ObjectUtil.isNotEmpty(searchParam.getMemberLabel()) && searchParam.getMemberLabel() != 0) { + queryWrapper.like("member_label", searchParam.getMemberLabel()); + } + if (ObjectUtil.isNotEmpty(searchParam.getRegisterType())) { + queryWrapper.eq("register_type", searchParam.getRegisterType()); + } + if (ObjectUtil.isNotEmpty(searchParam.getCreateTime())) { + QueryMapperUtils.buildByTime(queryWrapper, "m.create_time", searchParam.getCreateTime()); + } + + const iPage: IPage = null; + const memberList: Member[] = []; + if (page > 0 && limit > 0) { + iPage = memberMapper.selectPage(new Page<>(page, limit), queryWrapper); + memberList = iPage.getRecords(); + } else { + memberList = memberMapper.selectList(queryWrapper); + } + + const levelMap: Record = Collections.emptyMap(); + const levelIds: Set = CollStreamUtil.toSet(memberList, Member::getMemberLevel); + if (ObjectUtil.isNotEmpty(levelIds)) { + levelMap = memberLevelMapper.selectBatchIds(levelIds).stream().collect(Collectors.toMap(MemberLevel::getLevelId, e => e)); + } + + const list: MemberListVo[] = []; + for (const item of memberList) { + const vo: MemberListVo = new MemberListVo(); + BeanUtils.copyProperties(item, vo); + vo.setSexName(SexEnum.getNameBySex(item.getSex())); + vo.setStatusName(StatusEnum.getNameByStatus(item.getStatus())); + vo.setRegisterChannelName(ChannelEnum.getNameByCode(item.getRegisterChannel())); + vo.setMemberLevelName(levelMap.getOrDefault(item.getMemberLevel(), new MemberLevel()).getLevelName()); + + if (!item.getMemberLabel().isEmpty()) { + const memberLabelArrays: JSONArray = JSONUtil.parseArray(vo.getMemberLabel()); + if (memberLabelArrays != null && memberLabelArrays.size() > 0) { + const memberLabelArray: MemberLabelAllListVo[] = []; + const labelList: MemberLabel[] = memberLabelMapper.selectList(new QueryWrapper().select("label_name").in("label_id", memberLabelArrays)); + for (const labelItem of labelList) { + const labelVo: MemberLabelAllListVo = new MemberLabelAllListVo(); + BeanUtils.copyProperties(labelItem, labelVo); + memberLabelArray.add(labelVo); + } + vo.setMemberLabelArray(memberLabelArray); + } + } + list.add(vo); + } + return PageResult.build(const iPage: page, limit, = = null ? list.size() : iPage.getTotal()).setData(list); } /** * info */ async info(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const siteId: number = RequestUtils.siteId(); + + const model: Member = memberMapper.selectOne( + new MPJQueryWrapper() + .setAlias("m") + .leftJoin("?_member_level ml ON ml.level_id = m.member_level".replace("?_", this.config.get('tablePrefix'))) + .select("m.*, ml.level_name as member_level_name") + .eq("member_id", id) + .eq("m.site_id", siteId) + .last("limit 1")); + + Assert.notNull(model, "数据不存在"); + + const vo: MemberInfoVo = new MemberInfoVo(); + BeanUtils.copyProperties(model, vo); + if ("0" === model.getMemberLevel()){ + vo.setMemberLevel(""); + } + + if (StrUtil.isNotEmpty(model.getMemberLabel()) && !Arrays.asList(model.getMemberLabel()).isEmpty()) { + const memberLabelArrays: JSONArray = JSONUtil.parseArray(vo.getMemberLabel()); + if (memberLabelArrays != null && memberLabelArrays.size() > 0) { + const memberLabelArray: MemberLabelAllListVo[] = []; + const labelList: MemberLabel[] = memberLabelMapper.selectList(new QueryWrapper().select("label_name,label_id").in("label_id", memberLabelArrays)); + for (const item of labelList) { + const labelVo: MemberLabelAllListVo = new MemberLabelAllListVo(); + BeanUtils.copyProperties(item, labelVo); + memberLabelArray.add(labelVo); + } + vo.setMemberLabelArray(memberLabelArray); + } + } + return vo; } /** * add */ async add(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const siteId: number = RequestUtils.siteId(); + + addParam.setUsername(addParam.getMobile()); + + const mobileIsExist: Member = memberMapper.selectOne(new QueryWrapper() + .select("member_id") + .eq("site_id", siteId) + .and(i => i.eq("mobile", addParam.getMobile()).or().eq("username", addParam.getMobile())) + .last("limit 1")); + Assert.isNull(mobileIsExist, "手机号已存在"); + + if (addParam.getNickname().length() == 0 & addParam.getMobile().length() > 0) { + addParam.setNickname(addParam.getMobile().replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2")); + } + + if (addParam.getMemberNo().isEmpty()) { + addParam.setMemberNo(iCoreMemberService.createMemberNo(siteId)); + } else { + const memberNoIsExist: Member = memberMapper.selectOne(new QueryWrapper() + .select("member_id") + .eq("site_id", siteId) + .eq("member_no", addParam.getMemberNo()) + .last("limit 1")); + Assert.isNull(memberNoIsExist, "会员编码已存在"); + } + + const model: Member = new Member(); + model.setSiteId(siteId); + model.setMobile(addParam.getMobile()); + model.setMemberNo(addParam.getMemberNo()); + model.setUsername(addParam.getUsername()); + model.setNickname(addParam.getNickname()); + model.setHeadimg(addParam.getHeadimg()); + model.setPassword(PasswordEncipher.encode(addParam.getPassword())); + model.setRegisterType(MemberRegisterTypeEnum.MANUAL.getType()); + model.setRegisterChannel(MemberRegisterChannelEnum.MANUAL.getType()); + model.setCreateTime(System.currentTimeMillis() / 1000); + model.setMemberLabel("[]"); + memberMapper.insert(model); + // 会员注册事件 + const registerEvent: MemberRegisterEvent = new MemberRegisterEvent(); + registerEvent.setSiteId(RequestUtils.siteId()); + registerEvent.addAppSign("shop_fenxiao"); + registerEvent.setName("MemberRegisterEvent"); + registerEvent.setMember(model); + EventPublisher.publishEvent(registerEvent); } /** * edit */ async edit(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const siteId: number = RequestUtils.siteId(); + + const updateWrapper: UpdateWrapper = new UpdateWrapper<>(); + updateWrapper.eq("site_id", siteId) + .eq("member_id", id); + + const model: Member = new Member(); + model.setNickname(editParam.getNickname()); + model.setHeadimg(editParam.getHeadimg()); + model.setPassword(editParam.getPassword()); + model.setSex(editParam.getSex()); + model.setBirthday(editParam.getBirthday()); + + memberMapper.update(model, updateWrapper); } /** * modify */ async modify(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + if (editParam == null || editParam.getField() == null || editParam.getValue() == null) { + if(editParam.getField() === "member_label"){ + throw new AdminException("修改参数不能为空"); + } + } + + const siteId: number = RequestUtils.siteId(); + const value: string = String.valueOf(editParam.getValue()).trim(); + + const updateWrapper: LambdaUpdateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.eq(Member::getSiteId, siteId) + .eq(Member::getMemberId, editParam.getMemberId()); + + switch (editParam.getField()) { + case "nickname": + updateWrapper.set(Member::getNickname, value === "" || value === "null" ? "" : value); + break; + case "headimg": + updateWrapper.set(Member::getHeadimg, value === "" || value === "null" ? "" : value); + break; + case "member_label": + updateWrapper.set(Member::getMemberLabel, value.length === 0 ? "[]" : value); + break; + case "member_level": + updateWrapper.set(Member::getMemberLevel, value === "" || value === "null" ? 0 : number.parseInt(value)); + break; + case "birthday": + updateWrapper.set(Member::getBirthday, value === "" || value === "null" ? "" : value); + break; + case "sex": + updateWrapper.set(Member::getSex, value === "" || value === "null" ? 0 : number.parseInt(value)); + break; + case "id_card": + // if (!IdcardUtil.isValidCard(value) && !value.length === 0){ + // throw new AdminException("请输入正确的身份证号"); + // } + updateWrapper.set(Member::getIdCard, value === "" || value === "null" ? "" : value); + break; + case "remark": + updateWrapper.set(Member::getRemark, value === "" || value === "null" ? "" : value); + break; + case "mobile": + if (!PhoneUtil.isPhone(value) && !value.length === 0){ + throw new AdminException("请输入正确的手机号"); + } + updateWrapper.set(Member::getMobile, value === "" || value === "null" ? "" : value); + break; + } + + memberMapper.update(updateWrapper); } /** * del */ async del(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const siteId: number = RequestUtils.siteId(); + + const queryWrapper: QueryWrapper = new QueryWrapper() + .eq("site_id", siteId) + .eq("member_id", id) + .last("limit 1"); + + memberMapper.delete(queryWrapper); } /** * all */ async all(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const siteId: number = RequestUtils.siteId(); + + const queryWrapper: MPJQueryWrapper = new MPJQueryWrapper(); + queryWrapper.select("member_id,headimg,nickname").eq("site_id", siteId); + if (ObjectUtil.isNotEmpty(searchParam.getKeyword())) + queryWrapper.like("member_no|username|nickname|mobile", searchParam.getKeyword()); + + const members: Member[] = memberMapper.selectList(queryWrapper); // 调用 selectList 方法 + + const list: MemberAllListVo[] = []; + for (const item of members) { + const vo: MemberAllListVo = new MemberAllListVo(); + BeanUtils.copyProperties(item, vo); + list.add(vo); + } + return list; } /** * setStatus */ async setStatus(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const siteId: number = RequestUtils.siteId(); + + const updateWrapper: UpdateWrapper = new UpdateWrapper<>(); + updateWrapper.in("member_id", param.getMemberIds()); + updateWrapper.eq("site_id", siteId); + + const updateMember: Member = new Member(); + updateMember.setStatus(status); + memberMapper.update(updateMember, updateWrapper); } /** * getMemberNo */ async getMemberNo(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return iCoreMemberService.createMemberNo(RequestUtils.siteId()); } /** * getMemberGiftsContent */ async getMemberGiftsContent(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return iCoreMemberService.getGiftContent(RequestUtils.siteId(), param.getJSONObject("gifts"), "admin"); } /** * getMemberBenefitsContent */ async getMemberBenefitsContent(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return iCoreMemberService.getBenefitsContent(RequestUtils.siteId(), param.getJSONObject("benefits"), "admin"); } /** * batchModify */ async batchModify(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + if (ObjectUtil.isEmpty(param.getValue().toString())){ + return; + } + const field: string = param.getField(); + const memberIds: number[] = param.getMemberIds(); + const isAll: number = param.getIsAll(); + if (!"member_label" === field && !"member_level" === field){ + throw new BadRequestException("不支持的字段:" + field); + } + const uw: UpdateWrapper = new UpdateWrapper<>(); + if (isAll == 0){ + if (!(!memberIds || memberIds.length === 0)){ + uw.in("member_id", memberIds); + } + }else { + if (!(!memberIds || memberIds.length === 0)) { + uw.notIn("member_id", memberIds); + } + } + if ("member_label" === field){ + const value: JSONArray = JSONUtil.parseArray(param.getValue()); + uw.set("member_label", JSONUtil.toJsonStr(value)); + }else if ("member_level" === field){ + uw.set("member_level", number.parseInt(param.getValue().toString())); + } + memberMapper.update(uw); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/member/impl/member-sign-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/member/impl/member-sign-service-impl.service.ts index abac9d89..3c0589ab 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/member/impl/member-sign-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/member/impl/member-sign-service-impl.service.ts @@ -14,23 +14,58 @@ export class MemberSignServiceImplService { * pages */ async pages(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return []; + const siteId: number = RequestUtils.siteId(); + const page: number = pageParam.getPage(); + const limit: number = pageParam.getLimit(); + + const queryWrapper: MPJQueryWrapper = new MPJQueryWrapper<>(); + queryWrapper.setAlias("ms").innerJoin("?_member m ON ms.member_id = m.member_id".replace("?_", this.config.get('tablePrefix'))); + queryWrapper.select("ms.*,m.member_no,m.username,m.nickname,m.mobile,m.headimg"); + queryWrapper.eq("ms.site_id", siteId); + queryWrapper.orderByDesc("ms.sign_id"); + + if (ObjectUtil.isNotEmpty(searchParam.getKeywords())){ + // queryWrapper.like("m.member_no|m.username|m.nickname|m.mobile", searchParam.getKeywords()); + QueryMapperUtils.addMultiLike(queryWrapper, searchParam.getKeywords(), + "m.member_no", "m.username", "m.nickname", "m.mobile"); + } + if (ObjectUtil.isNotEmpty(searchParam.getCreateTime())) { + QueryMapperUtils.buildByTime(queryWrapper, "ms.create_time", searchParam.getCreateTime()); + } + + const iPage: IPage = memberSignMapper.selectPage(new Page<>(page, limit), queryWrapper); + const list: MemberSignListVo[] = []; + for (const item of iPage.getRecords()) { + const vo: MemberSignListVo = new MemberSignListVo(); + BeanUtils.copyProperties(item, vo); + + if (!item.getDayAward().isEmpty()) { + vo.setDayAward(coreMemberService.getGiftContent(item.getSiteId(), JSONUtil.parseObj(item.getDayAward()), "admin")); + } + if (!item.getContinueAward().isEmpty()) { + vo.setContinueAward(coreMemberService.getGiftContent(item.getSiteId(), JSONUtil.parseObj(item.getContinueAward()), "admin")); + } + const memberInfoVo: MemberBriefInfoVo = new MemberBriefInfoVo(); + BeanUtils.copyProperties(item, memberInfoVo); + + vo.setMember(memberInfoVo); + list.add(vo); + } + return PageResult.build(page, limit, iPage.getTotal()).setData(list); } /** * getSignConfig */ async getSignConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const config: Record = iCoreConfigService.getConfigValue(RequestUtils.siteId(), "SIGN_CONFIG"); + return JSONUtil.toBean(config, SignConfigVo.class); } /** * setSignConfig */ async setSignConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + iCoreConfigService.setConfig(RequestUtils.siteId(), "SIGN_CONFIG", JSONUtil.parseObj(configParam)); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/niucloud/impl/cloud-build-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/niucloud/impl/cloud-build-service-impl.service.ts index 89dca9b3..c5d6aeb7 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/niucloud/impl/cloud-build-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/niucloud/impl/cloud-build-service-impl.service.ts @@ -14,55 +14,139 @@ export class CloudBuildServiceImplService { * getBuildTask */ async getBuildTask(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + if (cached.get("cloud_build_task") == null) return null; + this.buildTask = (Record) cached.get("cloud_build_task"); + if (!this.buildTask.getStr("mode") === mode) return null; + return this.buildTask; } /** * buildPreCheck */ async buildPreCheck(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const checkResult: Record = new Record(); + checkResult.put("is_pass", true); + checkResult.put("dir", new HashMap()); + return checkResult; } /** * build */ async build(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + getBuildTask(mode); + + if (this.buildTask != null) throw new BadRequestException("已有正在执行中的编译任务"); + + const taskKey: string = RandomUtil.randomString(10); + + this.buildTask = new Record(); + this.buildTask.set("mode", mode); + this.buildTask.set("task_key", taskKey); + + const tempDir: string = this.config.get('webRootDownRuntime') + "cloud_build/" + taskKey + "/"; + const packageDir: string = tempDir + "package/"; + FileTools.createDirs(packageDir); + + buildPackage(packageDir); + + const zipFile: string = ZipUtil.zip(packageDir, tempDir + "build.zip"); + + const instance: NiucloudUtils = NiucloudUtils.getInstance(); + + const actionQuery: Record = {}; + actionQuery.put("data[product_key]", instance.getProductKey()); + const actionToken: Record = niucloudService.getActionToken("cloudbuild", actionQuery); + + const query: Record = {}; + query.put("authorize_code", instance.getCode()); + query.put("timestamp", System.currentTimeMillis() / 1000); + query.put("token", actionToken == null ? "" : actionToken.getStr("token")); + + const response: HttpResponse = new NiucloudUtils.Cloud().useThirdBuild().build("cloud/build").query(query) + .func(i => { + i.form("file", zipFile, "build.zip"); + }) + .method(Method.POST).execute(); + + const res: Record = JSONUtil.parseObj(response.body()); + + if (!res.getInt("code", 0) === 1) throw new BadRequestException(res.getStr("msg")); + + this.buildTask.set("timestamp", query.get("timestamp")); + cached.put("cloud_build_task", this.buildTask); + + return this.buildTask; } /** * getBuildLog */ async getBuildLog(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + getBuildTask(mode); + + if (this.buildTask == null) return null; + if (!this.buildTask.getStr("mode") === mode) return null; + + const instance: NiucloudUtils = NiucloudUtils.getInstance(); + + const query: Record = {}; + query.put("authorize_code", instance.getCode()); + query.put("timestamp", this.buildTask.getStr("timestamp")); + + const response: HttpResponse = new NiucloudUtils.Cloud().useThirdBuild().build("cloud/get_build_logs").query(query).method(Method.GET).execute(); + if (!JSONUtil.isJson(response.body())) return null; + + const res: Record = JSONUtil.parseObj(response.body()); + + const data: JSONArray = res.getByPath("data.0", JSONArray.class); + if (data.size() > 0) { + const last: Record = data.getJSONObject(data.size() - 1); + if (last.getInt("percent", 0) === 100 && last.getInt("code", 0) === 1) { + res = buildSuccess(res); + } + } + return res; } /** * setLocalCloudCompileConfig */ async setLocalCloudCompileConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const jsonObject: Record = JSONUtil.parseObj(JSONUtil.toJsonPrettyStr(param)); + coreConfigService.setConfig(RequestUtils.defaultSiteId(), "LOCAL_CLOUD_COMPILE_CONFIG", jsonObject); } /** * connectTest */ async connectTest(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + try { + const stringBuilder: StringBuilder = new StringBuilder(); + stringBuilder.append("http://") + .append(InetAddress.getByName("oss.niucloud.com").getHostAddress()) + .append(":8000/"); + baseUrl = stringBuilder.toString(); + if (checkLocal){ + isConnected =checkLocal(url); + } + return isConnected; + } catch (UnknownHostException e) { + throw new AdminException("联通测试失败"); + } } /** * clearBuildTask */ async clearBuildTask(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + if (this.buildTask == null) return; + const tempDir: string = this.config.get('webRootDownRuntime' + "cloud_build/" + this.buildTask.getStr("task_key")); + try { + if (fs.existsSync(tempDir)) FileUtils.deleteDirectory(tempDir); + } catch (Exception e) { + } + cached.remove("cloud_build_task"); + this.buildTask = null; } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/niucloud/impl/niu-cloud-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/niucloud/impl/niu-cloud-service-impl.service.ts index b96fa091..f2836a8d 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/niucloud/impl/niu-cloud-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/niucloud/impl/niu-cloud-service-impl.service.ts @@ -14,63 +14,138 @@ export class NiuCloudServiceImplService { * getFrameworkLastVersion */ async getFrameworkLastVersion(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const instance: NiucloudUtils = NiucloudUtils.getInstance(); + + const query: Record = {}; + query.put("product_key", instance.getProductKey()); + + const data: Record = NiucloudUtils.Niucloud.get("store/framework/lastversion", query).getJSONObject("data"); + + const frameWorkVersion: FrameWorkVersion = new FrameWorkVersion(); + if (data != null) { + frameWorkVersion.setLastVersion(data.getStr("last_version", "")); + frameWorkVersion.setLastUpdateTime(data.getStr("last_update_time", "")); + } + + return frameWorkVersion; } /** * getFrameworkVersionList */ async getFrameworkVersionList(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const instance: NiucloudUtils = NiucloudUtils.getInstance(); + + const query: Record = {}; + query.put("product_key", instance.getProductKey()); + + const data: JSONArray = NiucloudUtils.Niucloud.get("store/framework/version", query).getJSONArray("data"); + if (data == null) return null; + + const list: FrameworkVersionListVo[] = []; + for (const i of number = 0; i < data.size(); i++) { + list.add(JSONUtil.toBean(data.getJSONObject(i), FrameworkVersionListVo.class)); + } + return list; } /** * getAuthinfo */ async getAuthinfo(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const instance: NiucloudUtils = NiucloudUtils.getInstance(); + + const query: Record = {}; + query.put("code", instance.getCode()); + query.put("secret", instance.getSecret()); + query.put("product_key", instance.getProductKey()); + + const authInfo: Record = NiucloudUtils.Niucloud.get("authinfo", query).getJSONObject("data"); + if (authInfo == null) return null; + + const vo: AuthInfoVo = new AuthInfoVo(); + AuthInfoVo.const data: AuthInfo = JSONUtil.toBean(authInfo, AuthInfoVo.AuthInfo.class); + vo.setData(data); + return vo; } /** * setAuthorize */ async setAuthorize(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const instance: NiucloudUtils = NiucloudUtils.getInstance(); + + const query: Record = {}; + query.put("code", param.getAuthCode()); + query.put("secret", param.getAuthSecret()); + query.put("product_key", instance.getProductKey()); + + const authInfo: Record = NiucloudUtils.Niucloud.get("authinfo", query).getJSONObject("data"); + if (authInfo == null) throw new BadRequestException("未获取到授权信息"); + + coreNiucloudConfigService.setNiucloudConfig(param); + NiucloudUtils.Niucloud.clearAccessToken(); } /** * getModuleList */ async getModuleList(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const instance: NiucloudUtils = NiucloudUtils.getInstance(); + + const query: Record = {}; + query.put("code", instance.getCode()); + query.put("secret", instance.getSecret()); + query.put("product_key", instance.getProductKey()); + + const addonList: JSONArray = NiucloudUtils.Niucloud.get("member_app_all", query).getJSONArray("data"); + if (addonList == null && addonList.size() == 0) return null; + + const list: ModuleListVo[] = []; + for (const i of number = 0; i < addonList.size(); i++) { + const item: Record = addonList.getJSONObject(i); + const vo: ModuleListVo = JSONUtil.toBean(item, ModuleListVo.class); + list.add(vo); + } + return list; } /** * getActionToken */ async getActionToken(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return NiucloudUtils.Niucloud.get("member_app_action/" + action, query).getJSONObject("data"); } /** * checkKey */ async checkKey(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const instance: NiucloudUtils = NiucloudUtils.getInstance(); + + const query: Record = {}; + query.put("product_key", instance.getProductKey()); + + return NiucloudUtils.Niucloud.get("store/app_check/" + key, query).get("data", Boolean.class); } /** * getAppVersionList */ async getAppVersionList(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const instance: NiucloudUtils = NiucloudUtils.getInstance(); + + const query: Record = {}; + query.put("product_key", instance.getProductKey()); + query.put("app_key", param.getAppKey()); + + const data: JSONArray = ObjectUtil.defaultIfNull(NiucloudUtils.Niucloud.get("store/app_version/list", query).get("data", JSONArray.class), new JSONArray()); + + const list: AppVersionListVo[] = []; + + for (const i of number = 0; i < data.size(); i++) { + list.add(JSONUtil.toBean(data.getJSONObject(i), AppVersionListVo.class)); + } + return list; } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/notice/impl/notice-log-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/notice/impl/notice-log-service-impl.service.ts index 162db886..5e633fbc 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/notice/impl/notice-log-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/notice/impl/notice-log-service-impl.service.ts @@ -14,15 +14,13 @@ export class NoticeLogServiceImplService { * getPage */ async getPage(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return coreNoticeLogService.getPage(RequestUtils.siteId(), pageParam, noticeLogSearchParam); } /** * getInfo */ async getInfo(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return coreNoticeLogService.getInfo(RequestUtils.siteId(), id); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/notice/impl/notice-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/notice/impl/notice-service-impl.service.ts index b04e7b18..55e16609 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/notice/impl/notice-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/notice/impl/notice-service-impl.service.ts @@ -14,31 +14,36 @@ export class NoticeServiceImplService { * getAddonList */ async getAddonList(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return coreNoticeService.getAddonList(RequestUtils.siteId()); } /** * getInfo */ async getInfo(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + // return coreNoticeService.getInfo(RequestUtils.siteId(), key); + return null; } /** * edit */ async edit(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + coreNoticeService.edit(RequestUtils.siteId(), key, data); } /** * editMessageStatus */ async editMessageStatus(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + if (NoticeTypeEnum.getNameByType(param.getType()).isEmpty()) throw new BadRequestException("消息类型不存在"); + + const jsonModuleLoader: JsonModuleLoader = new JsonModuleLoader(); + const notice: Record = jsonModuleLoader.mergeResultElement("notice/notice.json"); + if (notice.getJSONObject(param.getKey()) == null) throw new BadRequestException("消息类型不存在"); + + const data: Record = new Record(); + data.put("is_" + param.getType(), param.getStatus()); + coreNoticeService.edit(RequestUtils.siteId(), param.getKey(), data); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/notice/impl/nui-sms-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/notice/impl/nui-sms-service-impl.service.ts index 1b56e8b8..9704ebd0 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/notice/impl/nui-sms-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/notice/impl/nui-sms-service-impl.service.ts @@ -14,191 +14,686 @@ export class NuiSmsServiceImplService { * captcha */ async captcha(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + try { + const jsonObject: Record = NiucloudUtils.Niucloud.get(SEND_CAPTCHA_URL, {}); + const result: Record = jsonObject.getJSONObject("data"); + //删除null值 防止序列化报错 + JacksonUtils.removeNull(result); + return result; + } catch (Exception e) { + log.error("获取验证码失败异常信息:{}", e.getMessage()); + throw new Error(e); + } } /** * sendMobileCode */ async sendMobileCode(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const body: Record = {}; + body.put("mobile", param.getMobile()); + body.put("captcha_key", param.getCaptchaKey()); + body.put("captcha_code", param.getCaptchaCode()); + try { + const jsonObject: Record = NiucloudUtils.Niucloud.post(SEND_CODE_URL, body); + const result: Record = jsonObject.getJSONObject("data"); + //删除null值 防止序列化报错 + JacksonUtils.removeNull(result); + return result; + } catch (Exception e) { + log.error("发送验证码失败异常信息:{}", e.getMessage()); + throw new AdminException("发送验证码失败"); + } } /** * registerAccount */ async registerAccount(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return 0; + if (ObjectUtil.isNotEmpty(param.getImgUrl())) { + param.setImgUrl(Paths.get(RequestUtils.getReqeustURI(), param.getImgUrl()).toString()); + } + const result: Record = null; + try { + result = NiucloudUtils.Niucloud.post(ACCOUNT_REGISTER_URL, param); + //删除null值 防止序列化报错 + JacksonUtils.removeNull(result); + } catch (Exception e) { + log.error("注册账号失败异常信息:{}", e.getMessage()); + throw new AdminException("注册账号失败"); + } + return result; } /** * loginAccount */ async loginAccount(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return 0; + const url: string = String.format(LOGIN_ACCOUNT_URL, param.getUsername()); + const body: Record = {}; + body.put("username", param.getUsername()); + body.put("password", param.getPassword()); + try { + const jsonObject: Record = NiucloudUtils.Niucloud.post(url, body); + const result: Record = jsonObject.getJSONObject("data"); + if (result == null) { + throw new AdminException("登录失败"); + } + param.setSignature(" "); + param.setDefaultVal(" "); + setConfig(param); + //删除null值 防止序列化报错 + JacksonUtils.removeNull(result); + return result; + } catch (Exception e) { + log.error("登录账号失败异常信息:{}", e.getMessage()); + throw new AdminException(e.getMessage()); + } } /** * resetPassword */ async resetPassword(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const result: Record = new Record(); + // 获取用户信息 + const data: Record = accountInfo(param.getUsername()); + + // 拆分手机号并验证 + const mobiles: string = String.valueOf(data.getOrDefault("mobiles", "")); + const mobileList: string[] = Arrays.asList(mobiles.split(",")); + if (!mobileList.includes(param.getMobile())) { + throw new AdminException("手机号错误"); + } + + // 重置密码 + const newPassword: string = null; + try { + const resetPasswordUrl: string = String.format(RESET_PASSWORD_URL, param.getUsername()); + const resetPasswordBody: Record = {}; + resetPasswordBody.put("mobile", param.getMobile()); + resetPasswordBody.put("code", param.getCode()); + resetPasswordBody.put("key", param.getKey()); + const resetPasswordJson: Record = NiucloudUtils.Niucloud.put(resetPasswordUrl, resetPasswordBody); + const resetPasswordDataJson: Record = resetPasswordJson.getJSONObject("data"); + newPassword = resetPasswordDataJson.getStr("newPassword"); + } catch (Exception e) { + log.error("重置密码失败异常信息:{}", e.getMessage()); + throw new AdminException("重置密码失败"); + } + + //修改配置 + const registerAccountParam: RegisterAccountParam = new RegisterAccountParam(); + registerAccountParam.setUsername(param.getUsername()); + registerAccountParam.setPassword(param.getPassword()); + setConfig(registerAccountParam); + + result.put("password", newPassword); + return result; } /** * accountInfo */ async accountInfo(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return 0; + const infoUrl: string = String.format(ACCOUNT_INFO_URL, username); + try { + const jsonObject: Record = NiucloudUtils.Niucloud.get(infoUrl, {}); + const result: Record = jsonObject.getJSONObject("data"); + // 获取配置 + const nyConfig: Record = getConfig(false); + if (result != null && nyConfig != null && nyConfig.containsKey("username")) { + if (nyConfig.getStr("username") === result.getStr("username")) { + result.set("signature", nyConfig.getOrDefault("signature", "").toString().trim()); + } + } + JacksonUtils.removeNull(result); + return result; + } catch (JSONException e) { + log.error("获取用户信息失败异常信息:{}", e.getMessage()); + throw new AdminException("获取用户信息失败"); + } } /** * getTemplateList */ async getTemplateList(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const config: Record = getConfig(false); + const siteId: number = RequestUtils.siteId(); + if (ObjectUtil.isEmpty(config) || !config.getOrDefault("username", "") === username) { + throw new ApiException("牛云短信账号异常,请重新登录账号"); + } + const list: SysNotice[] = sysNoticeMapper.selectList(new QueryWrapper().eq("site_id", siteId)); + const map: Record = {}; + if (!CollectionUtils.isEmpty(list)) { + map = list.stream().collect(Collectors.toMap(SysNotice::getKey, item => item)); + } + const notice: TemplateListVo[] = []; + for (Map.Entry noticeMap : NoticeEnum.getNiuyunNotice().entrySet()) { + const noticeInfoVo: TemplateListVo = new TemplateListVo(); + BeanUtil.copyProperties(noticeMap.getValue(), noticeInfoVo); + if (map.containsKey(noticeMap.getKey())) { + BeanUtil.copyProperties(map.get(noticeMap.getKey()), noticeInfoVo); + } + //针对短信,微信公众号,小程序配置 + if (ObjectUtil.isNotEmpty(noticeMap.getValue().getSupport_type_map())) { + for (Map.Entry> supportTypeMap : noticeMap.getValue().getSupport_type_map().entrySet()) { + if (supportTypeMap.getKey() === "sms") { + noticeInfoVo.setSms(supportTypeMap.getValue()); + } + if (supportTypeMap.getKey() === "wechat") { + noticeInfoVo.setWechat(supportTypeMap.getValue()); + } + if (supportTypeMap.getKey() === "weapp") { + noticeInfoVo.setWeapp(supportTypeMap.getValue()); + } + } + } + + notice.add(noticeInfoVo); + } + const niuSmsTemplates: NiuSmsTemplate[] = niuSmsTemplateMapper.selectList(new QueryWrapper() + .eq("sms_type", smsType) + .eq("username", username) + .eq("site_id", siteId)); + const templateMap: Record = {}; + if (!CollectionUtils.isEmpty(niuSmsTemplates)){ + templateMap = niuSmsTemplates.stream().collect(Collectors.toMap(NiuSmsTemplate::getTemplateKey, item => item)); + } + const addonList: Addon[] = coreSiteService.getSiteAddons(siteId); + const sys: Addon = new Addon(); + sys.setKey("system"); + addonList.add(0, sys); + const result: TemplateListVo[] = []; + for (const addon of addonList) { + for (const noticeInfoVo of notice) { + if (addon.getKey() === noticeInfoVo.getAddon()) { + if ("system" === noticeInfoVo.getAddon()) { + noticeInfoVo.setAddon("系统"); + } + const auditInfo: Record = new Record(); + auditInfo.set("audit_msg", templateMap.containsKey(noticeInfoVo.getKey()) ? templateMap.get(noticeInfoVo.getKey()).getAuditMsg() : ""); + auditInfo.set("audit_status", templateMap.containsKey(noticeInfoVo.getKey()) ? templateMap.get(noticeInfoVo.getKey()).getAuditStatus() : TemplateAuditStatus.TEMPLATE_NOT_REPORT.getCode()); + auditInfo.set("audit_status_name", TemplateAuditStatus.getByCode(auditInfo.getInt("audit_status")).getDescription()); + const paramsJson: string[] = []; + if (templateMap.containsKey(noticeInfoVo.getKey())){ + const paramJson: string = templateMap.get(noticeInfoVo.getKey()).getParamJson(); + if (ObjectUtil.isNotEmpty(paramJson)){ + const jsonObject: Record = JSONUtil.parseObj(paramJson); + paramsJson.addAll(jsonObject.keySet()); + } + } + Collections.sort(paramsJson); + + const variable: string[] = []; + if (ObjectUtil.isNotEmpty(noticeInfoVo.getVariable())) { + variable.addAll(noticeInfoVo.getVariable().keySet()); + } + Collections.sort(variable); + + const errorStatus: string = ""; + // 比较两个键列表 + if (templateMap.containsKey(noticeInfoVo.getKey()) && !variable === paramsJson) { + if (paramsJson.length === 0) { + errorStatus = String.valueOf(TemplateAuditStatus.TEMPLATE_NEED_PULL.getCode()); + } else { + errorStatus = auditInfo.getInt("audit_status") == TemplateAuditStatus.TEMPLATE_PASS.getCode() + ? String.valueOf(TemplateAuditStatus.TEMPLATE_STATUS_AGAIN_REPORT.getCode()) + : String.valueOf(TemplateAuditStatus.TEMPLATE_NEED_EDIT.getCode()); + } + } + auditInfo.set("error_status", errorStatus); + if (StringUtil.isNotEmpty(errorStatus)){ + auditInfo.set("error_status_name", TemplateAuditStatus.getByCode(number.parseInt(errorStatus)).getDescription()); + }else { + auditInfo.set("error_status_name", ""); + } + noticeInfoVo.setAuditInfo(auditInfo); + if (templateMap.containsKey(noticeInfoVo.getKey())){ + const niuSmsTemplate: NiuSmsTemplate = templateMap.get(noticeInfoVo.getKey()); + if ((niuSmsTemplate.getTemplateType( && niuSmsTemplate.getTemplateType(.trim() !== ''))){ + noticeInfoVo.setTemplateTypeName(TemplateTypeEnum.fromCode(number.parseInt(niuSmsTemplate.getTemplateType())).getDescription()); + }else { + noticeInfoVo.setTemplateTypeName(""); + } + noticeInfoVo.setTemplateId(number.parseInt(niuSmsTemplate.getTemplateId())); + } + result.add(noticeInfoVo); + } + } + } + return result; } /** * orderList */ async orderList(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const orderListUrl: string = String.format(ORDER_LIST_URL, username); + const result: Record = null; + try { + const orderListParam: Record = {}; + orderListParam.put("out_trade_no", param.getOutTradeNo()); + orderListParam.put("order_status", param.getStatus()); + orderListParam.put("create_time_start", param.getCreateTimeStart()); + orderListParam.put("create_time_end", param.getCreateTimeEnd()); + orderListParam.put("limit", pageParam.getLimit()); + orderListParam.put("page", pageParam.getPage()); + const jsonObject: Record = NiucloudUtils.Niucloud.get(orderListUrl, orderListParam); + result = jsonObject.getJSONObject("data"); + //删除null值 防止序列化报错 + JacksonUtils.removeNull(result); + } catch (Exception e) { + log.error("获取订单列表失败异常信息:{}", e.getMessage()); + throw new AdminException("获取订单列表失败"); + } + return result; } /** * accountSendList */ async accountSendList(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return 0; + const accountSendUrl: string = String.format(ACCOUNT_SEND_LIST_URL, username); + const accountSendParam: Record = {}; + accountSendParam.put("mobile", param.getMobile()); + accountSendParam.put("content", param.getContent()); + accountSendParam.put("smsStatus", param.getSmsStatus()); + accountSendParam.put("limit", pageParam.getLimit()); + accountSendParam.put("page", pageParam.getPage()); + try { + const jsonObject: Record = NiucloudUtils.Niucloud.get(accountSendUrl, accountSendParam); + const result: Record = jsonObject.getJSONObject("data"); + //删除null值 防止序列化报错 + JacksonUtils.removeNull(result); + return result; + } catch (Exception e) { + log.error("获取发送列表失败异常信息:{}", e.getMessage()); + throw new AdminException("获取发送列表失败"); + } } /** * enable */ async enable(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const registerAccountParam: RegisterAccountParam = new RegisterAccountParam(); + if (isEnable == 1) { + const config: Record = getConfig(true); + if (ObjectUtil.isEmpty(config) || + !config.containsKey(NIUYUN) || + (config.getJSONObject(NIUYUN)).get("username") == null || + (config.getJSONObject(NIUYUN)).get("username").toString().isEmpty() || + (config.getJSONObject(NIUYUN)).get("password") == null || + (config.getJSONObject(NIUYUN)).get("password").toString().isEmpty() || + (config.getJSONObject(NIUYUN)).get("signature") == null || + (config.getJSONObject(NIUYUN)).get("signature").toString().isEmpty()) { + throw new AdminException("需登录账号并配置签名后才能启用牛云短信"); + } + registerAccountParam.setDefaultVal(NIUYUN); + setConfig(registerAccountParam); + } else { + registerAccountParam.setDefaultVal(" "); + setConfig(registerAccountParam); + } } /** * editAccount */ async editAccount(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return 0; + const editAccountUrl: string = String.format(ACCOUNT_EDIT_URL, username); + const editAccountBody: Record = {}; + editAccountBody.put("new_mobile", param.getNewMobile()); + editAccountBody.put("mobile", param.getMobile()); + editAccountBody.put("code", param.getCode()); + editAccountBody.put("key", param.getKey()); + editAccountBody.put("signature", param.getSignature()); + try { + const jsonObject: Record = NiucloudUtils.Niucloud.put(editAccountUrl, editAccountBody); + const registerAccountParam: RegisterAccountParam = new RegisterAccountParam(); + registerAccountParam.setSignature(param.getSignature()); + setConfig(registerAccountParam); + JacksonUtils.removeNull(jsonObject); + return jsonObject; + } catch (Exception e) { + log.error("修改账号信息失败异常信息:{}", e.getMessage()); + throw new AdminException("修改账号信息失败"); + } } /** * signDelete */ async signDelete(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const config: Record = getConfig(false); + param.setPassword(config.getStr("password")); + try { + const failList: any[] = delSign(username, param); + + const configSignature: string = config.getStr("signature"); + const signatures: string[] = param.getSignatures(); + + if (signatures != null && !failList.length === 0 && + signatures.includes(configSignature) && + !failList.includes(configSignature)) { + // 如果满足条件,则清空账户的签名 + const editAccountParam: EditAccountParam = new EditAccountParam(); + editAccountParam.setSignature(""); + editAccount(username, editAccountParam); + } + return failList; + } catch (Exception e) { + log.error("删除签名失败异常信息:{}", e.getMessage()); + throw new AdminException("删除签名失败异常"); + } } /** * signCreate */ async signCreate(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + if (ObjectUtil.isNotEmpty(param.getImgUrl())) { + param.setImgUrl(Paths.get(RequestUtils.getReqeustURI(), param.getImgUrl()).toString()); + } + const signCreateUrl: string = String.format(SIGN_ADD_URL, username); + try { + const jsonObject: Record = NiucloudUtils.Niucloud.post(signCreateUrl, param); + const data: Record = jsonObject.getJSONObject("data"); + if (data.containsKey("failList") && !data.getJSONArray("failList").isEmpty()) { + const failList: JSONArray = data.getJSONArray("failList"); + throw new ApiException(failList.getJSONObject(0).getStr("msg")); + } + } catch (ApiException e) { + log.error("创建签名失败异常信息:{}", e.getMessage()); + throw new AdminException("创建签名失败"); + } } /** * getSmsPackageList */ async getSmsPackageList(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const pageListParam: Record = {}; + pageListParam.put("package_name", param.getPackageName()); + pageListParam.put("sms_num", param.getSmsNum()); + pageListParam.put("price_start", param.getPriceStart()); + pageListParam.put("price_end", param.getPriceEnd()); + pageListParam.put("original_price_start", param.getOriginalPriceStart()); + pageListParam.put("original_price_end", param.getOriginalPriceEnd()); + pageListParam.put("time_start", param.getTimeStart()); + pageListParam.put("time_end", param.getTimeEnd()); + pageListParam.put("page", 1); + pageListParam.put("limit", 15); + try { + const jsonObject: Record = NiucloudUtils.Niucloud.get(PACKAGE_LIST_URL, pageListParam); + const result: Record = jsonObject.getJSONObject("data"); + //删除null值 防止序列化报错 + JacksonUtils.removeNull(result); + return result; + } catch (Exception e) { + log.error("获取套餐列表失败异常信息:{}", e.getMessage()); + throw new AdminException("获取套餐列表失败"); + } } /** * orderCalculate */ async orderCalculate(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const orderCalculateUrl: string = String.format(ORDER_CALCULATE_URL, username); + const orderCalculateBody: Record = {}; + orderCalculateBody.put("package_id", param.getPackageId()); + try { + const jsonObject: Record = NiucloudUtils.Niucloud.post(orderCalculateUrl, orderCalculateBody); + const result: Record = jsonObject.getJSONObject("data"); + //删除null值 防止序列化报错 + JacksonUtils.removeNull(result); + return result; + } catch (Exception e) { + log.error("计算订单失败异常信息:{}", e.getMessage()); + throw new AdminException("计算订单失败"); + } } /** * createOrder */ async createOrder(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const orderCreateUrl: string = String.format(ORDER_CREATE_URL, username); + const orderCreateBody: Record = {}; + orderCreateBody.put("package_id", param.getPackageId()); + try { + const jsonObject: Record = NiucloudUtils.Niucloud.post(orderCreateUrl, orderCreateBody); + const result: Record = jsonObject.getJSONObject("data"); + //删除null值 防止序列化报错 + JacksonUtils.removeNull(result); + return result; + } catch (Exception e) { + log.error("创建订单失败异常信息:{}", e.getMessage()); + throw new AdminException("创建订单失败"); + } } /** * getPayInfo */ async getPayInfo(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const request: HttpServletRequest = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest(); + + const protocol: string = request.isSecure() ? "https" : "http"; + const host: string = request.getServerName(); + const port: number = request.getServerPort(); + if (port != 80 && port != 443) { + host += ":" + port; + } + const returnUrl: string = String.format("%s://%s/site/setting/sms/pay", protocol, host); + const payInfoUrl: string = String.format(ORDER_PAY_URL, username); + const payInfoBody: Record = {}; + payInfoBody.put("notify_url", payInfoUrl); + payInfoBody.put("return_url", returnUrl); + payInfoBody.put("out_trade_no", outTradeNo); + try { + const jsonObject: Record = NiucloudUtils.Niucloud.post(payInfoUrl, payInfoBody); + const result: Record = jsonObject.getJSONObject("data"); + //删除null值 防止序列化报错 + JacksonUtils.removeNull(result); + return result; + } catch (Exception e) { + log.error("获取支付信息失败异常信息:{}", e.getMessage()); + throw new AdminException("获取支付信息失败"); + } } /** * getOrderInfo */ async getOrderInfo(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const orderInfoUrl: string = String.format(ORDER_INFO_URL, username, outTradeNo); + try { + const jsonObject: Record = NiucloudUtils.Niucloud.get(orderInfoUrl, {}); + const result: Record = jsonObject.getJSONObject("data"); + //删除null值 防止序列化报错 + JacksonUtils.removeNull(result); + return result; + } catch (Exception e) { + log.error("获取订单信息失败异常信息:{}", e.getMessage()); + throw new AdminException("获取订单信息失败"); + } } /** * getOrderStatus */ async getOrderStatus(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const orderStatusUrl: string = String.format(ORDER_STATUS_URL, username, outTradeNo); + try { + const jsonObject: Record = NiucloudUtils.Niucloud.get(orderStatusUrl, {}); + const result: Record = jsonObject.getJSONObject("data"); + //删除null值 防止序列化报错 + JacksonUtils.removeNull(result); + return result; + } catch (Exception e) { + log.error("获取订单状态失败异常信息:{}", e.getMessage()); + throw new AdminException("获取订单状态失败"); + } } /** * templateCreate */ async templateCreate(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const templateKey: string = param.getTemplateKey(); + const templateList: TemplateListVo[] = getTemplateList(smsType, username); + + // 查找模版信息,如果不存在则抛出异常 + const templateInfo: TemplateListVo = templateList.stream() + .filter(item => item.getKey() === templateKey) + .findFirst() + .orElseThrow(() => new AdminException("当前模版未配置短信内容")); + + // 检查模版是否配置了短信内容,如果未配置则抛出异常 + if (ObjectUtil.isEmpty(templateInfo.getSms()) || ObjectUtil.isEmpty(templateInfo.getSms().get("content"))) { + throw new AdminException("当前模版未配置短信内容"); + } + + // 检查模版是否已经审核通过,如果已通过则抛出异常 + const modelInfo: NiuSmsTemplate[] = niuSmsTemplateMapper.selectList(new QueryWrapper() + .eq("template_key", templateKey) + .eq("site_id", RequestUtils.siteId()) + .eq("username", username)); + if (!CollectionUtils.isEmpty(modelInfo) && TemplateAuditStatus.TEMPLATE_PASS.getCode().toString() === modelInfo.get(0.getAuditStatus())) { + throw new AdminException("审核通过的模版不允许修改"); + } + + const config: Record = getConfig(false); + const templateCreateUrl: string = String.format(TEMPLATE_ADD_URL, username); + const templateCreateBody: Record = {}; + templateCreateBody.put("temName", path.basename(templateInfo)); + templateCreateBody.put("temType", param.getTemplateType()); + templateCreateBody.put("temContent", templateInfo.getSms().get("content")); + templateCreateBody.put("paramJson", param.getParamsJson()); + templateCreateBody.put("extend", Map.of("template_key", templateKey)); + templateCreateBody.put("signature", config.getStr("signature")); + templateCreateBody.put("temId", param.getTemplateId()); + + Record result; + try { + const jsonObject: Record = NiucloudUtils.Niucloud.post(templateCreateUrl, templateCreateBody); + result = jsonObject.getJSONObject("data"); + JacksonUtils.removeNull(result); // 删除null值,防止序列化报错 + } catch (Exception e) { + log.error("创建模版失败异常信息:{},", e.getMessage()); + throw new AdminException("创建模版失败"); + } + + // 获取模板ID,如果不存在则设为const temId: 0 + number = result.containsKey("temId") ? result.getInt("temId") : 0; + + if (CollectionUtils.isEmpty(modelInfo)) { + const niuSmsTemplate: NiuSmsTemplate = new NiuSmsTemplate(); + niuSmsTemplate.setSiteId(RequestUtils.siteId()); + niuSmsTemplate.setSmsType(smsType); + niuSmsTemplate.setUsername(username); + niuSmsTemplate.setTemplateKey(templateKey); + niuSmsTemplate.setAuditStatus(TemplateAuditStatus.TEMPLATE_WAIT.getCode().toString()); + niuSmsTemplate.setTemplateId(temId.toString()); + niuSmsTemplate.setReportInfo(JSONUtil.toJsonStr(result)); + niuSmsTemplate.setCreateTime(System.currentTimeMillis() / 1000); + niuSmsTemplate.setUpdateTime(System.currentTimeMillis() / 1000); + niuSmsTemplateMapper.insert(niuSmsTemplate); + } else { + const niuSmsTemplate: NiuSmsTemplate = modelInfo.get(0); + niuSmsTemplate.setAuditStatus(TemplateAuditStatus.TEMPLATE_WAIT.getCode().toString()); + niuSmsTemplate.setTemplateId(temId.toString()); + niuSmsTemplate.setReportInfo(JSONUtil.toJsonStr(result)); + niuSmsTemplate.setUpdateTime(System.currentTimeMillis() / 1000); + niuSmsTemplateMapper.updateById(niuSmsTemplate); + } + + return result != null ? result : new Record(); } /** * templateDelete */ async templateDelete(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const config: Record = getConfig(false); + const deleteBody: Record = {}; + const time: number = DateUtil.currentSeconds(); + deleteBody.put("tKey", time); + deleteBody.put("password", DigestUtil.md5Hex(DigestUtil.md5Hex(config.getStr("password")) + time)); + deleteBody.put("username", username); + deleteBody.put("temId", templateId); + try { + sendHttp(TEMPLATE_DELETE, deleteBody); + niuSmsTemplateMapper.delete(new QueryWrapper().eq("template_id", templateId)); + } catch (Exception e) { + log.error("删除模版失败异常信息:{},", e.getMessage()); + throw new AdminException("删除模版失败"); + } } /** * templateInfo */ async templateInfo(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const niuSmsTemplate: NiuSmsTemplate = niuSmsTemplateMapper.selectOne(new LambdaQueryWrapper() + .eq(NiuSmsTemplate::getSiteId, RequestUtils.siteId()) + .eq(NiuSmsTemplate::getSmsType, smsType) + .eq(NiuSmsTemplate::getUsername, username) + .eq(NiuSmsTemplate::getTemplateKey, templateKey)); + if (ObjectUtil.isEmpty(niuSmsTemplate)){ + throw new AdminException("短信模版暂未报备"); + } + const orderCreateUrl: string = String.format(TEMPLATE_INFO_URL, username); + const templateInfoParam: Record = {}; + templateInfoParam.put("tem_id", niuSmsTemplate.getTemplateId()); + try { + const jsonObject: Record = NiucloudUtils.Niucloud.get(orderCreateUrl, templateInfoParam); + const result: Record = jsonObject.getJSONObject("data"); + //删除null值 防止序列化报错 + JacksonUtils.removeNull(result); + const auditStatus: string = result.containsKey("auditResult") && ObjectUtil.isNotEmpty(result.getJSONObject("auditResult")) + ? result.getStr("auditResult") : niuSmsTemplate.getAuditStatus(); + niuSmsTemplate.setAuditStatus(auditStatus); + niuSmsTemplateMapper.updateById(niuSmsTemplate); + return niuSmsTemplate; + } catch (Exception e) { + log.error("获取模版信息失败异常信息:{}", e.getMessage()); + throw new AdminException("获取模版信息失败"); + } } /** * sendHttp */ async sendHttp(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const response: HttpResponse = HttpRequest.post(url).body(JSONUtil.toJsonStr(body)).execute(); + if (!response.isOk()) { + throw new AdminException("HTTP请求失败,状态码: " + response.getStatus()); + } + + const resJson: Record = JSONUtil.parseObj(response.body()); + if (resJson.getInt("code") != 200) { + throw new AdminException(resJson.getStr("msg")); + } + return resJson; } /** * setConfig */ async setConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const config: Record = getConfig(true); + config.put("default", ObjectUtil.isNotEmpty(param.getDefaultVal()) ? param.getDefaultVal() : config.getOrDefault("default", "")); + const niuSmsConfig: Record = config.getJSONObject(NIUYUN); + const newNiuSmsConfig: Record = {}; + newNiuSmsConfig.put("username", ObjectUtil.isNotEmpty(param.getUsername()) ? param.getUsername() : niuSmsConfig != null ? niuSmsConfig.getOrDefault("username", "") : ""); + newNiuSmsConfig.put("password", ObjectUtil.isNotEmpty(param.getPassword()) ? param.getPassword() : niuSmsConfig != null ? niuSmsConfig.getOrDefault("password", "") : ""); + newNiuSmsConfig.put("signature", ObjectUtil.isNotEmpty(param.getSignature()) ? param.getSignature() : niuSmsConfig != null ? niuSmsConfig.getOrDefault("signature", "") : ""); + config.put(NIUYUN, newNiuSmsConfig); + coreConfigService.setConfig(RequestUtils.siteId(), "SMS", config); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/pay/impl/pay-channel-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/pay/impl/pay-channel-service-impl.service.ts index 9177beb9..6649ff63 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/pay/impl/pay-channel-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/pay/impl/pay-channel-service-impl.service.ts @@ -14,31 +14,109 @@ export class PayChannelServiceImplService { * setAll */ async setAll(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + for (const channelKey of param.getConfig().keySet()) { + const channel: Record = param.getConfig().getJSONObject(channelKey); + const payTypeList: JSONArray = channel.getJSONArray("pay_type"); + for (const i of number = 0; i < payTypeList.size(); i++) { + const payType: Record = payTypeList.getJSONObject(i); + set(channel.getStr("key"), payType.getStr("key"), payType); + } + } } /** * set */ async set(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const payChannel: PayChannel = payChannelMapper.selectOne(new QueryWrapper() + .eq("site_id", RequestUtils.siteId()) + .eq("channel", channel) + .eq("type", type) + ); + + if (ObjectUtil.isNotEmpty(payChannel)) { + const config: Record = JSONUtil.parseObj(payChannel.getConfig()); + for (const key of data.getJSONObject("config").keySet()) { + const value: string = data.getJSONObject("config").getStr(key, ""); + if (!value.includes("*")) config.set(key, value); + } + payChannel.setConfig(config.toString()); + payChannel.setSort(data.getInt("sort")); + payChannel.setStatus(data.getInt("status")); + payChannelMapper.updateById(payChannel); + } else { + const model: PayChannel = new PayChannel(); + model.setSiteId(RequestUtils.siteId()); + model.setChannel(channel); + model.setType(type); + model.setConfig(data.getJSONObject("config").toString()); + model.setSort(data.getInt("sort")); + model.setStatus(data.getInt("status")); + payChannelMapper.insert(model); + } } /** * getListByChannel */ async getListByChannel(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const payChannel: PayChannel[] = payChannelMapper.selectList(new QueryWrapper() + .eq("site_id", RequestUtils.siteId()) + .eq("channel", channel) + ); + + const list: PayChannelListVo[] = []; + for (const item of payChannel) { + const vo: PayChannelListVo = new PayChannelListVo(); + BeanUtils.copyProperties(item, vo); + if (ObjectUtil.isNotEmpty(item.getConfig()) && "transfer" === channel) { + const config: Record = JSONUtil.parseObj(item.getConfig()); + // 定义需要隐藏的配置项列表 + String[] keysToHide = { + "mch_secret_key", + "mch_secret_cert", + "mch_public_cert_path", + "wechat_public_cert_path", + "wechat_public_cert_id" + }; + + for (const key of keysToHide) { + const value: string = config.getStr(key); + if (ObjectUtil.isNotEmpty(value)) { + try { + config.set(key, StringUtils.hide(value, 0, value.length())); + } catch (Exception e) { + log.error("字段:{},值:{},支付设置脱敏失败{}", key, value, e.getMessage()); + } + } + } + vo.setConfig(config.toString()); + } + list.add(vo); + } + + return list; } /** * setTransfer */ async setTransfer(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const alipayConfig: Record = param.getJSONObject("alipay_config"); + const wechatpayConfig: Record = param.getJSONObject("wechatpay_config"); + + if (wechatpayConfig != null) { + this.set("transfer", "wechatpay", new Record() + .set("config", wechatpayConfig) + .set("status", 1) + .set("sort", 0)); + } + + if (alipayConfig != null) { + this.set("transfer", "alipay", new Record() + .set("config", alipayConfig) + .set("status", 1) + .set("sort", 0)); + } } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/pay/impl/pay-refund-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/pay/impl/pay-refund-service-impl.service.ts index fd7dbec0..a35da740 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/pay/impl/pay-refund-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/pay/impl/pay-refund-service-impl.service.ts @@ -14,23 +14,51 @@ export class PayRefundServiceImplService { * list */ async list(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return []; + const page: number = pageParam.getPage(); + const limit: number = pageParam.getLimit(); + + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + queryWrapper.eq("site_id", RequestUtils.siteId()); + if (ObjectUtil.isNotEmpty(searchParam.getRefundNo())) queryWrapper.eq("refund_no", searchParam.getRefundNo()); + if (ObjectUtil.isNotEmpty(searchParam.getStatus())) queryWrapper.eq("status", searchParam.getStatus()); + if (ObjectUtil.isNotEmpty(searchParam.getCreateTime())) QueryMapperUtils.buildByTime(queryWrapper, "create_time", searchParam.getCreateTime()); + queryWrapper.orderByDesc("id"); + + const payTypeEnum: Record = PayTypeEnum.getType(); + + const iPage: IPage = payRefundMapper.selectPage(new Page<>(page, limit), queryWrapper); + const list: PayRefundListVo[] = []; + for (const item of iPage.getRecords()) { + const vo: PayRefundListVo = new PayRefundListVo(); + BeanUtils.copyProperties(item, vo); + vo.setTypeName(payTypeEnum.getByPath(vo.getType() + ".name", String.class)); + list.add(vo); + } + return PageResult.build(page, limit, iPage.getTotal()).setData(list); } /** * info */ async info(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: PayRefund = payRefundMapper.selectOne( + new QueryWrapper() + .eq("refund_no", refundNo) + .eq("site_id", RequestUtils.siteId()) + .last("limit 1")); + + Assert.notNull(model, "数据不存在"); + + const vo: PayRefundInfoVo = new PayRefundInfoVo(); + BeanUtils.copyProperties(model, vo); + return vo; } /** * transfer */ async transfer(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + param.setSiteId(RequestUtils.siteId()); + coreRefundService.refund(param); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/pay/impl/pay-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/pay/impl/pay-service-impl.service.ts index f5d6a45b..ef05429f 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/pay/impl/pay-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/pay/impl/pay-service-impl.service.ts @@ -14,63 +14,173 @@ export class PayServiceImplService { * list */ async list(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return []; + const page: number = pageParam.getPage(); + const limit: number = pageParam.getLimit(); + + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + queryWrapper.orderByDesc("id"); + + const iPage: IPage = payMapper.selectPage(new Page<>(page, limit), queryWrapper); + const list: PayListVo[] = []; + for (const item of iPage.getRecords()) { + const vo: PayListVo = new PayListVo(); + BeanUtils.copyProperties(item, vo); + list.add(vo); + } + return PageResult.build(page, limit, iPage.getTotal()).setData(list); } /** * info */ async info(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: Pay = payMapper.selectOne( + new QueryWrapper() + .eq("id", id) + .last("limit 1")); + + Assert.notNull(model, "数据不存在"); + + const vo: PayInfoVo = new PayInfoVo(); + BeanUtils.copyProperties(model, vo); + return vo; } /** * add */ async add(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: Pay = new Pay(); + model.setSiteId(addParam.getSiteId()); + model.setMainId(addParam.getMainId()); + model.setOutTradeNo(addParam.getOutTradeNo()); + model.setTradeType(addParam.getTradeType()); + model.setTradeId(addParam.getTradeId()); + model.setTradeNo(addParam.getTradeNo()); + model.setBody(addParam.getBody()); + model.setMoney(addParam.getMoney()); + model.setVoucher(addParam.getVoucher()); + model.setStatus(addParam.getStatus()); + model.setJson(addParam.getJson()); + model.setCreateTime(System.currentTimeMillis() / 1000); + model.setPayTime(addParam.getPayTime()); + model.setCancelTime(addParam.getCancelTime()); + model.setType(addParam.getType()); + model.setMchId(addParam.getMchId()); + model.setMainType(addParam.getMainType()); + model.setChannel(addParam.getChannel()); + model.setFailReason(addParam.getFailReason()); + payMapper.insert(model); } /** * edit */ async edit(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: Pay = payMapper.selectOne( + new QueryWrapper() + .eq("id", id) + .last("limit 1")); + + Assert.notNull(model, "数据不存在!"); + model.setId(id); + model.setSiteId(editParam.getSiteId()); + model.setMainId(editParam.getMainId()); + model.setOutTradeNo(editParam.getOutTradeNo()); + model.setTradeType(editParam.getTradeType()); + model.setTradeId(editParam.getTradeId()); + model.setTradeNo(editParam.getTradeNo()); + model.setBody(editParam.getBody()); + model.setMoney(editParam.getMoney()); + model.setVoucher(editParam.getVoucher()); + model.setStatus(editParam.getStatus()); + model.setJson(editParam.getJson()); + model.setPayTime(editParam.getPayTime()); + model.setCancelTime(editParam.getCancelTime()); + model.setType(editParam.getType()); + model.setMchId(editParam.getMchId()); + model.setMainType(editParam.getMainType()); + model.setChannel(editParam.getChannel()); + model.setFailReason(editParam.getFailReason()); + payMapper.updateById(model); } /** * del */ async del(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: Pay = payMapper.selectOne( + new QueryWrapper() + .eq("id", id) + .last("limit 1")); + + Assert.notNull(model, "数据不存在!"); + + payMapper.delete(new QueryWrapper().eq("id", id)); } /** * getFriendspayInfoByTrade */ async getFriendspayInfoByTrade(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const payInfo: GetInfoByTradeVo = corePayService.getInfoByTrade(RequestUtils.siteId(), param.getTradeType(), param.getTradeId(), param.getChannel(), "friendspay"); + if (ObjectUtil.isEmpty(payInfo)) { + return new FriendsPayInfoByTradeVo(); + } + + const vo: FriendsPayInfoByTradeVo = new FriendsPayInfoByTradeVo(); + BeanUtils.copyProperties(payInfo, vo); + vo.setConfig(payInfo.getConfig()); + vo.setCreateTime(DateUtils.timestampToString(payInfo.getCreateTime())); + + if (payInfo.getCancelTime() > 0) { + vo.setCancelTime(DateUtils.timestampToString(payInfo.getCancelTime())); + } + + if (payInfo.getPayTime() > 0) { + vo.setPayTime(DateUtils.timestampToString(payInfo.getPayTime())); + } + + const posterQueryWrapper: QueryWrapper = new QueryWrapper<>(); + posterQueryWrapper.eq("site_id", RequestUtils.siteId()) + .eq("type", "friendspay") + .eq("status", 1) + .eq("is_default", 1); + + const poster: SysPoster = sysPosterMapper.selectOne(posterQueryWrapper); + if (ObjectUtil.isNotEmpty(poster)) { + vo.setPosterId(poster.getId()); + } + + const memberQueryWrapper: QueryWrapper = new QueryWrapper<>(); + memberQueryWrapper.eq("site_id", RequestUtils.siteId()) + .eq("member_id", vo.getMainId()); + const member: Member = memberMapper.selectOne(memberQueryWrapper); + vo.setMember(member); + + const qrcode: QR = getQrcode(param.getTradeType(), param.getTradeId(), param.getChannel()); + vo.setLink(qrcode.link); + vo.setQrcode(qrcode.qrcode); + return vo; } /** * getPayTypeList */ async getPayTypeList(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const payTypeList: PayTypeVo[] = corePayService.getPayTypeByTrade(RequestUtils.siteId(), "", ChannelEnum.H5); + if (ObjectUtil.isEmpty(payTypeList)) { + return Collections.emptyList(); + } + + return payTypeList.stream().filter(o => o.getKey() === "balancepay" || o.getKey() === "friendspay").toList(); } /** * pay */ async pay(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + param.setSiteId(RequestUtils.siteId()); + return corePayService.pay(param); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/pay/impl/pay-transfer-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/pay/impl/pay-transfer-service-impl.service.ts index f6e342b9..5a8115dc 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/pay/impl/pay-transfer-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/pay/impl/pay-transfer-service-impl.service.ts @@ -14,15 +14,21 @@ export class PayTransferServiceImplService { * setSceneId */ async setSceneId(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const config: Record = coreTransferSceneService.getWechatTransferSceneConfig(RequestUtils.siteId()); + + const tradeScenelist: Record = TransferSceneEnum.getWechatTransferSceneMap(); + if (!tradeScenelist.containsKey(param.getScene())) { + throw new BadRequestException("不存在的商户转账场景"); + } + + config.put(param.getScene(), param.getSceneId()); + coreTransferSceneService.setWechatTransferSceneConfig(RequestUtils.siteId(), config); } /** * setTradeScene */ async setTradeScene(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + coreTransferSceneService.setTradeScene(RequestUtils.siteId(), param.getType(), param); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/site/impl/site-account-log-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/site/impl/site-account-log-service-impl.service.ts index 85a60813..87e76148 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/site/impl/site-account-log-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/site/impl/site-account-log-service-impl.service.ts @@ -14,15 +14,84 @@ export class SiteAccountLogServiceImplService { * list */ async list(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return []; + const page: number = pageParam.getPage(); + const limit: number = pageParam.getLimit(); + + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + queryWrapper.eq("site_id", RequestUtils.siteId()); + //查询条件判断组装 + if (ObjectUtil.isNotEmpty(searchParam.getTradeNo())) { + queryWrapper.like("trade_no", searchParam.getTradeNo()); + } + if (ObjectUtil.isNotEmpty(searchParam.getType())) { + queryWrapper.eq("type", searchParam.getType()); + } + if (ObjectUtil.isNotEmpty(searchParam.getCreateTime())) { + String[] createTime = searchParam.getCreateTime(); + QueryMapperUtils.buildByTime(queryWrapper, "create_time", createTime); + } + queryWrapper.orderByDesc("create_time"); + const iPage: IPage = siteAccountLogMapper.selectPage(new Page<>(page, limit), queryWrapper); + const list: SiteAccountLogListVo[] = []; + for (const item of iPage.getRecords()) { + const vo: SiteAccountLogListVo = new SiteAccountLogListVo(); + BeanUtils.copyProperties(item, vo); + const typeModel: any = new Object(); + if (item.getType() === "pay") { + typeModel = payMapper.selectOne( + new QueryWrapper() + .eq("out_trade_no", item.getTradeNo()) + .last("limit 1")); + } else if (item.getType() === "refund") { + typeModel = payRefundMapper.selectOne( + new QueryWrapper() + .eq("refund_no", item.getTradeNo()) + .last("limit 1")); + } else { + typeModel = payTransferMapper.selectOne( + new QueryWrapper() + .eq("transfer_no", item.getTradeNo()) + .last("limit 1")); + } + vo.setPayInfo(typeModel); + list.add(vo); + } + + return PageResult.build(page, limit, iPage.getTotal()).setData(list); } /** * info */ async info(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: SiteAccountLog = siteAccountLogMapper.selectOne( + new QueryWrapper() + .eq("site_id", RequestUtils.siteId()) + .eq("id", id) + .last("limit 1")); + + Assert.notNull(model, "数据不存在"); + + const vo: SiteAccountLogInfoVo = new SiteAccountLogInfoVo(); + BeanUtils.copyProperties(model, vo); + const typeModel: any = new Object(); + if (model.getType() === "pay") { + typeModel = payMapper.selectOne( + new QueryWrapper() + .eq("out_trade_no", model.getTradeNo()) + .last("limit 1")); + } else if (model.getType() === "refund") { + typeModel = payRefundMapper.selectOne( + new QueryWrapper() + .eq("refund_no", model.getTradeNo()) + .last("limit 1")); + } else { + typeModel = payTransferMapper.selectOne( + new QueryWrapper() + .eq("transfer_no", model.getTradeNo()) + .last("limit 1")); + } + vo.setPayInfo(typeModel); + return vo; } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/site/impl/site-group-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/site/impl/site-group-service-impl.service.ts index be7b0942..e6c6ccbd 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/site/impl/site-group-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/site/impl/site-group-service-impl.service.ts @@ -14,71 +14,214 @@ export class SiteGroupServiceImplService { * list */ async list(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return []; + const page: number = pageParam.getPage(); + const limit: number = pageParam.getLimit(); + + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + if (ObjectUtil.isNotEmpty(searchParam.getKeywords())) { + queryWrapper.like("group_name", searchParam.getKeywords()); + } + queryWrapper.orderByDesc("group_id"); + + const iPage: IPage = siteGroupMapper.selectPage(new Page<>(page, limit), queryWrapper); + + //获取所有的const addonList: addon + List = addonMapper.selectList(new QueryWrapper().orderByDesc("id")); + const list: SiteGroupListVo[] = []; + for (const item of iPage.getRecords()) { + const vo: SiteGroupListVo = new SiteGroupListVo(); + vo.setGroupId(item.getGroupId()); + vo.setGroupName(item.getGroupName()); + vo.setGroupDesc(item.getGroupDesc()); + vo.setCreateTime(item.getCreateTime()); + vo.setUpdateTime(item.getUpdateTime()); + const addonJson: JSONArray = JSONUtil.parseArray(item.getAddon()); + vo.setAddon(addonJson); + const appJson: JSONArray = JSONUtil.parseArray(item.getApp()); + vo.setApp(appJson); + const addonStr: string[] = []; + const appStr: string[] = []; + const appList: SiteGroupListVo.IconAndTitle[] = []; + const addonListResult: SiteGroupListVo.IconAndTitle[] = []; + for (const addon of addonList) + { + if(addonJson.includes(addon.getKey())){ + addonStr.add(addon.getTitle()); + SiteGroupListVo.const iconAndTitle: IconAndTitle = new SiteGroupListVo.IconAndTitle(); + iconAndTitle.setTitle(addon.getTitle()); + try { + iconAndTitle.setIcon(ImageToBase64ConverterUtil.convertToBase64(addon.getIcon())); + } catch (Exception e) { + iconAndTitle.setIcon(""); + } + addonListResult.add(iconAndTitle); + } + if(appJson.includes(addon.getKey())){ + appStr.add(addon.getTitle()); + SiteGroupListVo.const iconAndTitle: IconAndTitle = new SiteGroupListVo.IconAndTitle(); + iconAndTitle.setTitle(addon.getTitle()); + try { + iconAndTitle.setIcon(ImageToBase64ConverterUtil.convertToBase64(addon.getIcon())); + } catch (Exception e) { + iconAndTitle.setIcon(""); + } + + appList.add(iconAndTitle); + } + } + vo.setAddonName(addonStr); + vo.setAppName(appStr); + vo.setAddonList(addonListResult); + vo.setAppList(appList); + list.add(vo); + } + return PageResult.build(iPage.getCurrent(), iPage.getSize(), iPage.getTotal()).setData(list); } /** * getAll */ async getAll(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + queryWrapper.orderByDesc("group_id"); + return siteGroupMapper.selectList(queryWrapper); } /** * info */ async info(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: SiteGroup = siteGroupMapper.selectOne( + new QueryWrapper() + .eq("group_id", id) + .last("limit 1")); + + Assert.notNull(model, "数据不存在"); + return model; } /** * add */ async add(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const groupRoles: JSONArray = new JSONArray(); + groupRoles.addAll(addParam.getAddon()); + groupRoles.addAll(addParam.getApp()); + /**判断应用是否全部是有效的已安装应用 */ + checkAddon(groupRoles); + const model: SiteGroup = new SiteGroup(); + model.setGroupName(addParam.getGroupName()); + model.setGroupDesc(addParam.getGroupDesc()); + model.setApp(JSONUtil.toJsonStr(addParam.getApp())); + model.setAddon(JSONUtil.toJsonStr(addParam.getAddon())); + model.setCreateTime(DateUtils.currTime()); + model.setUpdateTime(DateUtils.currTime()); + siteGroupMapper.insert(model); } /** * edit */ async edit(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: SiteGroup = siteGroupMapper.selectOne( + new QueryWrapper() + .eq("group_id", id) + .last("limit 1")); + + Assert.notNull(model, "数据不存在!"); + + const groupRoles: JSONArray = new JSONArray(); + groupRoles.addAll(editParam.getAddon()); + groupRoles.addAll(editParam.getApp()); + /**判断应用是否全部是有效的已安装应用 */ + checkAddon(groupRoles); + + const group: SiteGroup = new SiteGroup(); + group.setGroupId(id); + group.setGroupId(editParam.getGroupId()); + group.setGroupName(editParam.getGroupName()); + group.setGroupDesc(editParam.getGroupDesc()); + group.setApp(JSONUtil.toJsonStr(editParam.getApp())); + group.setAddon(JSONUtil.toJsonStr(editParam.getAddon())); + group.setUpdateTime(DateUtils.currTime()); + siteGroupMapper.updateById(group); + this.cached.remove("site_group_menu_ids" + id); + if (!model.getApp() === group.getApp()) { + // 修改站点应用 + const siteModel: Site = new Site(); + siteModel.setApp(model.getApp()); + siteMapper.update(siteModel, new QueryWrapper().eq("group_id", id)); + } + + if (!model.getApp() === group.getApp() || !model.getAddon() === group.getAddon()) { + const siteList: Site[] = siteMapper.selectList(new QueryWrapper().eq("group_id", id)); + if (ObjectUtil.isNotEmpty(siteList)) { + for (const site of siteList) { + siteService.siteAddonChange(site, model); + coreSiteService.clearSiteCache(site.getSiteId()); + } + + } + } } /** * del */ async del(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: SiteGroup = siteGroupMapper.selectOne( + new QueryWrapper() + .eq("group_id", id) + .last("limit 1")); + + Assert.notNull(model, "数据不存在!"); + const siteCount: number = siteMapper.selectCount(new QueryWrapper().eq("group_id", id)); + if(siteCount>0){ + throw new BadRequestException("当前套餐存在站点,不能删除"); + } + siteGroupMapper.delete(new QueryWrapper().eq("group_id", id)); } /** * checkAddon */ async checkAddon(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const addonListVoMap: Record = coreAddonService.getInstallAddonList(); + const keys: string[] = new ArrayList<>(addonListVoMap.keySet()); + const addonString: string[] = JSONUtil.toList(jsonArray, String.class); + keys.retainAll(addonString); + if(keys.size()!=addonString.size()){ + throw new AdminException("SITE_GROUP_APP_NOT_EXIST"); + } } /** * getUserSiteGroupAll */ async getUserSiteGroupAll(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const siteGroupListVoList: SiteGroupListVo[] = []; + const siteGroupList: SiteGroup[] = siteGroupMapper.selectList(new QueryWrapper<>()); + + for (const siteGroup of siteGroupList) { + const siteGroupListVo: SiteGroupListVo = new SiteGroupListVo(); + BeanUtils.copyProperties(siteGroup, siteGroupListVo); + siteGroupListVo.setSiteNum(getUserSiteGroupSiteNum(uid, siteGroup.getGroupId())); + siteGroupListVoList.add(siteGroupListVo); + } + return siteGroupListVoList; } /** * getUserSiteGroupSiteNum */ async getUserSiteGroupSiteNum(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const userRoleMPJQueryWrapper: MPJQueryWrapper = new MPJQueryWrapper<>(); + userRoleMPJQueryWrapper.setAlias("sur") + .leftJoin("?_site s ON sur.site_id = s.site_id".replace("?_", this.config.get('tablePrefix'))); + userRoleMPJQueryWrapper.eq("sur.uid", uid); + userRoleMPJQueryWrapper.eq("sur.is_admin", 1); + userRoleMPJQueryWrapper.eq("s.group_id", groupId); + const count: number = sysUserRoleMapper.selectJoinCount(userRoleMPJQueryWrapper); + return count; } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/site/impl/site-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/site/impl/site-service-impl.service.ts index c340c86a..970fc3f9 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/site/impl/site-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/site/impl/site-service-impl.service.ts @@ -14,95 +14,446 @@ export class SiteServiceImplService { * list */ async list(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return []; + const page: number = pageParam.getPage(); + const limit: number = pageParam.getLimit(); + + const queryWrapper: MPJQueryWrapper = new MPJQueryWrapper(); + queryWrapper.setAlias("se") + .selectAll(Site.class) + .select("sg.group_name") + .leftJoin("?_site_group sg on sg.group_id = se.group_id".replace("?_", this.config.get('tablePrefix'))); + + + //查询条件判断组装 + if (ObjectUtil.isNotEmpty(searchParam.getKeywords())) { + queryWrapper.like("se.siteName", searchParam.getKeywords()).or().like("se.siteName", searchParam.getKeywords()); + } + + if (ObjectUtil.isNotEmpty(searchParam.getApp())) { + queryWrapper.and(wrapper => wrapper + .like("sg.addon", searchParam.getApp()) + .or() + .like("sg.app", searchParam.getApp()) + ); + } + + if (ObjectUtil.isNotEmpty(searchParam.getStatus())) { + queryWrapper.eq("se.status", searchParam.getStatus()); + } + + if (ObjectUtil.isNotEmpty(searchParam.getGroupId())) { + queryWrapper.eq("se.group_id", searchParam.getGroupId()); + } + + if (ObjectUtil.isNotEmpty(searchParam.getSiteDomain())) { + queryWrapper.like("se.site_domain", searchParam.getSiteDomain()); + } + queryWrapper.ne("se.app_type", "admin"); + if (ObjectUtil.isNotEmpty(searchParam.getCreateTime())) { + + String[] createTime = searchParam.getCreateTime(); + const startTime: number = (createTime[0] == null) ? 0L : DateUtils.StringToTimestamp(createTime[0]); + const endTime: number = (createTime[1] == null) ? 0L : DateUtils.StringToTimestamp(createTime[1]); + if (startTime > 0L && endTime > 0L) { + queryWrapper.between("se.create_time", startTime, endTime); + } else if (startTime > 0L && endTime == 0L) { + queryWrapper.ge("se.create_time", startTime); + } else if (startTime == 0L && endTime > 0L) { + queryWrapper.le("se.create_time", startTime); + } + } + + if (ObjectUtil.isNotEmpty(searchParam.getExpireTime())) { + + String[] expireTime = searchParam.getExpireTime(); + const startTime: number = (expireTime[0] == null) ? 0 : DateUtils.StringToTimestamp(expireTime[0]); + const endTime: number = (expireTime[1] == null) ? 0 : DateUtils.StringToTimestamp(expireTime[1]); + if (startTime > 0 && endTime > 0) { + queryWrapper.between("se.expire_time", startTime, endTime); + } else if (startTime > 0 && endTime == 0) { + queryWrapper.ge("se.expire_time", startTime); + } else if (startTime == 0 && endTime > 0) { + queryWrapper.le("se.expire_time", startTime); + } + } + + queryWrapper.orderByDesc("se.create_time"); + + const iPage: IPage = siteMapper.selectJoinPage(new Page<>(page, limit), SiteListVo.class, queryWrapper); + + const list: SiteListVo[] = []; + for (const item of iPage.getRecords()) { + const vo: SiteListVo = new SiteListVo(); + BeanUtils.copyProperties(item, vo); + const userRoleMPJQueryWrapper: MPJQueryWrapper = new MPJQueryWrapper<>(); + userRoleMPJQueryWrapper.select("nsu.uid, nsu.username, nsu.head_img, nsu.real_name, nsu.last_ip, nsu.last_time, nsu.create_time, nsu.login_count") + .setAlias("nsur") + .leftJoin("?_sys_user nsu ON nsur.uid = nsu.uid".replace("?_", this.config.get('tablePrefix'))); + userRoleMPJQueryWrapper.eq("nsur.is_admin", 1); + userRoleMPJQueryWrapper.eq("nsur.site_id", item.getSiteId()); + vo.setAdmin(sysUserRoleMapper.selectJoinOne(SiteAdminVo.class, userRoleMPJQueryWrapper)); + list.add(vo); + } + return PageResult.build(page, limit, iPage.getTotal(), list); } /** * info */ async info(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return iCoreSiteService.getSiteCache(id); } /** * add */ async add(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const siteGroup: SiteGroup = siteGroupService.info(addParam.getGroupId()); + if (ObjectUtil.isNull(siteGroup) || ObjectUtil.isEmpty(siteGroup)) { + throw new BadRequestException("SITE_GROUP_NOT_EXIST"); + } + const model: Site = new Site(); + model.setSiteName(addParam.getSiteName()); + model.setGroupId(addParam.getGroupId()); + model.setAppType(AppTypeEnum.path.basename(SITE)); + model.setCreateTime(DateUtils.currTime()); + model.setExpireTime(DateUtils.StringToTimestamp(addParam.getExpireTime())); + model.setApp(siteGroup.getApp()); + model.setAddons(""); + model.setSiteDomain(addParam.getSiteDomain()); + siteMapper.insert(model); + const siteId: number = model.getSiteId(); + if (ObjectUtil.isNull(addParam.getUid()) || addParam.getUid() == 0) { + //添加用户 + const siteUserParam: SiteUserParam = new SiteUserParam(); + siteUserParam.setUsername(addParam.getUsername()); + siteUserParam.setHeadImg(""); + siteUserParam.setStatus(1); + siteUserParam.setRealName(addParam.getRealName()); + siteUserParam.setPassword(addParam.getPassword()); + siteUserParam.setIsAdmin(1); + sysUserService.addSiteUser(siteUserParam, siteId); + } else { + const sysUserRoleParam: SysUserRoleParam = new SysUserRoleParam(); + sysUserRoleParam.setUid(addParam.getUid()); + sysUserRoleParam.setRoleIds(new JsonArray().toString()); + sysUserRoleParam.setIsAdmin(1); + sysUserRoleParam.setSiteId(siteId); + userRoleService.add(sysUserRoleParam); + } + + const event: SiteAddAfterEvent = new SiteAddAfterEvent(); + event.setSiteId(siteId); + event.addAppSign("core"); + event.setName("SiteAddAfterEvent"); + event.setSite(model); + event.setSiteGroup(siteGroup); + EventAndSubscribeOfPublisher.publishAll(event); + + const param: Record = {}; + param.put("site_id", siteId); + param.put("main_app", siteGroup.getApp()); + param.put("tag", "add"); + diyService.loadDiyData(param); } /** * edit */ async edit(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: Site = siteMapper.selectOne( + new QueryWrapper() + .eq("site_id", id) + .last("limit 1")); + + Assert.notNull(model, "数据不存在!"); + if (ObjectUtil.isNotNull(editParam.getGroupId()) && ObjectUtil.isNotEmpty(editParam.getGroupId()) && !editParam.getGroupId() === model.getGroupId()) { + model.setGroupId(editParam.getGroupId()); + } + if (ObjectUtil.isNotNull(editParam.getSiteName()) && ObjectUtil.isNotEmpty(editParam.getSiteName())) { + model.setSiteName(editParam.getSiteName()); + } + + const oldSiteGroup: SiteGroup = siteGroupService.info(model.getGroupId()); + + const initallJsonArray: JSONArray = new JSONArray(); + if (ObjectUtil.isNull(model.getInitalledAddon()) || ObjectUtil.isEmpty(model.getInitalledAddon())) { + initallJsonArray.addAll(JSONUtil.parseArray(oldSiteGroup.getApp())); + initallJsonArray.addAll(JSONUtil.parseArray(oldSiteGroup.getAddon())); + } + + const siteGroup: SiteGroup = siteGroupService.info(editParam.getGroupId()); + if (ObjectUtil.isNull(siteGroup) || ObjectUtil.isEmpty(siteGroup)) { + throw new BadRequestException("SITE_GROUP_NOT_EXIST"); + } + initallJsonArray.addAll(JSONUtil.parseArray(siteGroup.getApp())); + initallJsonArray.addAll(JSONUtil.parseArray(siteGroup.getAddon())); + + model.setInitalledAddon(JSONUtil.toJsonStr(initallJsonArray)); + model.setSiteDomain(editParam.getSiteDomain()); + model.setExpireTime(new DateTime(editParam.getExpireTime()).getTime() / 1000); + model.setStatus(model.getExpireTime() > DateUtils.currTime() ? SiteStatusEnum.ON.getCode() : SiteStatusEnum.EXPIRE.getCode()); + siteMapper.updateById(model); + + coreSiteService.clearSiteCache(id); + + const event: SiteEditAfterEvent = new SiteEditAfterEvent(); + event.setSiteId(model.getSiteId()); + event.addAppSign("core"); + event.setName("SiteEditAfterEvent"); + event.setSite(model); + event.setSiteGroup(siteGroup); + EventAndSubscribeOfPublisher.publishAll(event); } /** * del */ async del(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const siteUserRoles: SysUserRole[] = null; + const delResult: number = 0; + + try { + const model: Site = siteMapper.selectById(id); + Assert.notNull(model, "数据不存在!"); + + //获取所有需要处理的Mapper + List>> allModels = new ArrayList<>(generateService.getMappers("system")); + coreSiteService.getAddonKeysBySiteId(id).forEach(addon => allModels.addAll(generateService.getMappers(addon)) + ); + + Class wrapperClass = Class.forName("com.baomidou.mybatisplus.core.conditions.query.QueryWrapper"); + Constructor wrapperConstructor = wrapperClass.getConstructor(Class.class); + const eqMethod: Method = wrapperClass.getMethod("eq", boolean.class, Object.class, Object.class); + const deleteMethod: Method = BaseMapper.class.getMethod("delete", Wrapper.class); + + // 处理所有关联表 + for (Class> mapperClass : allModels) { + BaseMapper mapper = (BaseMapper) SpringContext.getBean(mapperClass); + if (mapper == null) { + continue; + } + + Class entityClass = resolveEntityClass(mapperClass); + if (entityClass == null || !hasSiteIdField(entityClass)) { + continue; + } + + try { + // 创建QueryWrapper并执行删除 + const wrapper: any = wrapperConstructor.newInstance(entityClass); + eqMethod.invoke(wrapper, true, "site_id", id); + deleteMethod.invoke(mapper, wrapper); + } catch (Exception e) { + log.error("删除表数据失败: {} | 原因: {}", + entityClass.getSimpleName(), + e.getCause() != null ? e.getCause().getMessage() : e.getMessage()); + } + } + + // 处理用户角色关系 + const userRoleWrapper: QueryWrapper = new QueryWrapper<>(); + userRoleWrapper.eq("site_id", id); + siteUserRoles = sysUserRoleMapper.selectList(userRoleWrapper); + delResult = sysUserRoleMapper.delete(userRoleWrapper); + + // 删除站点主表 + siteMapper.deleteById(id); + } catch (Exception e) { + log.error("删除站点失败: {}", e.getMessage(), e); + throw new BadRequestException("删除失败: " + (e.getCause() != null ? e.getCause().getMessage() : e.getMessage())); + } + + // 清理缓存 + if (delResult > 0 && siteUserRoles != null) { + siteUserRoles.forEach(userRole => { + cached.remove("user_role_" + userRole.getUid() + "_" + id); + cached.remove("user_role_list_" + userRole.getUid()); + }); + } + cached.remove("site_cache_" + id); } /** * closeSite */ async closeSite(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: Site = new Site(); + model.setSiteId(siteId); + model.setStatus(SiteStatusEnum.CLOSE.getCode()); + siteMapper.updateById(model); + coreSiteService.clearSiteCache(siteId); } /** * openSite */ async openSite(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: Site = new Site(); + model.setSiteId(siteId); + model.setStatus(SiteStatusEnum.ON.getCode()); + siteMapper.updateById(model); + coreSiteService.clearSiteCache(siteId); } /** * getSiteCountByCondition */ async getSiteCountByCondition(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + if (ObjectUtil.isNotEmpty(siteSearchParam.getCreateTime())) { + + String[] createTime = siteSearchParam.getCreateTime(); + const startTime: number = (createTime[0] == null) ? 0 : DateUtils.StringToTimestamp(createTime[0]); + const endTime: number = (createTime[1] == null) ? 0 : DateUtils.StringToTimestamp(createTime[1]); + if (startTime > 0 && endTime > 0) { + queryWrapper.between("create_time", startTime, endTime); + } else if (startTime > 0 && endTime == 0) { + queryWrapper.ge("create_time", startTime); + } else if (startTime == 0 && endTime > 0) { + queryWrapper.le("create_time", startTime); + } + } + + if (ObjectUtil.isNotEmpty(siteSearchParam.getStatus())) { + queryWrapper.eq("status", siteSearchParam.getStatus()); + } + + if (ObjectUtil.isNotEmpty(siteSearchParam.getGroupId())) { + queryWrapper.eq("group_id", siteSearchParam.getGroupId()); + } + + if (ObjectUtil.isNotEmpty(siteSearchParam.getAppType())) { + queryWrapper.eq("app_type", siteSearchParam.getAppType()); + } + + if (ObjectUtil.isNotEmpty(siteSearchParam.getExpireTime())) { + + String[] expireTime = siteSearchParam.getExpireTime(); + const startTime: number = (expireTime[0] == null) ? 0 : DateUtils.StringToTimestamp(expireTime[0]); + const endTime: number = (expireTime[1] == null) ? 0 : DateUtils.StringToTimestamp(expireTime[1]); + if (startTime > 0 && endTime > 0) { + queryWrapper.between("expire_time", startTime, endTime); + } else if (startTime > 0 && endTime == 0) { + queryWrapper.ge("expire_time", startTime); + } else if (startTime == 0 && endTime > 0) { + queryWrapper.le("expire_time", startTime); + } + } + const siteCount: number = siteMapper.selectCount(queryWrapper); + return siteCount.intValue(); } /** * getSiteAddons */ async getSiteAddons(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return addonMapper.selectList(new QueryWrapper() + .eq("type", AddonTypeEnum.ADDON.getType()) + .eq("status", 1) + .in("`key`", coreSiteService.getAddonKeysBySiteId(RequestUtils.siteId()))); } /** * siteAddonChange */ async siteAddonChange(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const event: SiteEditAfterEvent = new SiteEditAfterEvent(); + event.setSiteId(site.getSiteId()); + event.addAppSign("core"); + event.setName("SiteEditAfterEvent"); + event.setSite(site); + event.setSiteGroup(siteGroup); + coreSiteService.clearSiteCache(site.getSiteId()); + EventAndSubscribeOfPublisher.publishAll(event); } /** * siteInit */ async siteInit(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const siteInfo: SiteInfoVo = info(siteId); + if (ObjectUtil.isEmpty(siteInfo)) { + throw new AdminException("站点不存在"); + } + const tables: string[] = SiteInitEnum.getSiteInitTables(siteId); + return coreSiteService.siteInitBySiteId(siteId, tables); } /** * getSpecialMenuList */ async getSpecialMenuList(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const authMenuList: JSONArray = authService.getAuthMenuTreeList(1, "all"); + + // 将菜单列表转换为Map,便于通过menu_key查找 + const authMenuMap: Record = {}; + for (const i of number = 0; i < authMenuList.size(); i++) { + const menu: Record = authMenuList.getJSONObject(i); + authMenuMap.put(menu.get("menu_key").toString(), menu); + } + + // 获取"addon"菜单 + const addonMenu: Record = authMenuMap.get("addon"); + if (addonMenu == null) { + return new SpecialMenuListVo("addon", []); + } + + const showList: Record = showCustomer(false); + const addonChildMenus: AddonChildMenuEnum.MenuConfig[] = AddonChildMenuEnum.getAll(); + + const menuList: SpecialMenuListVo.MenuVo[] = []; + + // 遍历插件子菜单,构建菜单列表 + for (AddonChildMenuEnum.MenuConfig item : addonChildMenus) { + const menuKey: string = item.getKey(); + const menuKeyList: string[] = []; + if (showList.containsKey(menuKey) && showList.get(menuKey) instanceof Map) { + const menuItem: Record = (Map) showList.get(menuKey); + if (menuItem.containsKey("list") && menuItem.get("list") instanceof List) { + const listItems: Record[] = (List>) menuItem.get("list"); + for (const listItem of listItems) { + if (listItem.containsKey("key")) { + menuKeyList.add(listItem.get("key").toString()); + } + } + } + } + SpecialMenuListVo.const tempMenu: MenuVo = new SpecialMenuListVo.MenuVo(); + tempMenu.setMenuName(path.basename(item)); + tempMenu.setMenuKey(item.getKey()); + tempMenu.setMenuShortName(item.getShortName()); + tempMenu.setParentKey("addon"); + tempMenu.setMenuType("0"); + tempMenu.setIcon("iconfont iconzhuangxiu3"); + tempMenu.setApiUrl(""); + tempMenu.setRouterPath(""); + tempMenu.setViewPath(""); + tempMenu.setMethods(""); + tempMenu.setSort(item.getSort()); + tempMenu.setStatus("1"); + tempMenu.setIsShow("1"); + + const children: SpecialMenuListVo.MenuVo[] = []; + const authChildren: JSONArray = addonMenu.getJSONArray("children"); + if (authChildren != null) { + for (const j of number = 0; j < authChildren.size(); j++) { + const child: Record = authChildren.getJSONObject(j); + if (menuKeyList.includes(child.get("menu_key").toString())) { + // 转换为MenuVo对象 + SpecialMenuListVo.const childMenu: MenuVo = convertToMenuVo(child); + children.add(childMenu); + } + } + } + + tempMenu.setChildren(children); + menuList.add(tempMenu); + } + const result: SpecialMenuListVo = new SpecialMenuListVo(); + result.setParentKey("addon"); + result.setList(menuList); + + return result; } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/site/impl/site-user-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/site/impl/site-user-service-impl.service.ts index 6bdb46c3..9570fc7e 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/site/impl/site-user-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/site/impl/site-user-service-impl.service.ts @@ -14,55 +14,120 @@ export class SiteUserServiceImplService { * list */ async list(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return []; + const page: number = pageParam.getPage(); + const limit: number = pageParam.getLimit(); + + const userRoleMPJQueryWrapper: MPJQueryWrapper = new MPJQueryWrapper<>(); + userRoleMPJQueryWrapper.select("nsur.id, nsur.is_admin, nsu.status, nsur.site_id, nsur.role_ids, nsu.uid, nsu.username, nsu.head_img, nsu.real_name, nsu.last_ip, nsu.last_time, nsu.create_time, nsu.login_count") + .setAlias("nsur") + .leftJoin("?_sys_user nsu ON nsur.uid = nsu.uid".replace("?_", this.config.get('tablePrefix'))); + if(ObjectUtil.isNotNull(searchParam.getUsername()) && ObjectUtil.isNotEmpty(searchParam.getUsername())){ + userRoleMPJQueryWrapper.like("nsu.username", searchParam.getUsername()); + } + userRoleMPJQueryWrapper.eq("nsur.site_id", RequestUtils.siteId()); + userRoleMPJQueryWrapper.isNotNull("nsu.uid"); + userRoleMPJQueryWrapper.orderByDesc("nsur.is_admin"); + userRoleMPJQueryWrapper.orderByDesc("nsur.id"); + const iPage: IPage = sysUserRoleMapper.selectJoinPage(new Page<>(page, limit), SiteUserVo.class, userRoleMPJQueryWrapper); + for (const siteUserVo of iPage.getRecords()) { + const roleArray: string[] = []; + if(ObjectUtil.isNotEmpty(siteUserVo.getRoleIds()) && JSONUtil.parseArray(siteUserVo.getRoleIds()).size()>0){ + const roleQueryWrapper: QueryWrapper = new QueryWrapper<>(); + roleQueryWrapper.in("role_id", JSONUtil.parseArray(siteUserVo.getRoleIds())); + const roleList: SysRole[] = sysRoleMapper.selectList(roleQueryWrapper); + for (const sysRole of roleList) { + roleArray.add(sysRole.getRoleName()); + } + } + siteUserVo.setRoleArray(roleArray); + } + return PageResult.build(page, limit, iPage.getTotal()).setData(iPage.getRecords()); } /** * add */ async add(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + if (siteUserParam.getUsername().matches(".*[\\u4e00-\\u9fa5].*")){ + throw new AdminException("用户名不能包含中文"); + } + sysUserService.addSiteUser(siteUserParam, RequestUtils.siteId()); } /** * getInfo */ async getInfo(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const userRoleMPJQueryWrapper: MPJQueryWrapper = new MPJQueryWrapper<>(); + userRoleMPJQueryWrapper.select("nsur.id, nsur.is_admin, nsur.status,nsur.site_id, nsur.role_ids, nsu.uid, nsu.username, nsu.head_img, nsu.real_name, nsu.last_ip, nsu.last_time, nsu.create_time, nsu.login_count") + .setAlias("nsur") + .leftJoin("?_sys_user nsu ON nsur.uid = nsu.uid".replace("?_", this.config.get('tablePrefix'))); + userRoleMPJQueryWrapper.eq("nsur.site_id", RequestUtils.siteId()); + userRoleMPJQueryWrapper.eq("nsu.uid", uid); + + const siteUserVo: SiteUserVo = sysUserRoleMapper.selectJoinOne(SiteUserVo.class, userRoleMPJQueryWrapper); + return siteUserVo; } /** * edit */ async edit(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + try{ + const sysUserParam: SysUserParam = new SysUserParam(); + sysUserParam.setHeadImg(siteUserParam.getHeadImg()); + if(ObjectUtil.isNotEmpty(siteUserParam.getPassword())){ + sysUserParam.setPassword(siteUserParam.getPassword()); + } + sysUserParam.setUsername(siteUserParam.getUsername()); + sysUserParam.setStatus(siteUserParam.getStatus()); + sysUserParam.setRealName(siteUserParam.getRealName()); + sysUserService.edit(uid, sysUserParam); + //创建用户站点管理权限 + const roleIds: string[] = siteUserParam.getRoleIds(); + const sysUserRoleParam: SysUserRoleParam = new SysUserRoleParam(); + sysUserRoleParam.setSiteId(RequestUtils.siteId()); + sysUserRoleParam.setRoleIds(JSONUtil.toJsonStr(roleIds)); + sysUserRoleParam.setUid(uid); + sysUserRoleParam.setStatus(siteUserParam.getStatus()); + sysUserRoleService.edit(sysUserRoleParam); + }catch (Exception e){ + throw new AdminException(e.getMessage()); + } } /** * lock */ async lock(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const sysUser: SysUser = sysUserMapper.selectById(uid); + sysUser.setStatus(StatusEnum.OFF.getStatus()); + sysUserMapper.updateById(sysUser); } /** * unlock */ async unlock(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const sysUser: SysUser = sysUserMapper.selectById(uid); + sysUser.setStatus(StatusEnum.ON.getStatus()); + sysUserMapper.updateById(sysUser); } /** * delete */ async delete(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return; + const sysUserRoleList: SysUserRole[] = sysUserRoleMapper.selectList(new LambdaQueryWrapper().eq(SysUserRole::getUid, uid).eq(SysUserRole::getSiteId, RequestUtils.siteId()).last("limit 1")); + if (CollectionUtils.isEmpty(sysUserRoleList)){ + throw new BadRequestException("用户不存在"); + } + const sysUserRole: SysUserRole = sysUserRoleList.get(0); + if (sysUserRole.getIsAdmin() == 1){ + throw new BadRequestException("超级管理员不允许删除"); + } + sysUserMapper.deleteById(uid); + loginService.clearToken(uid,null, null); + cached.remove("user_role_list_" + uid); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/stat/impl/stat-hour-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/stat/impl/stat-hour-service-impl.service.ts index 7d6ff539..3a3e6fcc 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/stat/impl/stat-hour-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/stat/impl/stat-hour-service-impl.service.ts @@ -14,39 +14,136 @@ export class StatHourServiceImplService { * list */ async list(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return []; + const page: number = pageParam.getPage(); + const limit: number = pageParam.getLimit(); + + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + queryWrapper.orderByDesc("id"); + + const iPage: IPage = statHourMapper.selectPage(new Page<>(page, limit), queryWrapper); + const list: StatHourListVo[] = []; + for (const item of iPage.getRecords()) { + const vo: StatHourListVo = new StatHourListVo(); + BeanUtils.copyProperties(item, vo); + list.add(vo); + } + return PageResult.build(page, limit, iPage.getTotal()).setData(list); } /** * info */ async info(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: StatHour = statHourMapper.selectOne( + new QueryWrapper() + .eq("id", id) + .last("limit 1")); + + Assert.notNull(model, "数据不存在"); + + const vo: StatHourInfoVo = new StatHourInfoVo(); + BeanUtils.copyProperties(model, vo); + return vo; } /** * add */ async add(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: StatHour = new StatHour(); + model.setSiteId(addParam.getSiteId()); + model.setAddon(addParam.getAddon()); + model.setField(addParam.getField()); + model.setFieldTotal(addParam.getFieldTotal()); + model.setYear(addParam.getYear()); + model.setMonth(addParam.getMonth()); + model.setDay(addParam.getDay()); + model.setStartTime(System.currentTimeMillis() / 1000); + model.setLastTime(addParam.getLastTime()); + model.setHour0(addParam.getHour0()); + model.setHour1(addParam.getHour1()); + model.setHour2(addParam.getHour2()); + model.setHour3(addParam.getHour3()); + model.setHour4(addParam.getHour4()); + model.setHour5(addParam.getHour5()); + model.setHour6(addParam.getHour6()); + model.setHour7(addParam.getHour7()); + model.setHour8(addParam.getHour8()); + model.setHour9(addParam.getHour9()); + model.setHour10(addParam.getHour10()); + model.setHour11(addParam.getHour11()); + model.setHour12(addParam.getHour12()); + model.setHour13(addParam.getHour13()); + model.setHour14(addParam.getHour14()); + model.setHour15(addParam.getHour15()); + model.setHour16(addParam.getHour16()); + model.setHour17(addParam.getHour17()); + model.setHour18(addParam.getHour18()); + model.setHour19(addParam.getHour19()); + model.setHour20(addParam.getHour20()); + model.setHour21(addParam.getHour21()); + model.setHour22(addParam.getHour22()); + model.setHour23(addParam.getHour23()); + statHourMapper.insert(model); } /** * edit */ async edit(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: StatHour = statHourMapper.selectOne( + new QueryWrapper() + .eq("id", id) + .last("limit 1")); + + Assert.notNull(model, "数据不存在!"); + model.setId(id); + model.setSiteId(editParam.getSiteId()); + model.setAddon(editParam.getAddon()); + model.setField(editParam.getField()); + model.setFieldTotal(editParam.getFieldTotal()); + model.setYear(editParam.getYear()); + model.setMonth(editParam.getMonth()); + model.setDay(editParam.getDay()); + model.setLastTime(editParam.getLastTime()); + model.setHour0(editParam.getHour0()); + model.setHour1(editParam.getHour1()); + model.setHour2(editParam.getHour2()); + model.setHour3(editParam.getHour3()); + model.setHour4(editParam.getHour4()); + model.setHour5(editParam.getHour5()); + model.setHour6(editParam.getHour6()); + model.setHour7(editParam.getHour7()); + model.setHour8(editParam.getHour8()); + model.setHour9(editParam.getHour9()); + model.setHour10(editParam.getHour10()); + model.setHour11(editParam.getHour11()); + model.setHour12(editParam.getHour12()); + model.setHour13(editParam.getHour13()); + model.setHour14(editParam.getHour14()); + model.setHour15(editParam.getHour15()); + model.setHour16(editParam.getHour16()); + model.setHour17(editParam.getHour17()); + model.setHour18(editParam.getHour18()); + model.setHour19(editParam.getHour19()); + model.setHour20(editParam.getHour20()); + model.setHour21(editParam.getHour21()); + model.setHour22(editParam.getHour22()); + model.setHour23(editParam.getHour23()); + statHourMapper.updateById(model); } /** * del */ async del(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: StatHour = statHourMapper.selectOne( + new QueryWrapper() + .eq("id", id) + .last("limit 1")); + + Assert.notNull(model, "数据不存在!"); + + statHourMapper.delete(new QueryWrapper().eq("id", id)); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/stat/impl/stat-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/stat/impl/stat-service-impl.service.ts index 70b44cf8..1e96c9ca 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/stat/impl/stat-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/stat/impl/stat-service-impl.service.ts @@ -14,7 +14,139 @@ export class StatServiceImplService { * getIndexData */ async getIndexData(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const statInfoVo: StatInfoVo = new StatInfoVo(); + String[] createTimes = new String[2]; + createTimes[0] = DateUtils.currInitDate(); + createTimes[1] = DateUtils.currDate(); + /** + * 会员统计类 + */ + const statToDayVo: StatToDayVo = new StatToDayVo(); + //总会员数 + const totalMemberCount: number = coreMemberService.getMemberCount(new MemberStatSearchParam()); + statToDayVo.setTotalMemberCount(totalMemberCount); + + //今天注册总会员数 + const todayMemberParam: MemberStatSearchParam = new MemberStatSearchParam(); + todayMemberParam.setCreateTime(createTimes); + statToDayVo.setTodayMemberCount(coreMemberService.getMemberCount(todayMemberParam)); + //总站点数 + statToDayVo.setTotalSiteCount(siteService.getSiteCountByCondition(new SiteSearchParam())); + //今日站点数 + const todaySiteParam: SiteSearchParam = new SiteSearchParam(); + todaySiteParam.setCreateTime(createTimes); + todaySiteParam.setAppType(AppTypeEnum.path.basename(SITE)); + statToDayVo.setTodaySiteCount(siteService.getSiteCountByCondition(todaySiteParam)); + //正常站点数 + const normaSiteParam: SiteSearchParam = new SiteSearchParam(); + normaSiteParam.setStatus(1); + normaSiteParam.setAppType(AppTypeEnum.path.basename(SITE)); + statToDayVo.setNormaSiteCount(siteService.getSiteCountByCondition(normaSiteParam)); + //到期站点数 + const expireSiteParam: SiteSearchParam = new SiteSearchParam(); + expireSiteParam.setStatus(2); + expireSiteParam.setAppType(AppTypeEnum.path.basename(SITE)); + statToDayVo.setExpireSiteCount(siteService.getSiteCountByCondition(expireSiteParam)); + //即将到期站点数 + const weekExpireSiteParam: SiteSearchParam = new SiteSearchParam(); + String[] expireTimes = new String[2]; + expireTimes[0] = DateUtils.currDate(); + expireTimes[1] = DateUtils.getDateAddDay(7); + weekExpireSiteParam.setStatus(1); + weekExpireSiteParam.setExpireTime(expireTimes); + weekExpireSiteParam.setAppType(AppTypeEnum.path.basename(SITE)); + statToDayVo.setWeekExpireSiteCount(siteService.getSiteCountByCondition(weekExpireSiteParam)); + + /** + * 系统数据类 + */ + const statSystemVo: StatSystemVo = new StatSystemVo(); + statSystemVo = systemService.getInfo(); + + statInfoVo.setTodayData(statToDayVo); + statInfoVo.setSystem(statSystemVo); + + /** + * 站点、会员数据统计数据 + */ + const memberCountVo: StatDateVo = new StatDateVo(); + const siteCountVo: StatDateVo = new StatDateVo(); + const dates: string[] = []; + const memberValues: number[] = []; + const siteValues: number[] = []; + const statNum: number = 7; + for (const i of number = 0; i <= statNum; i++) { + + const itemDay: string = DateUtils.getDateAddDay(i - statNum); + String[] startEndDate = DateUtils.getStartEndByDay(itemDay); + + const itemMemberParam: MemberStatSearchParam = new MemberStatSearchParam(); + itemMemberParam.setCreateTime(startEndDate); + const itemMemberCount: number = coreMemberService.getMemberCount(itemMemberParam); + dates.add(startEndDate[0]); + memberValues.add(itemMemberCount); + const itemSiteParam: SiteSearchParam = new SiteSearchParam(); + itemSiteParam.setCreateTime(startEndDate); + const itemSiteCount: number = siteService.getSiteCountByCondition(itemSiteParam); + siteValues.add(itemSiteCount); + } + memberCountVo.setDate(dates); + memberCountVo.setValue(memberValues); + siteCountVo.setDate(dates); + siteCountVo.setValue(siteValues); + + statInfoVo.setMemberCountStat(memberCountVo); + statInfoVo.setSiteStat(siteCountVo); + + /** + * 会员性别类型统计 + */ + const memberStat: StatTypeVo = new StatTypeVo(); + const sexlist: string[] = []; + sexlist.add(SexEnum.path.basename(MAN)); + sexlist.add(SexEnum.path.basename(WOMAN)); + sexlist.add(SexEnum.path.basename(UNKNOWN)); + + const sexCountList: number[] = []; + const sexMemberParam: MemberStatSearchParam = new MemberStatSearchParam(); + sexMemberParam.setSex(SexEnum.MAN.getValue()); + const manSexCount: number = coreMemberService.getMemberCount(sexMemberParam); + sexMemberParam.setSex(SexEnum.WOMAN.getValue()); + const womanSexCount: number = coreMemberService.getMemberCount(sexMemberParam); + sexCountList.add(manSexCount); + sexCountList.add(womanSexCount); + sexCountList.add(totalMemberCount - manSexCount - womanSexCount); + memberStat.setType(sexlist); + memberStat.setValue(sexCountList); + statInfoVo.setMemberStat(memberStat); + + /** + * 站点分组 统计 + */ + const siteGroupStat: StatTypeVo = new StatTypeVo(); + const grouplist: string[] = []; + const groupCountList: number[] = []; + + const groupList: SiteGroup[] = siteGroupService.getAll(); + for (const siteGroup of groupList) { + grouplist.add(siteGroup.getGroupName()); + const siteGroupParam: SiteSearchParam = new SiteSearchParam(); + siteGroupParam.setGroupId(siteGroup.getGroupId()); + groupCountList.add(siteService.getSiteCountByCondition(siteGroupParam)); + } + siteGroupStat.setType(grouplist); + siteGroupStat.setValue(groupCountList); + statInfoVo.setSiteGroupStat(siteGroupStat); + /** + * 所有应用安装统计 + */ + const appVo: StatAppVo = new StatAppVo(); + const totalAddonCount: number = coreAddonService.getLocalAddonCount(); + const installAddonCount: number = coreAddonService.getAddonCountByCondition(new CoreAddonSearchParam()); + appVo.setAppCount(totalAddonCount); + appVo.setAppInstalledCount(installAddonCount); + appVo.setAppNoInstalledCount(Math.max(totalAddonCount - installAddonCount, 0)); + statInfoVo.setApp(appVo); + return statInfoVo; } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-agreement-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-agreement-service-impl.service.ts index b49ba6e6..eebd42fb 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-agreement-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-agreement-service-impl.service.ts @@ -14,23 +14,33 @@ export class SysAgreementServiceImplService { * list */ async list(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return []; + const typeJson: Record = AgreementEnum.getType(); + const list: SysAgreementListVo[] = []; + + for (Map.Entry map : typeJson.entrySet()) { + const vo: SysAgreementListVo = new SysAgreementListVo(); + const sysAgreement: SysAgreement = coreAgreementService.getAgreement(RequestUtils.siteId(), map.getKey()); + BeanUtils.copyProperties(sysAgreement, vo); + list.add(vo); + } + + return list; } /** * getAgreement */ async getAgreement(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const sysAgreement: SysAgreement = coreAgreementService.getAgreement(RequestUtils.siteId(), key); + const vo: SysAgreementInfoVo = new SysAgreementInfoVo(); + BeanUtils.copyProperties(sysAgreement, vo); + return vo; } /** * setAgreement */ async setAgreement(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + coreAgreementService.setAgreement(RequestUtils.siteId(), key, title, content); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-area-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-area-service-impl.service.ts index 0462fe5a..ae30ff17 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-area-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-area-service-impl.service.ts @@ -14,55 +14,81 @@ export class SysAreaServiceImplService { * getListByPid */ async getListByPid(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + queryWrapper.eq("pid", pid); + return sysAreaMapper.selectList(queryWrapper); } /** * getAreaTree */ async getAreaTree(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + queryWrapper.le("level", level); + const list: SysArea[] = sysAreaMapper.selectList(queryWrapper); + const jsonArray: JSONArray = JSONUtil.parseArray(JSONUtil.toJsonStr(list)); + return TreeUtils.listToTree(jsonArray, "id", "pid", "child"); } /** * getAreaId */ async getAreaId(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const areaInfo: SysArea = sysAreaMapper.selectOne(new QueryWrapper().like("name", name).eq("level", level).last("limit 1")); + if (areaInfo != null) { + return areaInfo.getId(); + } + return null; } /** * getAreaName */ async getAreaName(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const areaInfo: SysArea = sysAreaMapper.selectOne(new QueryWrapper().eq("id", id).last("limit 1")); + if (areaInfo != null) { + return path.basename(areaInfo); + } + return null; } /** * list */ async list(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return []; + const page: number = pageParam.getPage(); + const limit: number = pageParam.getLimit(); + + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + queryWrapper.orderByDesc(Arrays.asList("sort", "id")); + + const iPage: IPage = sysAreaMapper.selectPage(new Page<>(page, limit), queryWrapper); + const list: SysAreaListVo[] = []; + for (const item of iPage.getRecords()) { + const vo: SysAreaListVo = new SysAreaListVo(); + BeanUtils.copyProperties(item, vo); + list.add(vo); + } + return PageResult.build(page, limit, iPage.getTotal()).setData(list); } /** * getAddressInfo */ async getAddressInfo(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const map: SysMapVo = coreSysConfigService.getMap(RequestUtils.siteId()); + const result: string = HttpUtil.get("https://apis.map.qq.com/ws/geocoder/v1/?location="+ location +"&key=" + map.getKey()); + if (!JSONUtil.isJson(result)) return null; + return JSONUtil.parseObj(result); } /** * getAddress */ async getAddress(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const map: SysMapVo = coreSysConfigService.getMap(RequestUtils.siteId()); + const result: string = HttpUtil.get("https://apis.map.qq.com/ws/geocoder/v1/?address="+ address +"&key=" + map.getKey()); + if (!JSONUtil.isJson(result)) return null; + return JSONUtil.parseObj(result); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-attachment-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-attachment-service-impl.service.ts index 1f985941..b681685c 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-attachment-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-attachment-service-impl.service.ts @@ -14,79 +14,147 @@ export class SysAttachmentServiceImplService { * list */ async list(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return []; + const page: number = pageParam.getPage(); + const limit: number = pageParam.getLimit(); + + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + queryWrapper.eq("site_id", RequestUtils.siteId()); + queryWrapper.orderByDesc("att_id"); + if (ObjectUtil.isNotEmpty(searchParam.getAttType())) queryWrapper.eq("att_type", searchParam.getAttType()); + if (ObjectUtil.isNotEmpty(searchParam.getCateId()) && searchParam.getCateId() > 0) queryWrapper.eq("cate_id", searchParam.getCateId()); + if (ObjectUtil.isNotEmpty(searchParam.getRealName())) queryWrapper.like("real_name", searchParam.getRealName()); + + const iPage: IPage = sysAttachmentMapper.selectPage(new Page<>(page, limit), queryWrapper); + const list: SysAttachmentListVo[] = []; + for (const item of iPage.getRecords()) { + const vo: SysAttachmentListVo = new SysAttachmentListVo(); + BeanUtils.copyProperties(item, vo); + vo.setThumb(CommonUtils.thumbImageSmall(item.getSiteId(), item.getPath())); + list.add(vo); + } + return PageResult.build(page, limit, iPage.getTotal()).setData(list); } /** * image */ async image(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + param.setSiteId(RequestUtils.siteId()); + param.setAttType("image"); + param.setDir("attachment/image/" + param.getSiteId() + "/" + DateFormatUtils.getUploadFormat() + "/"); + return coreUploadService.upload(param); } /** * video */ async video(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + param.setSiteId(RequestUtils.siteId()); + param.setAttType("video"); + param.setDir("attachment/video/" + param.getSiteId() + "/" + DateFormatUtils.getUploadFormat() + "/"); + return coreUploadService.upload(param); } /** * document */ async document(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + param.setSiteId(RequestUtils.siteId()); + param.setIsAttachment(0); + param.setAttType("document"); + param.setStorageType("local"); + param.setDir("attachment/document/" + param.getDocumentType() + "/" + param.getSiteId() + "/" + DateFormatUtils.getUploadFormat() + "/"); + return coreUploadService.upload(param); } /** * batchMoveCategory */ async batchMoveCategory(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: SysAttachment = new SysAttachment(); + model.setCateId(param.getCateId()); + sysAttachmentMapper.update(model, new QueryWrapper() + .eq("site_id", RequestUtils.siteId()) + .in("att_id", param.getAttIds())); } /** * del */ async del(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const sysAttachmentList: SysAttachment[] = sysAttachmentMapper.selectList( + new QueryWrapper() + .eq("site_id", RequestUtils.siteId()) + .in("att_id", param.getAttIds())); + if (sysAttachmentList.length === 0) { + throw new BadRequestException("请选择要删除的附件"); + } + for (const sysAttachment of sysAttachmentList) { + coreUploadService.delete(sysAttachment.getSiteId(), sysAttachment.getStorageType(), sysAttachment.getPath()); + } + sysAttachmentMapper.delete(new QueryWrapper().eq("site_id", RequestUtils.siteId()).in("att_id", param.getAttIds())); } /** * getCategoryList */ async getCategoryList(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const siteId: number = RequestUtils.siteId(); + + const queryWrapper: MPJQueryWrapper = new MPJQueryWrapper(); + queryWrapper.select("id,name,type").eq("site_id", siteId); + if (ObjectUtil.isNotEmpty(path.basename(searchParam))) queryWrapper.like("name", path.basename(searchParam)); + if (ObjectUtil.isNotEmpty(searchParam.getType())) queryWrapper.eq("type", searchParam.getType()); + + const categorys: SysAttachmentCategory[] = sysAttachmentCategoryMapper.selectList(queryWrapper); // 调用 selectList 方法 + + const list: SysAttachmentCategoryListVo[] = []; + for (const item of categorys) { + const vo: SysAttachmentCategoryListVo = new SysAttachmentCategoryListVo(); + BeanUtils.copyProperties(item, vo); + list.add(vo); + } + return list; } /** * addCategory */ async addCategory(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + if (ObjectUtil.isEmpty(addParam.getType())) throw new BadRequestException("type参数不能为空"); + + const model: SysAttachmentCategory = new SysAttachmentCategory(); + model.setSiteId(RequestUtils.siteId()); + model.setType(addParam.getType()); + model.setName(path.basename(addParam)); + sysAttachmentCategoryMapper.insert(model); } /** * editCategory */ async editCategory(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const siteId: number = RequestUtils.siteId(); + + const updateWrapper: UpdateWrapper = new UpdateWrapper<>(); + updateWrapper.eq("site_id", siteId).eq("id", id); + + const model: SysAttachmentCategory = new SysAttachmentCategory(); + model.setName(path.basename(editParam)); + + sysAttachmentCategoryMapper.update(model, updateWrapper); } /** * delCategory */ async delCategory(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const siteId: number = RequestUtils.siteId(); + + const queryWrapper: QueryWrapper = new QueryWrapper() + .eq("site_id", siteId) + .eq("id", id); + + sysAttachmentCategoryMapper.delete(queryWrapper); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-backup-records-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-backup-records-service-impl.service.ts index 7ab11e33..7516b990 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-backup-records-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-backup-records-service-impl.service.ts @@ -14,151 +14,411 @@ export class SysBackupRecordsServiceImplService { * page */ async page(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return []; + const page: number = pageParam.getPage(); + const limit: number = pageParam.getLimit(); + + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + queryWrapper.orderByDesc("create_time"); + + if (searchParam != null) { + if (searchParam.getContent() != null) { + queryWrapper.like("content", searchParam.getContent()); + } + } + + const iPage: IPage = sysBackupRecordsMapper.selectPage(new Page<>(page, limit), queryWrapper); + const list: SysBackupRecordsListVo[] = []; + for (const item of iPage.getRecords()) { + const vo: SysBackupRecordsListVo = new SysBackupRecordsListVo(); + BeanUtils.copyProperties(item, vo); + vo.setCreateTime(DateUtils.timestampToString(item.getCreateTime())); + vo.setCompleteTime(DateUtils.timestampToString(item.getCompleteTime())); + vo.setStatusName(BackupRecordStatusEnum.getNameByStatus(vo.getStatus())); + vo.setBackupDir("webroot/runtime/upgrade/"+vo.getBackupKey()+"/backup"); + list.add(vo); + } + + return PageResult.build(page, limit, iPage.getTotal()).setData(list); } /** * add */ async add(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: SysBackupRecords = new SysBackupRecords(); + BeanUtils.copyProperties(addParam, model); + model.setCreateTime(System.currentTimeMillis() / 1000); + sysBackupRecordsMapper.insert(model); } /** * edit */ async edit(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: SysBackupRecords = sysBackupRecordsMapper.selectOne( + new QueryWrapper() + .eq("id", id)); + Assert.notNull(model, "备份记录不存在"); + + BeanUtils.copyProperties(editParam, model); + sysBackupRecordsMapper.updateById(model); } /** * clear */ async clear(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + sysBackupRecordsMapper.delete(new QueryWrapper() + .lt("create_time", threshold).in("status", STATUS_READY, STATUS_FAIL)); } /** * del */ async del(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const queryWrapper: QueryWrapper = new QueryWrapper(); + + if (delParam.getIds() instanceof ArrayList) { + const intArray: number[] = []; + ((ArrayList) delParam.getIds()).forEach(item => { + Assert.notNull(item, "id不能为空"); + intArray.add(item); + }); + queryWrapper.in("id", intArray); + } else { + queryWrapper.eq("id", delParam.getIds()); + } + + const backupRecords: SysBackupRecords[] = sysBackupRecordsMapper.selectList(queryWrapper); + if (ObjectUtil.isNotEmpty(backupRecords)) { + for (const item of backupRecords) { + const file: string = backupDir(item.getBackupKey(), "backup"); + if (fs.existsSync(file)) { + try { + FileUtils.deleteDirectory(file); + } catch (Exception e) { + } + } + } + sysBackupRecordsMapper.delete(queryWrapper); + } } /** * restore */ async restore(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const record: SysBackupRecords = checkDir(restoreParam); + + const vo: BackupTaskVo = getRestoreTask(); + if (vo == null) { + vo = new BackupTaskVo(); + LinkedHashMap = new LinkedHashMap<>(); + steps.put("startRestore", new BackupTaskVo.Step("startRestore", "开始恢复")); + steps.put("backupCode", new BackupTaskVo.Step("backupCode", "备份源码")); + steps.put("backupSql", new BackupTaskVo.Step("backupSql", "备份数据库")); + steps.put("restoreBackupComplete", new BackupTaskVo.Step("restoreBackupComplete", "备份完成")); + steps.put("restoreCode", new BackupTaskVo.Step("restoreCode", "恢复源码备份")); + steps.put("restoreSql", new BackupTaskVo.Step("restoreSql", "恢复数据库备份")); + steps.put("restoreComplete", new BackupTaskVo.Step("restoreComplete", "恢复完成")); + vo.setKey(RandomUtil.randomString(10)); + vo.setSteps(steps); + vo.setStep("startRestore"); + vo.getExecuted().add("startRestore"); + vo.setContent("开始恢复"); + vo.setTask(""); + + const addParam: SysBackupRecordsParam = new SysBackupRecordsParam(); + addParam.setBackupKey(vo.getKey()); + addParam.setStatus(BackupRecordStatusEnum.STATUS_READY.getStatus()); + addParam.setContent("自动备份"); + addParam.setVersion(this.config.get('version')); + add(addParam); + } + vo.setBackupRecord(record); + if (!vo.getTask() === "") return vo; + + const steps: string[] = vo.getSteps().keySet().stream().collect(Collectors.toList()); + const step: string = steps.indexOf(vo.getStep()) < steps.size() - 1 ? steps.get(steps.indexOf(vo.getStep()) + 1) : ""; + + if (!step.length === 0) { + if (!vo.getExecuted().includes(step)) { + vo.getExecuted().add(step); + } + try { + const param: Record = null; + param = (Map) dynamicMethodCall(step, vo); + if (param != null) { + vo.setParams(param); + } else { + vo.setStep(step); + vo.setParams(null); + } + setBackupRestoreTaskCache(vo); + } catch (Exception e) { + vo.setStep(step); + vo.setTask("fail"); + vo.setContent("备份恢复失败,稍后请手动恢复,备份文件路径:webroot/runtime/upgrade/"+ record.getBackupKey() +"/backup,失败原因:" + e.getMessage()); + setBackupRestoreTaskCache(vo); + // 删除备份记录 + sysBackupRecordsMapper.delete(new QueryWrapper().eq("backup_key", vo.getKey())); + e.printStackTrace(); + console.log("恢复异常."); + + sysUpgradeRecordsService.clearRestoreTaskCache(5); + } + } + return vo; } /** * backup */ async backup(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const vo: BackupTaskVo = getBackupTask(); + if (vo == null) { + vo = new BackupTaskVo(); + vo.setKey(RandomUtil.randomString(10)); + vo.setStep("startBackup"); + vo.getExecuted().add("startBackup"); + vo.setContent("开始备份"); + + const addParam: SysBackupRecordsParam = new SysBackupRecordsParam(); + addParam.setBackupKey(vo.getKey()); + addParam.setStatus(BackupRecordStatusEnum.STATUS_READY.getStatus()); + addParam.setContent("手动备份"); + addParam.setVersion(this.config.get('version')); + add(addParam); + } + + const steps: string[] = vo.getSteps().keySet().stream().collect(Collectors.toList()); + const step: string = steps.indexOf(vo.getStep()) < steps.size() - 1 ? steps.get(steps.indexOf(vo.getStep()) + 1) : ""; + + if (!step.length === 0) { + if (!vo.getExecuted().includes(step)) { + vo.getExecuted().add(step); + } + try { + const param: Record = null; + param = (Map) dynamicMethodCall(step, vo); + if (param != null) { + vo.setParams(param); + } else { + vo.setStep(step); + vo.setParams(null); + } + setBackupTaskCache(vo); + } catch (Exception e) { + vo.setStep(step); + vo.setTask("fail"); + vo.setContent("备份失败,稍后请重新手动备份,失败原因:" + e.getMessage()); + setBackupTaskCache(vo); + // 删除备份记录 + sysBackupRecordsMapper.delete(new QueryWrapper().eq("backup_key", vo.getKey())); + e.printStackTrace(); + console.log("备份异常."); + + sysUpgradeRecordsService.clearBackupTaskCache(5); + } + } + return vo; } /** * backupComplete */ async backupComplete(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const backupRecord: SysBackupRecords = new SysBackupRecords(); + backupRecord.setStatus(UpgradeRecordStatusEnum.STATUS_COMPLETE.getStatus()); + backupRecord.setCompleteTime(System.currentTimeMillis() / 1000); + sysBackupRecordsMapper.update(backupRecord, new QueryWrapper().eq("backup_key", vo.getKey())); + + vo.setTask("end"); + + sysUpgradeRecordsService.clearBackupTaskCache(5); } /** * restoreBackupComplete */ async restoreBackupComplete(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const backupRecord: SysBackupRecords = new SysBackupRecords(); + backupRecord.setStatus(UpgradeRecordStatusEnum.STATUS_COMPLETE.getStatus()); + backupRecord.setCompleteTime(System.currentTimeMillis() / 1000); + sysBackupRecordsMapper.update(backupRecord, new QueryWrapper().eq("backup_key", vo.getKey())); } /** * restoreComplete */ async restoreComplete(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + vo.setTask("end"); + sysUpgradeRecordsService.clearRestoreTaskCache(5); } /** * setBackupTaskCache */ async setBackupTaskCache(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const cache: Cached = CacheFactory.getCacheOperator(); + cache.put("backup_task", JSONUtil.parseObj(vo).toString(), 1800); } /** * setBackupRestoreTaskCache */ async setBackupRestoreTaskCache(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const cache: Cached = CacheFactory.getCacheOperator(); + cache.put("backup_restore_task", JSONUtil.parseObj(vo).toString(), 1800); } /** * clearBackupTaskCache */ async clearBackupTaskCache(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + if (delayed > 0) { + try { + Thread.sleep(delayed * 1000); + } catch (Exception e) { + } + } + const cache: Cached = CacheFactory.getCacheOperator(); + cache.remove("backup_task"); } /** * clearRestoreTaskCache */ async clearRestoreTaskCache(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + if (delayed > 0) { + try { + Thread.sleep(delayed * 1000); + } catch (Exception e) { + } + } + const cache: Cached = CacheFactory.getCacheOperator(); + cache.remove("backup_restore_task"); } /** * getBackupTask */ async getBackupTask(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const cache: Cached = CacheFactory.getCacheOperator(); + const data: any = cache.get("backup_task"); + if (data == null) return null; + return JSONUtil.toBean(JSONUtil.parseObj(data), BackupTaskVo.class); } /** * getRestoreTask */ async getRestoreTask(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const cache: Cached = CacheFactory.getCacheOperator(); + const data: any = cache.get("backup_restore_task"); + if (data == null) return null; + return JSONUtil.toBean(JSONUtil.parseObj(data), BackupTaskVo.class); } /** * checkDir */ async checkDir(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const record: SysBackupRecords = sysBackupRecordsMapper.selectById(param.getId()); + Assert.notNull(record, "备份记录不存在"); + if (!record.getStatus() === BackupRecordStatusEnum.STATUS_COMPLETE.getStatus()) throw new Error("备份记录未完成"); + + const code: string = this.config.get('webRootDownRuntime' + "upgrade/"+ record.getBackupKey() + "/backup/code"); + if (!fs.existsSync(code)) throw new Error("未找到备份的源码文件"); + + const sql: string = this.config.get('webRootDownRuntime' + "upgrade/"+ record.getBackupKey() + "/backup/sql"); + if (!fs.existsSync(sql)) throw new Error("未找到备份的数据库文件"); + + return record; } /** * checkPermission */ async checkPermission(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const upgradeCheck: boolean = true; + + const checkResult: Record = new Record(); + const rootPath: string = ""; + const runtimePath: string = ""; + const readableDir: JSONArray = new JSONArray(); + const writeDir: JSONArray = new JSONArray(); + + if (this.config.get('envType') === "dev") { + rootPath = this.config.get('projectRoot') + "/"; + runtimePath = rootPath; + + readableDir.put(new Record().set("dir", rootPath + "niucloud-addon").set("status", true)); + writeDir.put(new Record().set("dir", rootPath + "niucloud-addon").set("status", true)); + readableDir.put(new Record().set("dir", rootPath + "webroot").set("status", true)); + writeDir.put(new Record().set("dir", rootPath + "webroot").set("status", true)); + } else { + rootPath = this.config.get('webRoot') + "/"; + runtimePath = rootPath + "runtime/"; + + readableDir.put(new Record().set("dir", runtimePath).set("status", true)); + writeDir.put(new Record().set("dir", runtimePath).set("status", true)); + } + + readableDir.put(new Record().set("dir", runtimePath + "admin").set("status", true)); + readableDir.put(new Record().set("dir", runtimePath + "uni-app").set("status", true)); + readableDir.put(new Record().set("dir", runtimePath + "web").set("status", true)); + + writeDir.put(new Record().set("dir", runtimePath + "admin").set("status", true)); + writeDir.put(new Record().set("dir", runtimePath + "uni-app").set("status", true)); + writeDir.put(new Record().set("dir", runtimePath + "web").set("status", true)); + + for (const i of number = 0; i < readableDir.size(); i++) { + const dir: Record = readableDir.getJSONObject(i); + dir.set("status", dir.getStr("dir").canRead()); + dir.set("dir", dir.getStr("dir").replace(rootPath, "")); + readableDir.set(i, dir); + if (!dir.getBool("status")) upgradeCheck = false; + } + + for (const i of number = 0; i < writeDir.size(); i++) { + const dir: Record = writeDir.getJSONObject(i); + dir.set("status", dir.getStr("dir").canWrite()); + dir.set("dir", dir.getStr("dir").replace(rootPath, "")); + writeDir.set(i, dir); + if (!dir.getBool("status")) upgradeCheck = false; + } + + checkResult.put("is_pass", upgradeCheck); + checkResult.put("dir", new Record().set("is_readable", readableDir).set("is_write", writeDir)); + return checkResult; } /** * dynamicMethodCall */ async dynamicMethodCall(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + try { + // 获取当前类的 Class 对象 + Class clazz = this.getClass(); + // 获取方法对象 + java.lang.reflect.const method: Method = clazz.getMethod(methodName, extractParameterTypes(args)); + // 调用方法 + console.log("dynamicMethodCall method:" + methodName); + const result: any = method.invoke(this, args); + if (method.getReturnType() == void.class) { + return null; + } else { + return result; + } + } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { + if (e instanceof InvocationTargetException) { + ((InvocationTargetException) e).getCause().printStackTrace(); + throw new BadRequestException(((InvocationTargetException) e).getCause().getMessage()); + } else { + e.printStackTrace(); + } + return null; + } } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-config-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-config-service-impl.service.ts index d25550cd..ad77055e 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-config-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-config-service-impl.service.ts @@ -14,127 +14,111 @@ export class SysConfigServiceImplService { * getWebSite */ async getWebSite(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return coreSysConfigService.getWebSite(RequestUtils.siteId()); } /** * setWebSite */ async setWebSite(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + coreSysConfigService.setWebSite(RequestUtils.siteId(), configParam); } /** * getService */ async getService(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return coreSysConfigService.getService(RequestUtils.siteId()); } /** * getCopyRight */ async getCopyRight(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return coreSysConfigService.getCopyRight(RequestUtils.siteId()); } /** * setCopyRight */ async setCopyRight(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + coreSysConfigService.setCopyRight(RequestUtils.siteId(), configParam); } /** * getMap */ async getMap(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return coreSysConfigService.getMap(RequestUtils.siteId()); } /** * setMap */ async setMap(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + coreSysConfigService.setMap(RequestUtils.siteId(), configParam); } /** * getDeveloperToken */ async getDeveloperToken(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return coreSysConfigService.getDeveloperToken(); } /** * setDeveloperToken */ async setDeveloperToken(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + coreSysConfigService.setDeveloperToken(configParam); } /** * getLayout */ async getLayout(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return coreSysConfigService.getLayout(RequestUtils.siteId()); } /** * setLayout */ async setLayout(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + coreSysConfigService.setLayout(RequestUtils.siteId(), configParam); } /** * getThemeColor */ async getThemeColor(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return coreSysConfigService.getThemeColor(RequestUtils.siteId()); } /** * setThemeColor */ async setThemeColor(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + coreSysConfigService.setThemeColor(RequestUtils.siteId(), configParam); } /** * getLogin */ async getLogin(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return coreSysConfigService.getLogin(RequestUtils.siteId()); } /** * setLogin */ async setLogin(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + coreSysConfigService.setLogin(RequestUtils.siteId(), configParam); } /** * getUrl */ async getUrl(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return coreSysConfigService.getSceneDomain(RequestUtils.siteId()); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-export-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-export-service-impl.service.ts index 214bfdd4..3aa2539e 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-export-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-export-service-impl.service.ts @@ -14,31 +14,95 @@ export class SysExportServiceImplService { * list */ async list(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return []; + const page: number = pageParam.getPage(); + const limit: number = pageParam.getLimit(); + + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + queryWrapper.orderByDesc("id"); + queryWrapper.like("export_key", searchParam.getExportKey()); + + if (ObjectUtil.isNotEmpty(searchParam.getExportKey())) { + queryWrapper.eq("export_status", searchParam.getExportStatus()); + } + + if (ObjectUtil.isNotEmpty(searchParam.getCreateTime())) { + String[] createTime = searchParam.getCreateTime(); + const startTime: number = (createTime[0] == null) ? 0 : DateUtils.StringToTimestamp(createTime[0]); + const endTime: number = (createTime[1] == null) ? 0 : DateUtils.StringToTimestamp(createTime[1]); + if (startTime > 0 && endTime > 0) { + queryWrapper.between("create_time", startTime, endTime); + } else if (startTime > 0 && endTime == 0) { + queryWrapper.ge("create_time", startTime); + } else if (startTime == 0 && endTime > 0) { + queryWrapper.le("create_time", startTime); + } + } + + const results: JSONArray = JsonModuleLoader.build().mergeResultSet("export/ExportType.json"); + + const iPage: IPage = sysExportMapper.selectPage(new Page<>(page, limit), queryWrapper); + const converted: IPage = iPage.convert(export => { + SysExportListVo vo = new SysExportListVo(); + BeanUtils.copyProperties(export, vo); + vo.setCreateTime(DateUtils.timestampToString(export.getCreateTime())); + vo.setExportStatusName(ExportEnum.getNameByCode(export.getExportStatus())); + results.stream() + .map(JSONUtil::parseObj) + .filter(o => o.containsKey(export.getExportKey())) + .findFirst() + .map(o => o.getJSONObject(export.getExportKey())) + .ifPresent(o => vo.setExportKeyName(o.getStr("name"))); + + return vo; + }); + + return PageResult.build(converted); } /** * del */ async del(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: SysExport = sysExportMapper.selectOne( + new QueryWrapper() + .eq("id", id) + .last("limit 1")); + + Assert.notNull(model, "数据不存在!"); + + sysExportMapper.delete(new QueryWrapper().eq("id", id)); } /** * checkExportData */ async checkExportData(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const pageParam: PageParam = new PageParam(); + pageParam.setPage(number.parseInt(whereMap.getOrDefault("page", 0).toString())); + pageParam.setLimit(number.parseInt(whereMap.getOrDefault("limit", 0).toString())); + const jsonArray: JSONArray = coreExportService.getExportData(RequestUtils.siteId(), type, JSONUtil.parseObj(whereMap), pageParam); + return !jsonArray.length === 0; } /** * exportData */ async exportData(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const siteId: number = RequestUtils.siteId(); + const pageParam: PageParam = new PageParam(); + pageParam.setPage(whereMap.getOrDefault("page", 0)); + pageParam.setLimit(whereMap.getOrDefault("limit", 0)); + + const dataColumn: JSONArray = coreExportService.getExportDataColumn(type); + const dataArray: JSONArray = coreExportService.getExportData(siteId, type, JSONUtil.parseObj(whereMap), pageParam); + + const export: SysExport = new SysExport(); + export.setSiteId(RequestUtils.siteId()); + export.setExportKey(type); + export.setExportNum(CollectionUtil.size(dataArray)); + export.setCreateTime(System.currentTimeMillis() / 1000); + coreExportService.add(export); + + coreExportService.export(siteId, export.getId(), type, dataColumn, dataArray); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-menu-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-menu-service-impl.service.ts index 3548bb8d..3a6d500e 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-menu-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-menu-service-impl.service.ts @@ -14,103 +14,309 @@ export class SysMenuServiceImplService { * info */ async info(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: SysMenu = sysMenuMapper.selectOne( + new QueryWrapper() + .eq("id", id) + .last("limit 1")); + + Assert.notNull(model, "数据不存在"); + + const vo: SysMenuInfoVo = new SysMenuInfoVo(); + BeanUtils.copyProperties(model, vo); + return vo; } /** * get */ async get(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + queryWrapper.eq("app_type", appType); + queryWrapper.eq("menu_key", menuKey); + const sysMenu: SysMenu = sysMenuMapper.selectOne(queryWrapper); + Assert.notNull(sysMenu, "菜单数据不存在"); + const sysMenuInfoVo: SysMenuInfoVo = new SysMenuInfoVo(); + BeanUtil.copyProperties(sysMenu, sysMenuInfoVo); + return sysMenuInfoVo; } /** * add */ async add(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const sysMenu: SysMenu = this.find(addParam.getMenuKey(), addParam.getAppType()); + if(ObjectUtil.isNotNull(sysMenu)){ + throw new AdminException("validate_menu.exit_menu_key"); + } + + const model: SysMenu = new SysMenu(); + BeanUtil.copyProperties(addParam, model); + model.setCreateTime(DateUtils.currTime()); + model.setSource(MenuSourceEnum.CREATE.getCode()); + sysMenuMapper.insert(model); + /** 清理缓存 */ + cached.tag(cacheTagName).clear(); } /** * edit */ async edit(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: SysMenu = sysMenuMapper.selectOne( + new QueryWrapper() + .eq("app_type", appType) + .eq("menu_key", menuKey) + .last("limit 1")); + Assert.notNull(model, "数据不存在!"); + BeanUtil.copyProperties(editParam, model); + sysMenuMapper.updateById(model); + /** 清理缓存 */ + cached.tag(cacheTagName).clear(); } /** * del */ async del(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const keyCount: number = sysMenuMapper.selectCount(new QueryWrapper().eq("parent_key", menuKey).eq("app_type", appType)); + if(keyCount>0){ + throw new AdminException("MENU_NOT_ALLOW_DELETE"); + } + sysMenuMapper.delete(new QueryWrapper().eq("app_type", appType).eq("menu_key", menuKey)); + /** 清理缓存 */ + cached.tag(cacheTagName).clear(); } /** * menuTree */ async menuTree(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return cached.rememberObject(useCache, cacheTagName, Arrays.asList("menuTree"), uniqueKey => { + + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + queryWrapper.eq("app_type", "site"); + queryWrapper.orderByDesc(Arrays.asList("sort", "id")); + const sysMenuList: SysMenu[] = sysMenuMapper.selectList(queryWrapper); + const jsonArray: JSONArray = JSONUtil.parseArray(JacksonUtils.toSnakeCaseJSONString(sysMenuList)); + return TreeUtils.listToTree(jsonArray, "menu_key", "parent_key", "children"); + }); } /** * getMenuListByCondition */ async getMenuListByCondition(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return cached.remember(useCache, cacheTagName, Arrays.asList("getMenuListByCondition", appType, siteId, status, isButton, menuKeys, addon), uniqueKey => { + const addonList: string[] = coreSiteService.getAddonKeysBySiteId(siteId); + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + if (ObjectUtil.isNotEmpty(appType)) { + queryWrapper.eq("app_type", appType); + } + if (addonList.size() > 0) { + addonList.add(""); + queryWrapper.in("addon", addonList); + } else { + queryWrapper.in("addon", ""); + } + if (status != 100) { + queryWrapper.eq("status", status); + } + if (menuKeys.size() > 0) { + queryWrapper.in("menu_key", menuKeys); + } + if (isButton == 0) { + queryWrapper.ne("menu_type", 2); + } + + //排除菜单 后期处理 + + const menuList: SysMenu[] = sysMenuMapper.selectList(queryWrapper); + return menuList; + }); } /** * getMenuListByKeys */ async getMenuListByKeys(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const menuKeysVal: string = String.join("_", menuKeys); + const menuKeysValMD5: string = SecureUtil.md5(menuKeysVal); + const menuCatch: string = "menu" + menuKeysValMD5 + isTree.toString() + addon + siteId; + const outterMenuList: SysMenu[] = cached.cache(useCache, cacheTagName, menuCatch, uniqueKey => { + //通过站点id获取支持的应用插件 + List addonList = coreSiteService.getAddonKeysBySiteId(siteId); + + //组装查询条件 + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + if (menuKeys.size() > 0) { + queryWrapper.in("menu_key", menuKeys); + } + const paichuList: SysMenu[] = null; + if(!addon === "all"){ + queryWrapper.eq("addon",addon); + + const jsonModuleLoader: JsonModuleLoader = new JsonModuleLoader(); + const jsonObject: Record = jsonModuleLoader.getResultElement(addon, "menu/site.json"); + const delJsonInfo: JSONArray = jsonObject.getJSONArray("delete"); + paichuList = JSONUtil.toList(delJsonInfo,SysMenu.class); + }else{ + queryWrapper.in("addon", addonList); + for (const i of number = 0; i = jsonModuleLoader.getResultElement(addonList.get(i), "menu/site.json"); + const delJsonInfo: JSONArray = jsonObject.getJSONArray("delete"); + paichuList = JSONUtil.toList(delJsonInfo,SysMenu.class); + } + } + if (ObjectUtil.isNotEmpty(appType)) { + queryWrapper.eq("app_type", appType); + } + + //排除菜单 + if(ObjectUtil.isNotNull(paichuList) && paichuList.size()>0){ + const paichuArr: string[] = []; + for (const i of number = 0; i { - // TODO: 实现业务逻辑 - return null; + //站点const siteId: id + number = RequestUtils.siteId(); + + // 缓存Key值计算参数 + const key: string = "menuList_"+appType+"_"+status + siteId.toString(); + + const outterMenuList: SysMenu[] = cached.cache(useCache, cacheTagName, key, uniqueKey => { + List menuList = []; + try { + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + if (ObjectUtil.isNotEmpty(appType)) { + queryWrapper.eq("app_type", appType); + } + + //站点相关插件 + if (!RequestUtils.defaultSiteId() === siteId) { + const addonList: string[] = coreSiteService.getAddonKeysBySiteId(siteId); + + if (addonList.size() > 0) { + addonList.add(""); + queryWrapper.in("addon", addonList); + } + } + + if (status != 100) { + queryWrapper.eq("status", status); + } + //排除菜单 + menuList = sysMenuMapper.selectList(queryWrapper); + } catch (Exception e) { + throw new BaseException("查询菜单错误"); + } + return menuList; + }); + + const jsonArray: JSONArray = JSONUtil.parseArray(JacksonUtils.toSnakeCaseJSONString(outterMenuList)); + return TreeUtils.listToTree(jsonArray, "menu_key", "parent_key", "children"); } /** * find */ async find(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + if(ObjectUtil.isNotNull(menuKey) && ObjectUtil.isNotEmpty(menuKey)){ + queryWrapper.eq("menu_key", menuKey); + } + if(ObjectUtil.isNotNull(appType) && ObjectUtil.isNotEmpty(appType)){ + queryWrapper.eq("app_type", appType); + } + const sysMenu: SysMenu = sysMenuMapper.selectOne(queryWrapper); + return sysMenu; } /** * getMenuByTypeDir */ async getMenuByTypeDir(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const outterMenuList: SysMenu[] = cached.remember(useCache, cacheTagName, Arrays.asList("getMenuByTypeDir", addon), uniqueKey => { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("app_type", "site"); + queryWrapper.eq("menu_type", "0"); + queryWrapper.eq("addon", addon === "system"? "": addon); + queryWrapper.orderByDesc("sort"); + return sysMenuMapper.selectList(queryWrapper); + }); + + //暂无多语言设计 + const jsonArray: JSONArray = JSONUtil.parseArray(JacksonUtils.toSnakeCaseJSONString(outterMenuList)); + return TreeUtils.listToTree(jsonArray, "menu_key", "parent_key", "children"); } /** * getAddonMenu */ async getAddonMenu(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return cached.rememberObject(useCache, cacheTagName, Arrays.asList("getAddonMenu", appKey, status, isTree.toString(), isButton.toString()), uniqueKey => { + + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + queryWrapper.eq("app_type", "site"); + queryWrapper.eq("addon", appKey); + queryWrapper.orderByDesc(Arrays.asList("sort", "id")); + if (!status === "all") { + queryWrapper.eq("status", status); + } + if (isButton == 0) { + queryWrapper.in("menu_type", new number[]{0, 1}); + } + const sysMenuList: SysMenu[] = sysMenuMapper.selectList(queryWrapper); + const jsonArray: JSONArray = JSONUtil.parseArray(JacksonUtils.toSnakeCaseJSONString(sysMenuList)); + if (isTree == 0) { + return jsonArray; + } + return TreeUtils.listToTree(jsonArray, "menu_key", "parent_key", "children"); + }); } /** * getSystemMenu */ async getSystemMenu(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return cached.rememberObject(useCache, cacheTagName, Arrays.asList("getSystemMenu", status, isTree.toString(), isButton.toString()), uniqueKey => { + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + queryWrapper.eq("app_type", "site"); + queryWrapper.eq("addon", ""); + queryWrapper.orderByDesc(Arrays.asList("sort", "id")); + if (!status === "all") { + queryWrapper.eq("status", status); + } + if (isButton == 0) { + queryWrapper.in("menu_type", new number[]{0, 1}); + } + const sysMenuList: SysMenu[] = sysMenuMapper.selectList(queryWrapper); + const jsonArray: JSONArray = JSONUtil.parseArray(JacksonUtils.toSnakeCaseJSONString(sysMenuList)); + if (isTree == 0) { + return jsonArray; + } + return TreeUtils.listToTree(jsonArray, "menu_key", "parent_key", "children"); + }); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-notice-log-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-notice-log-service-impl.service.ts index 7070e40d..53456c37 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-notice-log-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-notice-log-service-impl.service.ts @@ -14,15 +14,43 @@ export class SysNoticeLogServiceImplService { * list */ async list(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return []; + const page: number = pageParam.getPage(); + const limit: number = pageParam.getLimit(); + + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + queryWrapper.eq("site_id", RequestUtils.siteId()); + if (ObjectUtil.isNotEmpty(searchParam.getReceiver())) queryWrapper.eq("receiver", searchParam.getReceiver()); + if (ObjectUtil.isNotEmpty(searchParam.getKey())) queryWrapper.eq("`key`", searchParam.getKey()); + if (ObjectUtil.isNotEmpty(searchParam.getCreateTime())) QueryMapperUtils.buildByTime(queryWrapper, "create_time", searchParam.getCreateTime()); + queryWrapper.orderByDesc("id"); + + const noticeEnum: Record = NoticeEnum.getNotice(); + + const iPage: IPage = sysNoticeLogMapper.selectPage(new Page<>(page, limit), queryWrapper); + const list: SysNoticeLogListVo[] = []; + for (const item of iPage.getRecords()) { + const vo: SysNoticeLogListVo = new SysNoticeLogListVo(); + BeanUtils.copyProperties(item, vo); + vo.setName(noticeEnum.get(item.getKey()) != null ? noticeEnum.get(item.getKey()).getName() : ""); + list.add(vo); + } + return PageResult.build(page, limit, iPage.getTotal()).setData(list); } /** * info */ async info(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: SysNoticeLog = sysNoticeLogMapper.selectOne( + new QueryWrapper() + .eq("id", id) + .eq("site_id", RequestUtils.siteId()) + .last("limit 1")); + + Assert.notNull(model, "数据不存在"); + + const vo: SysNoticeLogInfoVo = new SysNoticeLogInfoVo(); + BeanUtils.copyProperties(model, vo); + return vo; } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-notice-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-notice-service-impl.service.ts index 3a098140..9544222f 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-notice-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-notice-service-impl.service.ts @@ -14,39 +14,94 @@ export class SysNoticeServiceImplService { * list */ async list(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return []; + const page: number = pageParam.getPage(); + const limit: number = pageParam.getLimit(); + + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + queryWrapper.orderByDesc("id"); + + const iPage: IPage = sysNoticeMapper.selectPage(new Page<>(page, limit), queryWrapper); + const list: SysNoticeListVo[] = []; + for (const item of iPage.getRecords()) { + const vo: SysNoticeListVo = new SysNoticeListVo(); + BeanUtils.copyProperties(item, vo); + list.add(vo); + } + return PageResult.build(page, limit, iPage.getTotal()).setData(list); } /** * info */ async info(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: SysNotice = sysNoticeMapper.selectOne( + new QueryWrapper() + .eq("id", id) + .last("limit 1")); + + Assert.notNull(model, "数据不存在"); + + const vo: SysNoticeInfoVo = new SysNoticeInfoVo(); + BeanUtils.copyProperties(model, vo); + return vo; } /** * add */ async add(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: SysNotice = new SysNotice(); + model.setSiteId(addParam.getSiteId()); + model.setKey(addParam.getKey()); + model.setSmsContent(addParam.getSmsContent()); + model.setIsWechat(addParam.getIsWechat()); + model.setIsWeapp(addParam.getIsWeapp()); + model.setIsSms(addParam.getIsSms()); + model.setWechatTemplateId(addParam.getWechatTemplateId()); + model.setWeappTemplateId(addParam.getWeappTemplateId()); + model.setSmsId(addParam.getSmsId()); + model.setCreateTime(System.currentTimeMillis() / 1000); + model.setWechatFirst(addParam.getWechatFirst()); + model.setWechatRemark(addParam.getWechatRemark()); + sysNoticeMapper.insert(model); } /** * edit */ async edit(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: SysNotice = sysNoticeMapper.selectOne( + new QueryWrapper() + .eq("id", id) + .last("limit 1")); + + Assert.notNull(model, "数据不存在!"); + model.setId(id); + model.setSiteId(editParam.getSiteId()); + model.setKey(editParam.getKey()); + model.setSmsContent(editParam.getSmsContent()); + model.setIsWechat(editParam.getIsWechat()); + model.setIsWeapp(editParam.getIsWeapp()); + model.setIsSms(editParam.getIsSms()); + model.setWechatTemplateId(editParam.getWechatTemplateId()); + model.setWeappTemplateId(editParam.getWeappTemplateId()); + model.setSmsId(editParam.getSmsId()); + model.setWechatFirst(editParam.getWechatFirst()); + model.setWechatRemark(editParam.getWechatRemark()); + sysNoticeMapper.updateById(model); } /** * del */ async del(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: SysNotice = sysNoticeMapper.selectOne( + new QueryWrapper() + .eq("id", id) + .last("limit 1")); + + Assert.notNull(model, "数据不存在!"); + + sysNoticeMapper.delete(new QueryWrapper().eq("id", id)); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-notice-sms-log-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-notice-sms-log-service-impl.service.ts index 6b4b807b..c2006e51 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-notice-sms-log-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-notice-sms-log-service-impl.service.ts @@ -14,15 +14,46 @@ export class SysNoticeSmsLogServiceImplService { * list */ async list(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return []; + const page: number = pageParam.getPage(); + const limit: number = pageParam.getLimit(); + + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + queryWrapper.eq("site_id", RequestUtils.siteId()); + if (ObjectUtil.isNotEmpty(searchParam.getKey())) queryWrapper.eq("`key`", searchParam.getKey()); + if (ObjectUtil.isNotEmpty(searchParam.getSmsType())) queryWrapper.eq("sms_type", searchParam.getSmsType()); + if (ObjectUtil.isNotEmpty(searchParam.getMobile())) queryWrapper.eq("mobile", searchParam.getMobile()); + if (ObjectUtil.isNotEmpty(searchParam.getCreateTime())) QueryMapperUtils.buildByTime(queryWrapper,"create_time" ,searchParam.getCreateTime()); + queryWrapper.orderByDesc("id"); + + const smsTypeEnum: Record = SmsTypeEnum.getType(); + const notice: Record = NoticeEnum.getNotice(); + + const iPage: IPage = sysNoticeSmsLogMapper.selectPage(new Page<>(page, limit), queryWrapper); + const list: SysNoticeSmsLogListVo[] = []; + for (const item of iPage.getRecords()) { + const vo: SysNoticeSmsLogListVo = new SysNoticeSmsLogListVo(); + BeanUtils.copyProperties(item, vo); + vo.setSmsTypeName(smsTypeEnum.getByPath(item.getSmsType() + ".name", String.class)); + vo.setName(ObjectUtil.defaultIfNull(notice.get(item.getKey()).getName(), "")); + list.add(vo); + } + return PageResult.build(page, limit, iPage.getTotal()).setData(list); } /** * info */ async info(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: SysNoticeSmsLog = sysNoticeSmsLogMapper.selectOne( + new QueryWrapper() + .eq("id", id) + .eq("site_id", RequestUtils.siteId()) + .last("limit 1")); + if (model == null) return null; + + const vo: SysNoticeSmsLogInfoVo = new SysNoticeSmsLogInfoVo(); + BeanUtils.copyProperties(model, vo); + + return vo; } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-poster-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-poster-service-impl.service.ts index 4ce089ed..3547bee8 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-poster-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-poster-service-impl.service.ts @@ -14,87 +14,211 @@ export class SysPosterServiceImplService { * page */ async page(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return []; + const page: number = pageParam.getPage(); + const limit: number = pageParam.getLimit(); + + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + queryWrapper.eq("site_id", RequestUtils.siteId()); + queryWrapper.orderByDesc("id"); + + if (ObjectUtil.isNotEmpty(path.basename(searchParam))) queryWrapper.like("name", path.basename(searchParam)); + if (ObjectUtil.isNotEmpty(searchParam.getType())) queryWrapper.eq("type", searchParam.getType()); + + const iPage: IPage = sysPosterMapper.selectPage(new Page<>(page, limit), queryWrapper); + const list: SysPosterListVo[] = []; + for (const item of iPage.getRecords()) { + const vo: SysPosterListVo = new SysPosterListVo(); + BeanUtils.copyProperties(item, vo); + list.add(vo); + } + return PageResult.build(page, limit, iPage.getTotal()).setData(list); } /** * list */ async list(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return []; + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + queryWrapper.eq("site_id", RequestUtils.siteId()); + queryWrapper.orderByDesc("id"); + + if (ObjectUtil.isNotEmpty(path.basename(searchParam))) queryWrapper.like("name", path.basename(searchParam)); + if (ObjectUtil.isNotEmpty(searchParam.getType())) queryWrapper.eq("type", searchParam.getType()); + + const records: SysPoster[] = sysPosterMapper.selectList(queryWrapper); + const list: SysPosterListVo[] = []; + for (const item of records) { + const vo: SysPosterListVo = new SysPosterListVo(); + BeanUtils.copyProperties(item, vo); + list.add(vo); + } + return list; } /** * info */ async info(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: SysPoster = sysPosterMapper.selectOne( + new QueryWrapper() + .eq("id", id) + .eq("site_id", RequestUtils.siteId())); + + Assert.notNull(model, "海报不存在"); + + const vo: SysPosterInfoVo = new SysPosterInfoVo(); + BeanUtils.copyProperties(model, vo); + return vo; } /** * add */ async add(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + if (addParam.getIsDefault() === 1) { + const update: UpdateWrapper = new UpdateWrapper<>(); + update.setSql("is_default = 0"); + update.eq("type", addParam.getType()); + update.eq("is_default", 1); + update.eq("site_id", RequestUtils.siteId()); + sysPosterMapper.update(null, update); + } + const model: SysPoster = new SysPoster(); + BeanUtils.copyProperties(addParam, model); + model.setSiteId(RequestUtils.siteId()); + model.setCreateTime(System.currentTimeMillis() / 1000); + sysPosterMapper.insert(model); } /** * edit */ async edit(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: SysPoster = sysPosterMapper.selectOne( + new QueryWrapper() + .eq("id", id) + .eq("site_id", RequestUtils.siteId())); + + Assert.notNull(model, "海报不存在!"); + + if (editParam.getIsDefault() === 1) { + const update: UpdateWrapper = new UpdateWrapper<>(); + update.setSql("is_default = 0"); + update.eq("type", editParam.getType()); + update.eq("is_default", 1); + update.eq("site_id", RequestUtils.siteId()); + sysPosterMapper.update(null, update); + } + + BeanUtils.copyProperties(editParam, model); + model.setUpdateTime(System.currentTimeMillis() / 1000); + sysPosterMapper.updateById(model); } /** * del */ async del(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: SysPoster = sysPosterMapper.selectOne( + new QueryWrapper() + .eq("id", id) + .eq("site_id", RequestUtils.siteId())); + + Assert.notNull(model, "海报不存在!"); + + sysPosterMapper.delete(new QueryWrapper().eq("id", id)); } /** * init */ async init(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const vo: SysPosterInitVo = new SysPosterInitVo(); + BeanUtils.copyProperties(param, vo); + + if (ObjectUtil.isNotEmpty(param.getId()) && param.getId() > 0) { + const poster: SysPoster = sysPosterMapper.selectOne( + new QueryWrapper() + .eq("id", param.getId()) + .eq("site_id", RequestUtils.siteId())); + Assert.notNull(poster, "海报不存在!"); + BeanUtils.copyProperties(poster, vo); + } + + vo.setPosterType(PosterTypeEnum.getType(vo.getType())); + if (ObjectUtil.isNotEmpty(vo.getPosterType()) && ObjectUtil.isEmpty(vo.getAddon())) vo.setAddon(vo.getPosterType().getStr("addon", "")); + + const components: Record = JsonModuleLoader.build().mergeResultElement("poster/components.json"); + + vo.setComponent(new Record()); + for (const key of components.keySet()) { + const item: Record = components.getJSONObject(key); + if (item.getJSONObject("list") == null || item.getJSONObject("list").keySet().size() == 0) { + continue; + } + const support: JSONArray = ObjectUtil.defaultIfNull(item.getJSONArray("support"), new JSONArray()); + if (!key === vo.getType() && support.size() > 0 && !support.includes(vo.getType())) { + continue; + } + vo.getComponent().put(key, item); + } + + return vo; } /** * template */ async template(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return corePosterService.template(param.getAddon(), param.getType()); } /** * modifyStatus */ async modifyStatus(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: SysPoster = new SysPoster(); + model.setStatus(status); + sysPosterMapper.update(model, new QueryWrapper().eq("id", id).eq("site_id", RequestUtils.siteId())); } /** * modifyDefault */ async modifyDefault(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: SysPoster = sysPosterMapper.selectOne( + new QueryWrapper() + .eq("id", id) + .eq("site_id", RequestUtils.siteId())); + + Assert.notNull(model, "海报不存在!"); + + const update: UpdateWrapper = new UpdateWrapper<>(); + update.setSql("is_default = 0"); + update.eq("type", model.getType()); + update.eq("is_default", 1); + update.eq("site_id", RequestUtils.siteId()); + sysPosterMapper.update(null, update); + + const updateModel: SysPoster = new SysPoster(); + updateModel.setIsDefault(1); + updateModel.setId(id); + sysPosterMapper.updateById(updateModel); } /** * preview */ async preview(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const getPosterParam: GetPosterParam = new GetPosterParam(); + getPosterParam.setId(param.getId()); + getPosterParam.setType(param.getType()); + getPosterParam.setSiteId(RequestUtils.siteId()); + getPosterParam.setChannel(ObjectUtil.defaultIfNull(param.getChannel(), "h5")); + const posterParam: Record = {}; + posterParam.put("mode", "preview"); + getPosterParam.setParam(posterParam); + getPosterParam.setIsThrowException(true); + return corePosterService.get(getPosterParam); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-printer-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-printer-service-impl.service.ts index 2e73214a..f6c046e7 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-printer-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-printer-service-impl.service.ts @@ -14,87 +14,204 @@ export class SysPrinterServiceImplService { * page */ async page(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return []; + const page: number = pageParam.getPage(); + const limit: number = pageParam.getLimit(); + + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + + queryWrapper.eq("site_id", RequestUtils.siteId()) + .orderByDesc("create_time"); + + if (ObjectUtil.isNotEmpty(searchParam.getPrinterName())) { + queryWrapper.like("printer_name", searchParam.getPrinterName()); + } + + const iPage: IPage = sysPrinterMapper.selectPage(new Page<>(page, limit), queryWrapper); + const list: SysPrinterListVo[] = []; + for (const item of iPage.getRecords()) { + const vo: SysPrinterListVo = new SysPrinterListVo(); + BeanUtils.copyProperties(item, vo); + vo.setBrandName(SysPrinterBrandEnum.getNameByBrand(item.getBrand())); + vo.setTrigger(JSONArray.parseArray(item.getTrigger(), String.class)); + list.add(vo); + } + return PageResult.build(page, limit, iPage.getTotal()).setData(list); } /** * getList */ async getList(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + + queryWrapper.eq("site_id", RequestUtils.siteId()) + .orderByDesc("create_time") + .select("printer_id, apikey, brand, create_time, open_id, print_width, printer_code, printer_key, printer_name, site_id, status, template_type, 'trigger', update_time, value"); + + if (ObjectUtil.isNotEmpty(param.getPrinterName())) { + queryWrapper.like("printer_name", param.getPrinterName()); + } + + const list: SysPrinterListVo[] = []; + for (const item of sysPrinterMapper.selectList(queryWrapper)) { + const vo: SysPrinterListVo = new SysPrinterListVo(); + BeanUtils.copyProperties(item, vo); + vo.setBrandName(SysPrinterBrandEnum.getNameByBrand(item.getBrand())); + vo.setValue(JSON.parseObject(item.getValue())); + vo.setTrigger(JSONArray.parseArray(item.getTrigger(), String.class)); + list.add(vo); + } + + return list; } /** * info */ async info(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: SysPrinter = sysPrinterMapper.selectOne( + new QueryWrapper() + .eq("printer_id", id) + .eq("site_id", RequestUtils.siteId())); + + Assert.notNull(model, "小票打印机不存在"); + + const vo: SysPrinterInfoVo = new SysPrinterInfoVo(); + BeanUtils.copyProperties(model, vo); + vo.setValue(JSON.parseObject(model.getValue())); + return vo; } /** * add */ async add(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: SysPrinter = new SysPrinter(); + BeanUtils.copyProperties(addParam, model); + model.setSiteId(RequestUtils.siteId()); + model.setValue(JSON.toJSONString(addParam.getValue())); + model.setTemplateType(addParam.getTemplateType().get(0)); + model.setTrigger(JSON.toJSONString(addParam.getTrigger())); + model.setCreateTime(System.currentTimeMillis() / 1000); + sysPrinterMapper.insert(model); + + if (addParam.getBrand() === SysPrinterBrandEnum.YI_LIAN_YUN.getBrand()) { + const addPrinterYlyParam: SysPrinterAddPrinterYlyParam = new SysPrinterAddPrinterYlyParam(); + BeanUtils.copyProperties(addParam, addPrinterYlyParam); + corePrinterService.addPrinterYly(addPrinterYlyParam); + } } /** * edit */ async edit(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: SysPrinter = sysPrinterMapper.selectOne( + new QueryWrapper() + .eq("printer_id", id) + .eq("site_id", RequestUtils.siteId())); + + Assert.notNull(model, "小票打印机不存在"); + BeanUtils.copyProperties(editParam, model); + model.setValue(JSON.toJSONString(editParam.getValue())); + model.setTemplateType(editParam.getTemplateType().get(0)); + model.setTrigger(JSON.toJSONString(editParam.getTrigger())); + model.setUpdateTime(System.currentTimeMillis() / 1000); + sysPrinterMapper.updateById(model); + + if (editParam.getBrand() === SysPrinterBrandEnum.YI_LIAN_YUN.getBrand()) { + const addPrinterYlyParam: SysPrinterAddPrinterYlyParam = new SysPrinterAddPrinterYlyParam(); + BeanUtils.copyProperties(editParam, addPrinterYlyParam); + corePrinterService.addPrinterYly(addPrinterYlyParam); + } } /** * modifyStatus */ async modifyStatus(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: SysPrinter = sysPrinterMapper.selectOne( + new QueryWrapper() + .eq("printer_id", param.getPrinterId()) + .eq("site_id", RequestUtils.siteId())); + model.setStatus(param.getStatus()); + sysPrinterMapper.updateById(model); } /** * del */ async del(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: SysPrinter = sysPrinterMapper.selectOne( + new QueryWrapper() + .eq("printer_id", id) + .eq("site_id", RequestUtils.siteId())); + + if (ObjectUtil.isEmpty(model)) { + return; + } + + sysPrinterMapper.deleteById(id); + + if (model.getBrand() === SysPrinterBrandEnum.YI_LIAN_YUN.getBrand()) { + corePrinterService.deletePrinterYly(model); + } } /** * getBrand */ async getBrand(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const jsonObject: Record = new Record(); + for (const value of SysPrinterBrandEnum.values()) { + if (ObjectUtil.isEmpty(value.getBrand())) { + continue; + } + + jsonObject.put(value.getBrand(), path.basename(value)); + } + return jsonObject; } /** * refreshToken */ async refreshToken(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: SysPrinter = sysPrinterMapper.selectOne( + new QueryWrapper() + .eq("printer_id", id) + .eq("site_id", RequestUtils.siteId())); + + if (ObjectUtil.isEmpty(model)) { + throw new Error("打印机不存在"); + } + + return corePrinterService.refreshToken(model); } /** * testPrint */ async testPrint(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: SysPrinter = sysPrinterMapper.selectOne( + new QueryWrapper() + .eq("printer_id", id) + .eq("site_id", RequestUtils.siteId())); + + if (ObjectUtil.isEmpty(model)) { + throw new Error("打印机不存在"); + } + + if (model.getBrand() === SysPrinterBrandEnum.YI_LIAN_YUN.getBrand()) { + testYlyPrint(model); + } } /** * printTicket */ async printTicket(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + param.setSiteId(RequestUtils.siteId()); + return corePrinterService.printTicket(param); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-printer-template-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-printer-template-service-impl.service.ts index 527057ba..df99ac96 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-printer-template-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-printer-template-service-impl.service.ts @@ -14,47 +14,135 @@ export class SysPrinterTemplateServiceImplService { * page */ async page(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return []; + const page: number = pageParam.getPage(); + const limit: number = pageParam.getLimit(); + + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + + queryWrapper.eq("site_id", RequestUtils.siteId()) + .orderByDesc("create_time"); + + if (ObjectUtil.isNotEmpty(searchParam.getTemplateId())) { + queryWrapper.eq("template_id", searchParam.getTemplateId()); + } + if (ObjectUtil.isNotEmpty(searchParam.getTemplateName())) { + queryWrapper.like("template_name", searchParam.getTemplateName()); + } + if (ObjectUtil.isNotEmpty(searchParam.getTemplateType())) { + queryWrapper.eq("template_type", searchParam.getTemplateType()); + } + + const iPage: IPage = sysPrinterTemplateMapper.selectPage(new Page<>(page, limit), queryWrapper); + const list: SysPrinterTemplateListVo[] = []; + for (const item of iPage.getRecords()) { + const vo: SysPrinterTemplateListVo = new SysPrinterTemplateListVo(); + BeanUtils.copyProperties(item, vo); + vo.setTemplateTypeName(SysPrinterTypeEnum.getTypeName(item.getTemplateType())); + vo.setValue(JSON.parseObject(item.getValue())); + vo.setCreateTime(DateUtils.timestampToString(item.getCreateTime())); + list.add(vo); + } + return PageResult.build(page, limit, iPage.getTotal()).setData(list); } /** * getList */ async getList(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + + queryWrapper.eq("site_id", RequestUtils.siteId()) + .orderByDesc("create_time"); + + if (ObjectUtil.isNotEmpty(searchParam.getTemplateId())) { + queryWrapper.eq("template_id", searchParam.getTemplateId()); + } + if (ObjectUtil.isNotEmpty(searchParam.getTemplateName())) { + queryWrapper.like("template_name", searchParam.getTemplateName()); + } + if (ObjectUtil.isNotEmpty(searchParam.getTemplateType())) { + queryWrapper.eq("template_type", searchParam.getTemplateType()); + } + + const voList: SysPrinterTemplateListVo[] = []; + for (const item of sysPrinterTemplateMapper.selectList(queryWrapper)) { + const vo: SysPrinterTemplateListVo = new SysPrinterTemplateListVo(); + BeanUtils.copyProperties(item, vo); + vo.setTemplateTypeName(SysPrinterTypeEnum.getTypeName(item.getTemplateType())); + vo.setValue(JSON.parseObject(item.getValue())); + vo.setCreateTime(DateUtils.timestampToString(item.getCreateTime())); + voList.add(vo); + } + return voList; } /** * info */ async info(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: SysPrinterTemplate = sysPrinterTemplateMapper.selectOne( + new QueryWrapper() + .eq("template_id", id) + .eq("site_id", RequestUtils.siteId())); + + Assert.notNull(model, "小票打印模板不存在"); + + const vo: SysPrinterTemplateInfoVo = new SysPrinterTemplateInfoVo(); + BeanUtils.copyProperties(model, vo); + vo.setValue(JSON.parseObject(model.getValue())); + vo.setCreateTime(DateUtils.timestampToString(model.getCreateTime())); + return vo; } /** * add */ async add(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: SysPrinterTemplate = new SysPrinterTemplate(); + BeanUtils.copyProperties(addParam, model); + model.setValue(JSON.toJSONString(addParam.getValue())); + model.setCreateTime(System.currentTimeMillis() / 1000); + model.setSiteId(RequestUtils.siteId()); + + sysPrinterTemplateMapper.insert(model); } /** * edit */ async edit(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: SysPrinterTemplate = sysPrinterTemplateMapper.selectOne( + new QueryWrapper() + .eq("template_id", id) + .eq("site_id", RequestUtils.siteId())); + + Assert.notNull(model, "小票打印模板不存在"); + BeanUtils.copyProperties(editParam, model); + sysPrinterTemplateMapper.updateById(model); } /** * del */ async del(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const template: SysPrinterTemplate = sysPrinterTemplateMapper.selectById(id); + + const printerLambdaQueryWrapper: LambdaQueryWrapper = new LambdaQueryWrapper<>(); + printerLambdaQueryWrapper.eq(SysPrinter::getSiteId, RequestUtils.siteId()) + .like(SysPrinter::getTemplateType, template.getTemplateType()); + const printers: SysPrinter[] = sysPrinterMapper.selectList(printerLambdaQueryWrapper); + + const illegalPrinter: Optional = printers.stream() + .filter(printer => ObjectUtil.isNotEmpty(printer.getValue())) + .filter(printer => JSON.parseArray(printer.getValue()).stream() + .anyMatch(value => JSON.parseArray(value.toString()).stream() + .anyMatch(o => id === JSON.parseObject(o.toString().getInteger("template_id"))))) + .findFirst(); + + if (illegalPrinter.isPresent()) { + throw new Error("该模板已被打印机[" + illegalPrinter.get().getPrinterName() + "]使用,无法删除"); + } + + sysPrinterTemplateMapper.deleteById(id); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-role-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-role-service-impl.service.ts index ca2e5658..d737d984 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-role-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-role-service-impl.service.ts @@ -14,55 +14,168 @@ export class SysRoleServiceImplService { * list */ async list(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return []; + const page: number = pageParam.getPage(); + const limit: number = pageParam.getLimit(); + + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + queryWrapper.orderByDesc("role_id"); + queryWrapper.eq("site_id", RequestUtils.siteId()); + if(ObjectUtil.isNotNull(searchParam.getRoleName()) && ObjectUtil.isNotEmpty(searchParam.getRoleName())){ + queryWrapper.like("role_name", searchParam.getRoleName()); + } + const iPage: IPage = sysRoleMapper.selectPage(new Page(page, limit), queryWrapper); + const list: SysRoleListVo[] = []; + for (const item of iPage.getRecords()) { + const vo: SysRoleListVo = new SysRoleListVo(); + BeanUtils.copyProperties(item, vo); + list.add(vo); + } + return PageResult.build(page, limit, iPage.getTotal()).setData(list); } /** * info */ async info(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: SysRole = sysRoleMapper.selectOne( + new QueryWrapper() + .eq("role_id", id) + .last("limit 1")); + + Assert.notNull(model, "数据不存在"); + + const vo: SysRoleInfoVo = new SysRoleInfoVo(); + BeanUtils.copyProperties(model, vo); + return vo; } /** * add */ async add(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const isExist: SysRole = sysRoleMapper.selectOne(new QueryWrapper() + .select("role_id") + .eq("role_name", addParam.getRoleName()) + .eq("site_id", RequestUtils.siteId()) + .last("limit 1") + ); + if (isExist != null) throw new AdminException("管理员角色已存在"); + + const model: SysRole = new SysRole(); + model.setSiteId(RequestUtils.siteId()); + model.setRoleName(addParam.getRoleName()); + model.setRules(JSONUtil.toJsonStr(addParam.getRules())); + model.setStatus(addParam.getStatus()); + model.setCreateTime(DateUtils.currTime()); + model.setUpdateTime(DateUtils.currTime()); + sysRoleMapper.insert(model); } /** * edit */ async edit(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const isExist: SysRole = sysRoleMapper.selectOne(new QueryWrapper() + .select("role_id") + .eq("role_name", editParam.getRoleName()) + .eq("site_id", RequestUtils.siteId()) + .ne("role_id", roleId) + .last("limit 1") + ); + if (isExist != null) throw new AdminException("管理员角色已存在"); + + const model: SysRole = sysRoleMapper.selectOne( + new QueryWrapper() + .eq("role_id", roleId) + .last("limit 1")); + + Assert.notNull(model, "数据不存在!"); + model.setSiteId(RequestUtils.siteId()); + model.setRoleName(editParam.getRoleName()); + model.setRules(JSONUtil.toJsonStr(editParam.getRules())); + model.setStatus(editParam.getStatus()); + model.setUpdateTime(DateUtils.currTime()); + sysRoleMapper.updateById(model); } /** * del */ async del(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: SysRole = sysRoleMapper.selectOne( + new QueryWrapper() + .eq("role_id", id) + .last("limit 1")); + + Assert.notNull(model, "数据不存在!"); + const userRoleCount: number = sysUserRoleMapper.selectCount(new QueryWrapper().like("role_ids", id)); + if(userRoleCount>0){ + throw new AdminException("USER_ROLE_NOT_ALLOW_DELETE"); + } + sysRoleMapper.delete(new QueryWrapper().eq("role_id", id)); } /** * getMenuIdsByRoleIds */ async getMenuIdsByRoleIds(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const queryWrapper: QueryWrapper = new QueryWrapper(); + queryWrapper.eq("status", RoleStatusEnum.ON.getCode()); + // 判断roleIds不能为空 + if(ObjectUtil.isNotNull(roleIds) && roleIds.size()>0){ + queryWrapper.in("role_id", roleIds); + } + const roleList: SysRole[] = sysRoleMapper.selectList(queryWrapper); + const roleMenuJson: JSONArray = new JSONArray(); + for (const sysRole of roleList) { + const ruleJson: JSONArray = JSONUtil.parseArray(sysRole.getRules()); + roleMenuJson.addAll(ruleJson); + } + //去重 + const list: string[] = JSONUtil.toList(roleMenuJson, String.class); + return CollectionUtil.distinct(list); } /** * getAllRole */ async getAllRole(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + queryWrapper.eq("site_id", RequestUtils.siteId()); + queryWrapper.eq("status", 1); + const roleList: SysRole[] = sysRoleMapper.selectList(queryWrapper); + const sysRoleListVoList: SysRoleListVo[] = []; + for (const sysRole of roleList) { + const vo: SysRoleListVo = new SysRoleListVo(); + BeanUtils.copyProperties(sysRole, vo); + sysRoleListVoList.add(vo); + } + const sysUserRole: SysUserRole = null; + const isAdmin: boolean = false; + if (authService.isSuperAdmin()){ + isAdmin=true; + }else { + sysUserRole = sysUserRoleMapper.selectOne(new LambdaQueryWrapper().eq(SysUserRole::getSiteId, RequestUtils.siteId()).eq(SysUserRole::getUid, RequestUtils.uid())); + if (ObjectUtil.isEmpty(sysUserRole)){ + return List.of(); + } + isAdmin = sysUserRole.getIsAdmin() == 1 ? true : false; + } + if (!isAdmin){ + if ((sysUserRole.getRoleIds( && sysUserRole.getRoleIds(.trim() !== '')) && "[]" === sysUserRole.getRoleIds()){ + const roleIdsStr: string = sysUserRole.getRoleIds().replaceAll("[\\[\\]\"]", ""); + const menuIdsByRoleIds: string[] = getMenuIdsByRoleIds(RequestUtils.siteId(), Arrays.stream(roleIdsStr.split(",")).collect(Collectors.toList())); + for (const sysRoleListVo of sysRoleListVoList) { + const diff: string[] = new ArrayList<>(Collections.singleton(sysRoleListVo.getRules())); + diff.removeAll(menuIdsByRoleIds); + if (!diff.length === 0){ + sysRoleListVo.setDisabled(true); + } + } + } + + } + sysRoleListVoList.forEach(sysRoleListVo => sysRoleListVo.setRules(null)); + return sysRoleListVoList; } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-schedule-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-schedule-service-impl.service.ts index 2b69fab1..8c982731 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-schedule-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-schedule-service-impl.service.ts @@ -14,135 +14,306 @@ export class SysScheduleServiceImplService { * JobInvokeService */ async jobInvokeService(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + this.applicationContext = applicationContext; } /** * init */ async init(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + // 通过 ApplicationContext 获取所有 IJobProvider 实现 + const providers: Record = applicationContext.getBeansOfType(IJobProvider.class); + log.info("Loaded job provider count: {}", providers.size()); + for (const provider of providers.values()) { + log.info("Loaded job provider: {}", provider.getClass().getName()); + const annotation: JobProvider = provider.getClass().getAnnotation(JobProvider.class); + if (annotation != null) { + // 使用注解的 key 作为 map 的键 + jobProviderMap.put(annotation.key(), provider); + } + } } /** * getSysEnableList */ async getSysEnableList(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + queryWrapper.eq("status", 1); + queryWrapper.orderByDesc("sort", "id"); + return sysScheduleMapper.selectList(queryWrapper); } /** * list */ async list(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return []; + // 分页参数 + const page: number = pageParam.getPage(); + const limit: number = pageParam.getLimit(); + // 构造查询条件执行查询 + const queryWrapper: LambdaQueryWrapper = new LambdaQueryWrapper<>(); + if (ObjectUtil.isNotEmpty(searchParam.getStatus()) && !"all" === searchParam.getStatus()){ + if ("0" === searchParam.getStatus()){ + searchParam.setStatus("2"); + } + queryWrapper.eq( SysSchedule::getStatus, searchParam.getStatus()); + } + queryWrapper.eq(ObjectUtil.isNotEmpty(searchParam.getKey()), SysSchedule::getKey, searchParam.getKey()); + queryWrapper.orderByDesc(SysSchedule::getSort, SysSchedule::getId); + const sysSchedulePage: IPage = sysScheduleMapper.selectPage(new Page<>(page, limit), queryWrapper); + // 返回结果集 + const sysScheduleListVoList: SysScheduleListVo[] = []; + for (const sysSchedule of sysSchedulePage.getRecords()) { + const sysScheduleListVo: SysScheduleListVo = new SysScheduleListVo(); + BeanUtils.copyProperties(sysSchedule, sysScheduleListVo); + sysScheduleListVo.setTimeObject(sysSchedule.getTime()); + sysScheduleListVo.setCrontabContent(QuartzJobManager.convertCronContent(sysSchedule.getTime())); + sysScheduleListVoList.add(sysScheduleListVo); + } + return PageResult.build(page, limit, sysSchedulePage.getTotal()).setData(sysScheduleListVoList); } /** * info */ async info(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const sysSchedule: SysSchedule = sysScheduleMapper.selectById(id); + const sysScheduleInfoVo: SysScheduleInfoVo = new SysScheduleInfoVo(); + BeanUtils.copyProperties(sysSchedule, sysScheduleInfoVo); + return sysScheduleInfoVo; } /** * modifyStatus */ async modifyStatus(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const oldSysSchedule: SysSchedule = this.findByIdAndCheck(sysScheduleStatusParam.getId()); + if (sysScheduleStatusParam.getStatus() == 2) { + QuartzJobManager.stopJob(oldSysSchedule); + } else { + QuartzJobManager.stopJob(oldSysSchedule); + QuartzJobManager.startJob(oldSysSchedule); + } + const newSysSchedule: SysSchedule = new SysSchedule(); + newSysSchedule.setId(oldSysSchedule.getId()); + newSysSchedule.setStatus(sysScheduleStatusParam.getStatus()); + newSysSchedule.setUpdateTime(DateUtils.currTime()); + sysScheduleMapper.updateById(newSysSchedule); } /** * add */ async add(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const jobKey: string = sysScheduleParam.getKey(); + const jobInfo: JobInfo = JobProviderFactory.getJobInfo(jobKey); + if (jobInfo == null) { + throw new Error("任务不存在."); + } + // 校验任务是否存在 + const queryWrapper: QueryWrapper = new QueryWrapper(); + queryWrapper.eq("`key`", jobKey); + const sysScheduleList: SysSchedule[] = sysScheduleMapper.selectList(queryWrapper); + if (sysScheduleList != null && sysScheduleList.size() > 0) { + throw new Error("任务已经存在."); + } + // 新增一个任务 + const newSysSchedule: SysSchedule = new SysSchedule(); + BeanUtils.copyProperties(sysScheduleParam, newSysSchedule); + newSysSchedule.setTime(JSONUtil.toJsonStr(sysScheduleParam.getTime())); + newSysSchedule.setCreateTime(DateUtils.currTime()); + newSysSchedule.setUpdateTime(DateUtils.currTime()); + newSysSchedule.setSiteId(RequestUtils.adminSiteId()); + newSysSchedule.setAddon(jobInfo.getSource()); + const result: number = sysScheduleMapper.insert(newSysSchedule); + if (result > 0) { + if (newSysSchedule.getStatus() == 1) { + // 如果是启动状态,就启动任务 + QuartzJobManager.startJob(newSysSchedule); + } + } } /** * edit */ async edit(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + // 存在性检查 + this.findByIdAndCheck(id); + // 构建更新对象 + const newSysSchedule: SysSchedule = new SysSchedule(); + BeanUtils.copyProperties(sysScheduleParam, newSysSchedule); + newSysSchedule.setId(id); + newSysSchedule.setSiteId(RequestUtils.adminSiteId()); + newSysSchedule.setUpdateTime(DateUtils.currTime()); + newSysSchedule.setTime(JSONUtil.toJsonStr(sysScheduleParam.getTime())); + const result: number = sysScheduleMapper.updateById(newSysSchedule); + if (result <= 0) { + log.error("更新系统任务失败:id={}", id); + } + // 根据状态启停任务 + if (sysScheduleParam.getStatus() == 2) { + QuartzJobManager.stopJob(newSysSchedule.getKey()); + } else { + QuartzJobManager.stopJob(newSysSchedule.getKey()); + QuartzJobManager.startJob(newSysSchedule); + } } /** * del */ async del(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const sysSchedule: SysSchedule = this.findByIdAndCheck(id); + if (sysSchedule.getStatus() == 1) { + QuartzJobManager.stopJob(sysSchedule); + } + sysScheduleMapper.deleteById(id); } /** * template */ async template(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const sysScheduleTemplateVoList: SysScheduleTemplateVo[] = []; + const jobKeys: Set = JobProviderFactory.jobKeys(); + for (const jobKey of jobKeys) { + const jobInfo: JobInfo = JobProviderFactory.getJobInfo(jobKey); + const sysScheduleTemplateVo: SysScheduleTemplateVo = new SysScheduleTemplateVo(); + sysScheduleTemplateVo.setKey(jobKey); + sysScheduleTemplateVo.setName(path.basename(jobInfo)); + sysScheduleTemplateVo.setDesc(jobInfo.getDescribe()); + sysScheduleTemplateVo.setClazz(jobInfo.getJobClass()); + sysScheduleTemplateVo.setFunction(jobInfo.getJobClass()); + sysScheduleTemplateVoList.add(sysScheduleTemplateVo); + } + return sysScheduleTemplateVoList; } /** * deleteScheduleLog */ async deleteScheduleLog(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return; + const sysScheduleLogs: SysScheduleLog[] = sysScheduleLogMapper.selectList(new QueryWrapper().eq("status", status).lt("execute_time", successThreshold)); + if (CollectionUtils.isEmpty(sysScheduleLogs)) { + return; + } + const delIds: Set = sysScheduleLogs.stream().map(SysScheduleLog::getId).collect(Collectors.toSet()); + sysScheduleLogMapper.deleteBatchIds(delIds); } /** * resetSchedule */ async resetSchedule(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + coreScheduleService.resetSchedule(); } /** * logList */ async logList(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const page: number = pageParam.getPage(); + const limit: number = pageParam.getLimit(); + const qw: LambdaQueryWrapper = new LambdaQueryWrapper<>(); + qw.eq(ObjectUtil.isNotEmpty(searchParam.getScheduleId()), SysScheduleLog::getScheduleId, searchParam.getScheduleId()); + qw.eq(ObjectUtil.isNotEmpty(searchParam.getKey()), SysScheduleLog::getKey, searchParam.getKey()); + if (ObjectUtil.isNotEmpty(searchParam.getStatus()) && !"all" === searchParam.getStatus()){ + qw.eq(SysScheduleLog::getStatus, searchParam.getStatus()); + } + if (ObjectUtil.isNotEmpty(searchParam.getExecuteTime())) { + QueryMapperUtils.buildByTime(qw, SysScheduleLog::getExecuteTime, searchParam.getExecuteTime()); + } + const sysScheduleLogPage: Page = sysScheduleLogMapper.selectPage(new Page<>(page, limit), qw); + const result: SysScheduleLogListVo[] = []; + sysScheduleLogPage.getRecords().forEach(sysScheduleLog => { + const sysScheduleLogListVo: SysScheduleLogListVo = new SysScheduleLogListVo(); + BeanUtils.copyProperties(sysScheduleLog, sysScheduleLogListVo); + result.add(sysScheduleLogListVo); + }); + return PageResult.build(page, limit, sysScheduleLogPage.getTotal()).setData(result); } /** * addLog */ async addLog(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const sysSchedule: SysSchedule = sysScheduleMapper.selectOne(new LambdaQueryWrapper() + .eq(SysSchedule::getKey, log.getKey()).eq(SysSchedule::getAddon, log.getAddon())); + if (sysSchedule == null) return; + log.setScheduleId(sysSchedule.getId()); + log.setExecuteTime(DateUtils.currTime()); + sysScheduleLogMapper.insert(log); } /** * doSchedule */ async doSchedule(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const sysSchedule: SysSchedule = sysScheduleMapper.selectById(id); + if (sysSchedule == null) { + throw new BadRequestException("计划任务不存在"); + } + const basePackage: string = String.format("com.niu.%s.job", sysSchedule.getAddon()); + const classPath: string = QuartzJobManager.getClassPath(basePackage, sysSchedule.getKey()); + const jobKey: string = sysSchedule.getKey(); + try { + // 动态加载任务类 + Class jobClass = Class.forName(classPath); + + // 验证是否为有效的任务类 + if (!IJobProvider.class.isAssignableFrom(jobClass)) { + throw new BadRequestException("无效的任务类: " + classPath); + } + + // 实例化任务 + const job: IJobProvider = (IJobProvider) jobClass.getDeclaredConstructor().newInstance(); + + // 执行任务 + job.exec(null); + + // 构建日志信息 + const result: string = "计划任务:" + path.basename(sysSchedule) + "执行成功"; + addLog(SysScheduleLog.builder() + .key(jobKey) + .name(path.basename(sysSchedule)) + .addon(sysSchedule.getAddon()) + .className(classPath) + .status("success") + .executeResult(result) + .job(classPath) + .build()); + + } catch (Exception e) { + // 获取任务名称(即使在异常情况下也尝试获取) + const errorMsg: string = "计划任务:" + path.basename(sysSchedule) + "发生错误, 错误原因:" + e.getMessage() + + " at " + e.getStackTrace()[0].toString(); + addLog(SysScheduleLog.builder() + .key(jobKey) + .name(path.basename(sysSchedule)) + .addon(sysSchedule.getAddon()) + .className(classPath) + .status("error") + .executeResult(errorMsg) + .job(classPath) + .build()); + + throw new BadRequestException("执行计划任务失败", e); + } } /** * delLog */ async delLog(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + sysScheduleLogMapper.deleteByIds(Arrays.asList(ids)); } /** * clearLog */ async clearLog(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + sysScheduleLogMapper.delete(new QueryWrapper().eq("schedule_id", scheduleId)); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-upgrade-records-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-upgrade-records-service-impl.service.ts index 45c1bd86..a38690b5 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-upgrade-records-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-upgrade-records-service-impl.service.ts @@ -14,39 +14,75 @@ export class SysUpgradeRecordsServiceImplService { * page */ async page(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return []; - } - - /** - * add - */ - async add(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; - } - - /** - * edit - */ - async edit(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; - } - - /** - * clear - */ - async clear(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; - } - - /** - * del - */ - async del(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const page: number = pageParam.getPage(); + const limit: number = pageParam.getLimit(); + + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + queryWrapper.orderByDesc("create_time"); + + if (searchParam != null) { + if (path.basename(searchParam) != null) { + queryWrapper.like("name", path.basename(searchParam)); + } + } + + const iPage: IPage = sysUpgradeRecordsMapper.selectPage(new Page<>(page, limit), queryWrapper); + const list: SysUpgradeRecordsListVo[] = []; + for (const item of iPage.getRecords()) { + const vo: SysUpgradeRecordsListVo = new SysUpgradeRecordsListVo(); + BeanUtils.copyProperties(item, vo); + vo.setCreateTime(DateUtils.timestampToString(item.getCreateTime())); + vo.setCompleteTime(DateUtils.timestampToString(item.getCompleteTime())); + vo.setStatusName(UpgradeRecordStatusEnum.getNameByStatus(vo.getStatus())); + //判断为数组或者对象或者字符串 + const value: string = item.getContent(); + if (!StrUtil.isEmpty(value)) { + if (value.startsWith("[")) { + vo.setContent(JSON.parseArray(value)); + } else if (value.startsWith("{")) { + vo.setContent(JSON.parseObject(value)); + } else { + vo.setContent(value); + } + } + list.add(vo); + } + + return PageResult.build(page, limit, iPage.getTotal()).setData(list); + } + + @Override + public void add(SysUpgradeRecordsParam addParam) { + const model: SysUpgradeRecords = new SysUpgradeRecords(); + BeanUtils.copyProperties(addParam, model); + model.setCreateTime(System.currentTimeMillis() / 1000); + sysUpgradeRecordsMapper.insert(model); + } + + @Override + public void edit(String key, SysUpgradeRecordsParam editParam) { + const model: SysUpgradeRecords = new SysUpgradeRecords(); + BeanUtils.copyProperties(editParam, model); + sysUpgradeRecordsMapper.update(model, new QueryWrapper().eq("upgrade_key", key)); + } + + @Override + public void clear(long threshold) { + sysUpgradeRecordsMapper.delete(new QueryWrapper() + .lt("create_time", threshold).in("status", STATUS_READY, STATUS_FAIL)); + } + + @Override + public void del(SysUpgradeRecordsDelParam delParam) { + const queryWrapper: QueryWrapper = new QueryWrapper(); + + if (delParam.getIds().getClass().getName().startsWith("[")) { + String[] stringIds = (String[]) delParam.getIds(); + queryWrapper.in("id", stringIds); + } else { + queryWrapper.eq("id", delParam.getIds()); + } + sysUpgradeRecordsMapper.delete(queryWrapper); + } } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-user-log-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-user-log-service-impl.service.ts index f8347d54..ef616c56 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-user-log-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-user-log-service-impl.service.ts @@ -14,23 +14,54 @@ export class SysUserLogServiceImplService { * list */ async list(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return []; + const page: number = pageParam.getPage(); + const limit: number = pageParam.getLimit(); + + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + queryWrapper.eq("site_id", RequestUtils.siteId()); + queryWrapper.orderByDesc("id"); + if(ObjectUtil.isNotNull(searchParam.getUsername()) && ObjectUtil.isNotEmpty(searchParam.getUsername())){ + queryWrapper.like("username", searchParam.getUsername()); + } + if(ObjectUtil.isNotNull(searchParam.getIp()) && ObjectUtil.isNotEmpty(searchParam.getIp())){ + queryWrapper.like("ip", searchParam.getIp()); + } + + if(ObjectUtil.isNotNull(searchParam.getUrl()) && ObjectUtil.isNotEmpty(searchParam.getUrl())){ + queryWrapper.like("url", searchParam.getUrl()); + } + const iPage: IPage = sysUserLogMapper.selectPage(new Page(page, limit), queryWrapper); + + const list: SysUserLogListVo[] = []; + for (const item of iPage.getRecords()) { + const vo: SysUserLogListVo = new SysUserLogListVo(); + BeanUtils.copyProperties(item, vo); + list.add(vo); + } + return PageResult.build(page, limit, iPage.getTotal()).setData(list); } /** * info */ async info(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: SysUserLog = sysUserLogMapper.selectOne( + new QueryWrapper() + .eq("id", id) + .eq("site_id", RequestUtils.siteId()) + .last("limit 1")); + + Assert.notNull(model, "数据不存在"); + + const vo: SysUserLogInfoVo = new SysUserLogInfoVo(); + BeanUtils.copyProperties(model, vo); + return vo; } /** * destroy */ async destroy(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + sysUserLogMapper.delete(new QueryWrapper().eq("site_id", RequestUtils.siteId())); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-user-role-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-user-role-service-impl.service.ts index 7e0e32c3..51a3f4c6 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-user-role-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-user-role-service-impl.service.ts @@ -14,47 +14,120 @@ export class SysUserRoleServiceImplService { * list */ async list(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return []; + const page: number = pageParam.getPage(); + const limit: number = pageParam.getLimit(); + + const queryWrapper: MPJQueryWrapper = new MPJQueryWrapper<>(); + + //sql语句 + queryWrapper.select("nsu.uid, nsu.username, nsu.head_img, nsu.password, nsu.real_name, nsu.last_ip, nsu.last_time, nsu.create_time, nsu.login_count, nsu.status, nsu.is_del, nsu.delete_time, nsu.update_time, nsur.id, nsur.site_id, nsur.role_ids, nsur.is_admin") + .setAlias("nsur") + .leftJoin("?_sys_user nsu ON nsur.uid = nsu.uid".replace("?_", this.config.get('tablePrefix'))); + + //查询条件判断组装 + if (ObjectUtil.isNotEmpty(searchParam.getUid())) { + queryWrapper.eq("nsu.uid", searchParam.getUid()); + } + + //排序 + queryWrapper.orderByDesc("id"); + //分页查询 + const iPage: IPage = sysUserRoleMapper.selectJoinPage( + new Page<>(page, limit), + SysUserRoleListVo.class, + queryWrapper); + + + return PageResult.build(iPage); } /** * info */ async info(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: SysUserRole = sysUserRoleMapper.selectOne( + new QueryWrapper() + .eq("id", id) + .last("limit 1")); + + Assert.notNull(model, "数据不存在"); + + const vo: SysUserRoleInfoVo = new SysUserRoleInfoVo(); + BeanUtils.copyProperties(model, vo); + return vo; } /** * add */ async add(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const userRoleCount: number = sysUserRoleMapper.selectCount( + new QueryWrapper() + .eq("uid", addParam.getUid()) + .eq("site_id", addParam.getSiteId()) + ); + if (userRoleCount>0){ + throw new BadRequestException("SITE_USER_EXIST"); + } + + const model: SysUserRole = new SysUserRole(); + model.setUid(addParam.getUid()); + model.setSiteId(addParam.getSiteId()==null? RequestUtils.siteId():addParam.getSiteId()); + model.setRoleIds(addParam.getRoleIds()); + model.setCreateTime(DateUtils.currTime()); + model.setIsAdmin(addParam.getIsAdmin()==null?0:addParam.getIsAdmin()); + model.setStatus(ObjectUtil.isNull(addParam.getStatus())? StatusEnum.ON.getStatus() : addParam.getStatus()); + if(model.getStatus()<1){ + model.setRoleIds(addParam.getRoleIds()==null? JSONUtil.toJsonStr(new JsonArray()):addParam.getRoleIds()); + } + sysUserRoleMapper.insert(model); } /** * edit */ async edit(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: SysUserRole = sysUserRoleMapper.selectOne( + new QueryWrapper() + .eq("uid", editParam.getUid()) + .eq("site_id", editParam.getSiteId()) + .last("limit 1")); + Assert.notNull(model, "数据不存在!"); + const isAdmin: number = model.getIsAdmin(); + if(isAdmin>0){ + //超级管理员不允许改动权限 + throw new AdminException("ADMIN_NOT_ALLOW_EDIT_ROLE"); + } + model.setStatus(editParam.getStatus()); + model.setRoleIds(editParam.getRoleIds()); + sysUserRoleMapper.updateById(model); } /** * del */ async del(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: SysUserRole = sysUserRoleMapper.selectOne( + new QueryWrapper() + .eq("id", id) + .last("limit 1")); + + Assert.notNull(model, "数据不存在!"); + + sysUserRoleMapper.delete(new QueryWrapper().eq("id", id)); } /** * getUserRole */ async getUserRole(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: SysUserRole = sysUserRoleMapper.selectOne(new QueryWrapper().eq("uid", uid).eq("site_id", site_id).last(" limit 1")); + const vo: SysUserRoleInfoVo = new SysUserRoleInfoVo(); + if(ObjectUtil.isNotNull(model)){ + BeanUtils.copyProperties(model, vo); + return vo; + }else{ + return null; + } } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-user-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-user-service-impl.service.ts index d7f2e975..5553b984 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-user-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-user-service-impl.service.ts @@ -14,143 +14,401 @@ export class SysUserServiceImplService { * getLoginService */ async getLoginService(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return (ILoginService) SpringContext.getBean(LoginServiceImpl.class); } /** * list */ async list(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return []; + authService.isSuperAdmin(); + const superAdminUid: number = cached.tag("adminAuth").get("superAdminUid"); + + const page: number = pageParam.getPage(); + const limit: number = pageParam.getLimit(); + + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + queryWrapper.orderByDesc("uid"); + + if (ObjectUtil.isNotNull(searchParam.getUsername()) && ObjectUtil.isNotEmpty(searchParam.getUsername())) { + queryWrapper.like("username", searchParam.getUsername()).or().like("real_name", searchParam.getUsername()); + } + if (ObjectUtil.isNotNull(searchParam.getLastTime()) && ObjectUtil.isNotEmpty(searchParam.getLastTime())) { + const startTime: number = 0; + const endTime: number = 0; + if (ObjectUtil.isNotNull(searchParam.getLastTime()[0])) { + startTime = DateUtils.StringToTimestamp(searchParam.getLastTime()[0]); + } + if (ObjectUtil.isNotNull(searchParam.getLastTime()[1])) { + endTime = DateUtils.StringToTimestamp(searchParam.getLastTime()[1]); + } + if (startTime > 0 && endTime > 0) { + queryWrapper.between("last_time", startTime, endTime); + } else if (startTime > 0) { + queryWrapper.ge("last_time", startTime); + } else if (endTime > 0) { + queryWrapper.le("last_time", endTime); + } + } + + const iPage: IPage = sysUserMapper.selectPage(new Page(page, limit), queryWrapper); + + const list: SysUserListVo[] = []; + for (const item of iPage.getRecords()) { + const vo: SysUserListVo = new SysUserListVo(); + BeanUtils.copyProperties(item, vo); + const siteNum: number = sysUserRoleMapper.selectCount(new QueryWrapper().eq("uid", item.getUid()).ne("site_id", RequestUtils.defaultSiteId())); + vo.setSiteNum(siteNum.intValue()); + vo.setIsSuperAdmin(superAdminUid == item.getUid()); + list.add(vo); + } + return PageResult.build(page, limit, iPage.getTotal()).setData(list); } /** * info */ async info(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + authService.isSuperAdmin(); + const superAdminUid: number = cached.tag("adminAuth").get("superAdminUid"); + + const model: SysUser = sysUserMapper.selectOne( + new QueryWrapper() + .eq("uid", id) + .last("limit 1")); + Assert.notNull(model, "用户数据不存在"); + + const vo: SysUserDetailVo = new SysUserDetailVo(); + BeanUtils.copyProperties(model, vo); + + const userRoleMPJQueryWrapper: MPJQueryWrapper = new MPJQueryWrapper<>(); + userRoleMPJQueryWrapper.select("sur.*, s.site_id, s.site_name, s.app_type, s.status as siteStatus, s.expire_time") + .setAlias("sur") + .leftJoin("?_site s ON sur.site_id = s.site_id".replace("?_", this.config.get('tablePrefix'))); + userRoleMPJQueryWrapper.eq("sur.uid", vo.getUid()); + const userSiteRoleVoList: SysUserSiteRoleVo[] = sysUserRoleMapper.selectJoinList(SysUserSiteRoleVo.class, userRoleMPJQueryWrapper); + vo.setIsSuperAdmin(superAdminUid == id); + vo.setRoles(userSiteRoleVoList); + return vo; } /** * add */ async add(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + if (checkUserName(addParam.getUsername())) { + throw new AdminException("该用户名已被占用,请更换"); + } + const sysUser: SysUser = new SysUser(); + BeanUtils.copyProperties(addParam, sysUser); + sysUser.setCreateTime(DateUtils.currTime()); + sysUser.setUpdateTime(DateUtils.currTime()); + sysUser.setPassword(PasswordEncipher.encode(addParam.getPassword())); + sysUserMapper.insert(sysUser); + const uid: number = sysUser.getUid(); + + //添加用户建站限制 + const createSiteLimitParamList: SysCreateSiteLimitParam[] = addParam.getCreateSiteLimit(); + const addList: UserCreateSiteLimit[] = []; + if (ObjectUtil.isNotNull(createSiteLimitParamList) && createSiteLimitParamList.size() > 0) { + for (const sysCreateSiteLimitParam of createSiteLimitParamList) { + const userCreateSiteLimit: UserCreateSiteLimit = new UserCreateSiteLimit(); + userCreateSiteLimit.setUid(uid); + userCreateSiteLimit.setGroupId(sysCreateSiteLimitParam.getGroupId()); + userCreateSiteLimit.setMonth(sysCreateSiteLimitParam.getMonth()); + userCreateSiteLimit.setNum(sysCreateSiteLimitParam.getNum()); + addList.add(userCreateSiteLimit); + } + userCreateSiteLimitMapper.insert(addList); + } + return uid; } /** * edit */ async edit(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: SysUser = sysUserMapper.selectOne( + new QueryWrapper() + .eq("uid", uid) + .last("limit 1")); + Assert.notNull(model, "数据不存在!"); + const isOffStatus: boolean = false; + if (ObjectUtil.isNotNull(editParam.getStatus())) { + model.setStatus(editParam.getStatus()); + if (editParam.getStatus() == StatusEnum.OFF.getStatus()) { + isOffStatus = true; + } + } + if (ObjectUtil.isNotNull(editParam.getHeadImg())) { + model.setHeadImg(editParam.getHeadImg()); + } + if (ObjectUtil.isNotNull(editParam.getRealName())) { + model.setRealName(editParam.getRealName()); + } + const isChangePassword: boolean = false; + if (ObjectUtil.isNotNull(editParam.getPassword()) && ObjectUtil.isNotEmpty(editParam.getPassword())) { + model.setPassword(PasswordEncipher.encode(editParam.getPassword())); + isChangePassword = true; + } + /** + * 更新用戶信息 + */ + model.setUpdateTime(DateUtils.currTime()); + sysUserMapper.updateById(model); + if (isOffStatus || isChangePassword) { + getLoginService().clearToken(uid, RequestUtils.appType(), ""); + } } /** * del */ async del(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + authService.isSuperAdmin(); + const superAdminUid: number = cached.tag("adminAuth").get("superAdminUid"); + if (superAdminUid === id) { + throw new BadRequestException("超级管理员不允许删除"); + } + const count: number = sysUserRoleMapper.selectCount(new QueryWrapper().eq("uid", id).ne("site_id", RequestUtils.defaultSiteId())); + if (count > 0) { + throw new BadRequestException("该用户是一些站点的管理员不允许删除"); + } + + const model: SysUser = sysUserMapper.selectOne( + new QueryWrapper() + .eq("uid", id) + .last("limit 1")); + + Assert.notNull(model, "数据不存在!"); + + sysUserMapper.delete(new QueryWrapper().eq("uid", id)); } /** * getUserInfoByUserName */ async getUserInfoByUserName(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: SysUser = sysUserMapper.selectOne(new QueryWrapper().eq("username", userName).last("limit 1")); + Assert.notNull(model, "账号或密码错误"); + const vo: SysUserInfoVo = new SysUserInfoVo(); + BeanUtils.copyProperties(model, vo); + return vo; } /** * editUserLoginInfo */ async editUserLoginInfo(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: SysUser = sysUserMapper.selectOne( + new QueryWrapper() + .eq("uid", uid) + .last("limit 1")); + + Assert.notNull(model, "数据不存在!"); + model.setLastTime(DateUtils.currTime()); + model.setLastIp(IpUtils.getIpAddr(RequestUtils.handler())); + model.setLoginCount(model.getLoginCount() + 1); + sysUserMapper.updateById(model); } /** * addSiteUser */ async addSiteUser(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const uid: number = 0; + try { + if (ObjectUtil.isNotNull(siteUserParam.getUid()) && siteUserParam.getUid() > 0) { + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + queryWrapper.eq("uid", siteUserParam.getUid()); + const sysUser: SysUser = sysUserMapper.selectOne(queryWrapper); + uid = siteUserParam.getUid(); + if (ObjectUtil.isNull(sysUser)) { + throw new AdminException("USER_NOT_EXIST"); + } + } else { + const sysUserParam: SysUserParam = new SysUserParam(); + sysUserParam.setHeadImg(siteUserParam.getHeadImg()); + sysUserParam.setPassword(siteUserParam.getPassword()); + sysUserParam.setLastIp(""); + sysUserParam.setLoginCount(0); + sysUserParam.setUsername(siteUserParam.getUsername()); + sysUserParam.setIsDel(0); + sysUserParam.setLastTime(DateUtils.currTime()); + sysUserParam.setStatus(siteUserParam.getStatus()); + sysUserParam.setRealName(siteUserParam.getRealName()); + //添加用户 + uid = this.add(sysUserParam); + } + const roleIds: string[] = siteUserParam.getRoleIds(); + const isAdmin: number = siteUserParam.getIsAdmin() == null ? 0 : siteUserParam.getIsAdmin(); + /** + * 创建用户站点管理权限 + */ + const sysUserRoleParam: SysUserRoleParam = new SysUserRoleParam(); + sysUserRoleParam.setRoleIds(JSONUtil.toJsonStr(roleIds)); + sysUserRoleParam.setSiteId(siteId); + sysUserRoleParam.setUid(uid); + sysUserRoleParam.setStatus(siteUserParam.getStatus()); + sysUserRoleParam.setIsAdmin(isAdmin); + sysUserRoleService.add(sysUserRoleParam); + } catch (Exception e) { + throw new AdminException(e.getMessage()); + } + return uid; } /** * checkUserName */ async checkUserName(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + queryWrapper.eq("username", userName); + const count: number = sysUserMapper.selectCount(queryWrapper); + if (count > 0) { + return true; + } + return false; } /** * getUserAll */ async getUserAll(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + queryWrapper.select("uid, username, head_img").orderByDesc("uid"); + return sysUserMapper.selectList(queryWrapper); } /** * getUserCreateSiteLimit */ async getUserCreateSiteLimit(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const userCreateSiteLimitList: UserCreateSiteLimit[] = userCreateSiteLimitMapper.selectList(new QueryWrapper().eq("uid", uid)); + const userCreateSiteLimitVoList: SysUserCreateSiteLimitVo[] = []; + for (const item of userCreateSiteLimitList) { + const userCreateSiteLimitVo: SysUserCreateSiteLimitVo = new SysUserCreateSiteLimitVo(); + BeanUtil.copyProperties(item, userCreateSiteLimitVo); + userCreateSiteLimitVoList.add(userCreateSiteLimitVo); + } + return userCreateSiteLimitVoList; } /** * getUserCreateSiteLimitInfo */ async getUserCreateSiteLimitInfo(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const userCreateSiteLimit: UserCreateSiteLimit = userCreateSiteLimitMapper.selectById(id); + const sysUserCreateSiteLimitVo: SysUserCreateSiteLimitVo = new SysUserCreateSiteLimitVo(); + if (ObjectUtil.isNotNull(userCreateSiteLimit)) { + BeanUtil.copyProperties(userCreateSiteLimit, sysUserCreateSiteLimitVo); + } + return sysUserCreateSiteLimitVo; } /** * addUserCreateSiteLimit */ async addUserCreateSiteLimit(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + userCreateSiteLimitMapper.delete(new QueryWrapper().eq("uid", userCreateSiteLimitAddParam.getUid()).eq("group_id", userCreateSiteLimitAddParam.getGroupId())); + const userCreateSiteLimit: UserCreateSiteLimit = new UserCreateSiteLimit(); + userCreateSiteLimit.setNum(userCreateSiteLimitAddParam.getNum()); + userCreateSiteLimit.setUid(userCreateSiteLimitAddParam.getUid()); + userCreateSiteLimit.setMonth(userCreateSiteLimitAddParam.getMonth()); + userCreateSiteLimit.setGroupId(userCreateSiteLimitAddParam.getGroupId()); + userCreateSiteLimitMapper.insert(userCreateSiteLimit); } /** * editUserCreateSiteLimit */ async editUserCreateSiteLimit(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const userCreateSiteLimit: UserCreateSiteLimit = userCreateSiteLimitMapper.selectById(userCreateSiteLimitEditParam.getId()); + userCreateSiteLimit.setNum(userCreateSiteLimitEditParam.getNum()); + userCreateSiteLimit.setMonth(userCreateSiteLimitEditParam.getMonth()); + userCreateSiteLimitMapper.updateById(userCreateSiteLimit); } /** * delUserCreateSiteLimit */ async delUserCreateSiteLimit(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + userCreateSiteLimitMapper.deleteById(id); } /** * find */ async find(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const sysuser: SysUser = sysUserMapper.selectById(uid); + Assert.notNull(sysuser, "用户数据不存在!"); + return sysuser; } /** * getUserSelect */ async getUserSelect(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + // 1. 构建查询条件 + const qw: MPJQueryWrapper = new MPJQueryWrapper<>(); + qw.setAlias("u") + .leftJoin("?_sys_user_role ur on u.uid = ur.uid".replace("?_", this.config.get('tablePrefix'))) + .select("u.uid, u.username, u.head_img") + .and(wrapper => wrapper.eq("ur.is_admin", 1)) + .or() + .eq("ur.site_id", 0); + + // 2. 获取并过滤用户 + const userAll: SysUser[] = (username && username.trim() !== '') + ? getUserAll().stream() + .filter(item => item.getUsername() === username) + .collect(Collectors.toList()) + : getUserAll(); + + if (CollectionUtils.isEmpty(userAll)) { + return List.of(); + } + + // 3. 获取有角色的用户ID集合 + const allRoleUserIds: Set = sysUserRoleMapper.selectList( + new QueryWrapper().select("uid").orderByDesc("id")) + .stream() + .map(SysUserRole::getUid) + .collect(Collectors.toSet()); + + // 4. 查询管理员用户 + qw.orderByDesc("uid"); + const adminUsers: SysUser[] = sysUserMapper.selectList(qw); + + // 5. 查询无角色用户 + const noRoleUsers: SysUser[] = []; + const noRoleUserIds: number[] = userAll.stream() + .map(SysUser::getUid) + .filter(uid => !allRoleUserIds.includes(uid)) + .collect(Collectors.toList()); + + if (!CollectionUtils.isEmpty(noRoleUserIds)) { + noRoleUsers = sysUserMapper.selectList( + new QueryWrapper() + .select("uid, username, head_img") + .in("uid", noRoleUserIds) + .orderByDesc("uid")); + } + + // 6. 合并结果并去重 + const resultMap: Record = new LinkedHashMap<>(); + + adminUsers.forEach(user => { + const vo: SysUserInfoVo = new SysUserInfoVo(); + BeanUtils.copyProperties(user, vo); + resultMap.put(user.getUid(), vo); + }); + noRoleUsers.forEach(user => { + const vo: SysUserInfoVo = new SysUserInfoVo(); + BeanUtils.copyProperties(user, vo); + resultMap.put(user.getUid(), vo); + }); + + return new ArrayList<>(resultMap.values()); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/system-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/system-service-impl.service.ts index 59ca25c7..4781b6f6 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/system-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/system-service-impl.service.ts @@ -14,31 +14,56 @@ export class SystemServiceImplService { * getInfo */ async getInfo(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const statSystemVo: StatSystemVo = new StatSystemVo(); + statSystemVo.setOs(System.getProperty("os.name", "Linux")); + statSystemVo.setEnvironment(System.getProperty("catalina.home")); + statSystemVo.setPhpV(System.getProperty("java.version")); + + const statVersionVo: StatVersionVo = new StatVersionVo(); + statVersionVo.setVersion("202406150001"); + statVersionVo.setCode("0.4.0"); + + statSystemVo.setVersion(statVersionVo); + return statSystemVo; } /** * clearCache */ async clearCache(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + cached.getAllKeys().stream().forEach(key => cached.remove(key)); } /** * getSpreadQrcode */ async getSpreadQrcode(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const vo: SpreadQrcodeVo = new SpreadQrcodeVo(); + + try { + const data: Record = {}; + for (SpreadQrcodeParam.Param qrcodeParam : param.getParams()) { + const jsonArray: JSONArray = JSONUtil.parseArray(qrcodeParam); + const jsonObject: Record = JSONUtil.parseObj(jsonArray); + data.put(jsonObject.getStr("name"), qrcodeParam.getColumnValue()); + } + const dir: string = "upload/qrcode/" + RequestUtils.siteId() + "/" + param.getFolder(); + vo.setWeappPath(QrcodeUtils.qrcodeToFile(RequestUtils.siteId(), "weapp", "", param.getPage(), data, dir)); + } catch (Exception e) { + + } + return vo; } /** * getDatabaseVersion */ async getDatabaseVersion(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + try (const connection: Connection = dataSource.getConnection()) { + DatabaseMetaData metaData = connection.getMetaData(); + return metaData.getDatabaseProductVersion(); + }catch (SQLException e) { + return "未知"; + } } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/upgrade/impl/upgrade-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/upgrade/impl/upgrade-service-impl.service.ts index c8e28c4b..535c92b4 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/upgrade/impl/upgrade-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/upgrade/impl/upgrade-service-impl.service.ts @@ -14,111 +14,503 @@ export class UpgradeServiceImplService { * setUpgradeService */ async setUpgradeService(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + this.upgradeService = upgradeService; } /** * upgradeCheck */ async upgradeCheck(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + if (this.config.get('runActive') === "dev") throw new BadRequestException("开发环境下请先关闭服务启动webroot/jar下的web-app-boot-exec进行升级"); + + const upgradeCheck: boolean = true; + + const checkResult: Record = new Record(); + const rootPath: string = ""; + const runtimePath: string = ""; + const readableDir: JSONArray = new JSONArray(); + const writeDir: JSONArray = new JSONArray(); + + if (this.config.get('envType') === "dev") { + rootPath = this.config.get('projectRoot') + "/"; + runtimePath = rootPath; + + readableDir.put(new Record().set("dir", rootPath + "niucloud-addon").set("status", true)); + writeDir.put(new Record().set("dir", rootPath + "niucloud-addon").set("status", true)); + readableDir.put(new Record().set("dir", rootPath + "webroot").set("status", true)); + writeDir.put(new Record().set("dir", rootPath + "webroot").set("status", true)); + } else { + rootPath = this.config.get('webRoot') + "/"; + runtimePath = rootPath + "runtime/"; + + readableDir.put(new Record().set("dir", runtimePath).set("status", true)); + writeDir.put(new Record().set("dir", runtimePath).set("status", true)); + } + + readableDir.put(new Record().set("dir", runtimePath + "admin").set("status", true)); + readableDir.put(new Record().set("dir", runtimePath + "uni-app").set("status", true)); + readableDir.put(new Record().set("dir", runtimePath + "web").set("status", true)); + + writeDir.put(new Record().set("dir", runtimePath + "admin").set("status", true)); + writeDir.put(new Record().set("dir", runtimePath + "uni-app").set("status", true)); + writeDir.put(new Record().set("dir", runtimePath + "web").set("status", true)); + + for (const i of number = 0; i < readableDir.size(); i++) { + const dir: Record = readableDir.getJSONObject(i); + dir.set("status", dir.getStr("dir").canRead()); + dir.set("dir", dir.getStr("dir").replace(rootPath, "")); + readableDir.set(i, dir); + if (!dir.getBool("status")) upgradeCheck = false; + } + + for (const i of number = 0; i < writeDir.size(); i++) { + const dir: Record = writeDir.getJSONObject(i); + dir.set("status", dir.getStr("dir").canWrite()); + dir.set("dir", dir.getStr("dir").replace(rootPath, "")); + writeDir.set(i, dir); + if (!dir.getBool("status")) upgradeCheck = false; + } + + checkResult.put("is_pass", upgradeCheck); + checkResult.put("dir", new Record().set("is_readable", readableDir).set("is_write", writeDir)); + return checkResult; } /** * getUpgradeContent */ async getUpgradeContent(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const instance: NiucloudUtils = NiucloudUtils.getInstance(); + const vo: UpgradeContentVo = new UpgradeContentVo(); + + const apps: Record[] = []; + + if (addon.length === 0) { + const query: Record = {}; + query.put("product_key", instance.getProductKey()); + query.put("app_key", this.config.get('appKey')); + query.put("version", this.config.get('version')); + apps.add(query); + } else { + for (const key of addon.split(",")) { + const addonModel: Addon = addonMapper.selectOne(new QueryWrapper().eq("`key`", key).select("version,type")); + const query: Record = {}; + query.put("product_key", instance.getProductKey()); + query.put("app_key", key); + query.put("version", addonModel.getVersion()); + if (addonModel.getType() === AddonTypeEnum.APP.getType()) { + apps.addFirst(query); + } else { + apps.add(query); + } + } + } + + for (const item of apps) { + const content: Record = NiucloudUtils.Niucloud.get("member_app_upgrade/content", item).getJSONObject("data"); + if (content != null) { + UpgradeContentVo.const contentVo: Content = JSONUtil.toBean(content, UpgradeContentVo.Content.class); + vo.getContent().add(contentVo); + vo.getUpgradeApps().add(contentVo.getApp().getAppKey()); + } + } + + vo.setLastBackup(sysBackupRecordsMapper.selectOne(new QueryWrapper() + .eq("status", "complete") + .orderByDesc("complete_time") + .last("limit 1") + )); + + return vo; } /** * upgrade */ async upgrade(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + if (this.config.get('runActive') === "dev") throw new BadRequestException("开发环境下请先关闭服务启动webroot/jar下的web-app-boot-exec进行升级"); + if (getUpgradeTask() != null) throw new BadRequestException("已经有正在升级中的任务"); + + const upgradeContent: UpgradeContentVo = getUpgradeContent(upgradeParam.getAddon()); + upgradeContent.setContent(upgradeContent.getContent().stream().filter(c => c.getVersionList().size() > 0).toList()); + upgradeContent.setUpgradeApps(upgradeContent.getContent().stream().map(c => c.getApp().getAppKey()).toList()); + if (upgradeContent.getContent().size() == 0) throw new BadRequestException("没有获取到可以升级的内容"); + + const instance: NiucloudUtils = NiucloudUtils.getInstance(); + + // 获取下载const actionQuery: token + Map = {}; + actionQuery.put("data[product_key]", instance.getProductKey()); + actionQuery.put("data[framework_version]", this.config.get('version')); + actionQuery.put("data[app_key]", upgradeContent.getContent().get(0).getApp().getAppKey()); + actionQuery.put("data[version]", upgradeContent.getContent().get(0).getVersion()); + + const actionToken: Record = niucloudService.getActionToken("upgrade", actionQuery); + + const query: Record = {}; + query.put("authorize_code", instance.getCode()); + query.put("token", actionToken == null ? "" : actionToken.getStr("token")); + const response: HttpResponse = new NiucloudUtils.Cloud().build("cloud/upgrade").query(query).method(Method.GET).execute(); + + if (response.getStatus() != 200) throw new BadRequestException("升级请求失败"); + + const body: Record = JSONUtil.parseObj(response.body()); + if (body.getInt("code") === 0) throw new Error(body.getStr("msg")); + + const vo: UpgradeTaskVo = new UpgradeTaskVo(); + vo.setEnvType(this.config.get('envType')); + vo.setUpgradeTime(DateUtil.now()); + vo.setAddon(actionQuery.get("data[app_key]")); + vo.setKey(RandomUtil.randomString(10)); + vo.setUpgrade(actionQuery); + vo.setStep("requestUpgrade"); + vo.getExecuted().add("requestUpgrade"); + vo.getLog().add(vo.getSteps().get("requestUpgrade").getTitle()); + vo.setParams(query); + vo.setUpgradeContent(upgradeContent); + + if (!upgradeParam.getIsNeedBackup()) { + vo.getSteps().remove("backupCode"); + vo.getSteps().remove("backupSql"); + } + if (!upgradeParam.getIsNeedCloudbuild()) { + vo.getSteps().remove("cloudBuild"); + vo.getSteps().remove("gteCloudBuildLog"); + } + + // 添加升级记录 + const content: JSONArray = new JSONArray(); + upgradeContent.getContent().stream().forEach(i => { + const item: Record = new Record(); + item.set("app_key", i.getApp().getAppKey()); + item.putByPath("app.name", i.getApp().getAppName()); + item.set("version", i.getVersion()); + item.set("upgrade_version", i.getUpgradeVersion()); + content.put(item); + }); + const record: SysUpgradeRecordsParam = new SysUpgradeRecordsParam(); + record.setUpgradeKey(vo.getKey()); + record.setStatus(UpgradeRecordStatusEnum.STATUS_READY.getStatus()); + record.setContent(content.toString()); + sysUpgradeRecordsService.add(record); + + setUpgradeTaskCache(vo); + return vo; } /** * getUpgradeTask */ async getUpgradeTask(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const cache: Cached = CacheFactory.getCacheOperator(); + const data: any = cache.get("upgrade"); + if (data == null) return null; + return JSONUtil.toBean(JSONUtil.parseObj(data), UpgradeTaskVo.class); } /** * setUpgradeTaskCache */ async setUpgradeTaskCache(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const cache: Cached = CacheFactory.getCacheOperator(); + cache.put("upgrade", JSONUtil.parseObj(vo).toString()); } /** * clearUpgradeTask */ async clearUpgradeTask(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + if (delayed > 0) { + try { + Thread.sleep(delayed * 1000); + } catch (Exception e) { + } + } + const cache: Cached = CacheFactory.getCacheOperator(); + cache.remove("upgrade"); } /** * execute */ async execute(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const vo: UpgradeTaskVo = this.getUpgradeTask(); + if (vo == null) return; + + if (ObjectUtil.isNotEmpty(vo.getStatus()) && vo.getStatus() === "restarting") return; + + const steps: string[] = vo.getSteps().keySet().stream().collect(Collectors.toList()); + const step: string = steps.indexOf(vo.getStep()) < steps.size() - 1 ? steps.get(steps.indexOf(vo.getStep()) + 1) : ""; + + if (!step.length === 0) { + if (!vo.getExecuted().includes(step)) { + vo.getExecuted().add(step); + vo.getLog().add(vo.getSteps().get(step).getTitle()); + } + try { + const param: Record = null; + param = (Map) dynamicMethodCall(step, vo); + if (param != null) { + vo.setParams(param); + } else { + vo.setStep(step); + vo.setParams(null); + vo.setAddon(vo.getUpgradeApps().get(0)); + } + setUpgradeTaskCache(vo); + } catch (Exception e) { + if (e.getMessage().includes("队列")) { + throw e; + } else { + vo.setStep(step); + vo.getError().add(e.getMessage()); + setUpgradeTaskCache(vo); + this.upgradeErrorHandle(vo); + e.printStackTrace(); + console.log("升级异常."); + } + } + } + } + + /** + * coverCode + */ + async coverCode(...args: any[]): Promise { + if (this.config.get('envType') === "dev") { + vo.getUpgradeContent().getContent().forEach(item => { + const appKey: string = item.getApp().getAppKey(); + const codeDir: string = upgradeDir(vo + "/download/" + appKey); + + // 判断目录存在并且不为空 + if (fs.existsSync(codeDir) && fs.readdirSync(codeDir).length > 0) { + item.getVersionList().stream().collect(Collectors.collectingAndThen( + Collectors.toList(), + l => { + Collections.reverse(l); + return l.stream(); + })).forEach(version => { + // 如果是框架 + const rootDir: string = null; + if (appKey === this.config.get('appKey')) { + rootDir = this.config.get('projectRoot'); + } else { + rootDir = this.config.get('webRootDownAddon', appKey); + } + + // 处理文件变更记录 + const changeRecord: string = codeDir, version.getVersionNo( + ".txt"); + if (fs.existsSync(changeRecord)) { + // 移除新版本删除的文件 + const change: string[] = null; + try { + change = Arrays.asList(FileUtils.readFileToString(changeRecord, "UTF-8").split("\n")); + } catch (IOException e) { + throw new Error(e); + } + if (ObjectUtil.isNotEmpty(change)) { + for (const line of change) { + String[] content = line.split(" "); + if (content[0] === "-") { + (rootDir, content[2]).deleteOnExit(); + } + } + } + } + + const changeDir: string = codeDir, version.getVersionNo(); + if (fs.existsSync(changeDir)) { + try { + FileUtils.copyDirectory(changeDir, rootDir); + } catch (IOException e) { + throw new Error(e); + } + } + }); + + const projectDir: string = this.config.get('projectNiucloudAddon', appKey); + if (fs.existsSync(projectDir)) { + try { + FileUtils.copyDirectory(this.config.get('webRootDownAddon' + appKey + "/java"), projectDir); + } catch (IOException e) { + throw new Error(e); + } + } + + // 合并resource + try { + FileUtils.copyDirectory(this.config.get('webRootDownAddon' + appKey + "/resource"), this.config.get('webRootDownResource', appKey)); + } catch (IOException e) { + } + } + }); + + vo.setStatus("restarting"); + setUpgradeTaskCache(vo); + } else { + vo.setStep("coverCode"); + vo.setStatus("restarting"); + setUpgradeTaskCache(vo); + FileUtils.writeStringToFile(upgradeDir(vo, "upgrade.json"), JSONUtil.parseObj(vo.getUpgradeContent()).toString(), "UTF-8"); + PipeNameUtils.noticeBootRestartByUpgrade(this.config.get('applicationName'), vo.getKey(), vo.getUpgradeContent().getLastBackup().getBackupKey()); + Thread.sleep(3000); + } + } + + /** + * handleVue + */ + async handleVue(...args: any[]): Promise { + const envs: WebAppEnvs = this.config; + + for (const key of vo.getUpgradeApps()) { + if (!key === this.config.get('appKey')) { + const sourceDir: string = envs.webRootDownAddon + key; + if (fs.existsSync(sourceDir)) { + addonInstallTools.installVue(key); + } + } + } + + const addons: string[] = addonMapper.selectList(new MPJQueryWrapper() + .select("`key`") + .eq("status", AddonStatusEnum.ON.getCode())) + .stream().map(i => i.getKey()).collect(Collectors.toList()) + ; + + // 处理pages.json + if (envs.webRoot + "uni-app/".exists()) addonInstallTools.handlePagesJson(envs.webRoot + "/uni-app/", addons); + if (envs.webRootDownRuntime + "uni-app/".exists()) addonInstallTools.handlePagesJson(envs.webRootDownRuntime + "/uni-app/", addons); + + // 处理组件 + if (envs.webRoot + "uni-app/".exists()) addonInstallTools.handleUniappComponent(envs.webRoot + "/uni-app/", addons); + if (envs.webRootDownRuntime + "uni-app/".exists()) addonInstallTools.handleUniappComponent(envs.webRootDownRuntime + "/uni-app/", addons); + + // 处理语言包 + for (const addon of addons) { + addonInstallTools.setAddon(addon); + if (envs.webRoot + "uni-app/".exists()) addonInstallTools.mergeUniappLocale(envs.webRoot + "/uni-app/", "install"); + if (envs.webRootDownRuntime + "uni-app/".exists()) addonInstallTools.mergeUniappLocale(envs.webRootDownRuntime + "/uni-app/", "install"); + + addonInstallTools.installDepend(addon); + } } /** * cloudBuild */ async cloudBuild(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + cloudBuildService.build("build"); } /** * upgradeComplete */ async upgradeComplete(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + vo.setStatus("success"); + + for (const key of vo.getUpgradeApps()) { + if (!key === this.config.get('appKey')) { + const addon: Addon = JSONUtil.toBean(coreAddonService.getAddonConfig(key), Addon.class); + coreAddonService.set(addon); + } + } + + const backupDir: string = upgradeDir(vo); + FileUtil.writeUtf8String(JSONUtil.toJsonPrettyStr(JSONUtil.parseObj(vo)), backupDir, DateUtil.now( + ".log")); + + // 变更升级记录 + const editParam: SysUpgradeRecordsParam = new SysUpgradeRecordsParam(); + editParam.setStatus(UpgradeRecordStatusEnum.STATUS_COMPLETE.getStatus()); + editParam.setCompleteTime(System.currentTimeMillis() / 1000); + sysUpgradeRecordsService.edit(vo.getKey(), editParam); + + upgradeService.clearUpgradeTask(5); + + cloudBuildService.clearBuildTask(); } /** * upgradeErrorHandle */ async upgradeErrorHandle(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + LinkedHashMap = new LinkedHashMap<>(); + steps.put("rollback", new UpgradeTaskVo.Step("rollback", "升级失败开始回滚")); + + if (vo.getExecuted().includes("coverCode")) { + steps.put("restoreCover", new UpgradeTaskVo.Step("restoreCover", "恢复变更文件")); + } + if (vo.getExecuted().includes("handleUpgrade")) { + steps.put("restoreDatabase", new UpgradeTaskVo.Step("restoreDatabase", "恢复数据库")); + } + steps.put("restoreComplete", new UpgradeTaskVo.Step("restoreComplete", "回滚完成")); + + vo.setSteps(steps); + vo.setStep("rollback"); + vo.getLog().add(steps.get("rollback").getTitle()); + vo.getExecuted().add("rollback"); + + setUpgradeTaskCache(vo); + + // 变更升级记录 + const editParam: SysUpgradeRecordsParam = new SysUpgradeRecordsParam(); + editParam.setStatus(UpgradeRecordStatusEnum.STATUS_FAIL.getStatus()); + editParam.setFailReason(JSONUtil.toJsonPrettyStr(vo.getError())); + sysUpgradeRecordsService.edit(vo.getKey(), editParam); } /** * operate */ async operate(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const vo: UpgradeTaskVo = this.getUpgradeTask(); + if (vo == null) return; + + switch (operate) { + case "local": + vo.setStep("gteCloudBuildLog"); + setUpgradeTaskCache(vo); + break; + case "rollback": + vo.getError().add("失败原因:一键云编译队列任务过多"); + upgradeErrorHandle(vo); + break; + } } /** * restoreComplete */ async restoreComplete(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + vo.setStatus("rollback"); + upgradeService.clearUpgradeTask(5); } /** * dynamicMethodCall */ async dynamicMethodCall(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + try { + // 获取当前类的 Class 对象 + Class clazz = this.getClass(); + // 获取方法对象 + java.lang.reflect.const method: Method = clazz.getMethod(methodName, extractParameterTypes(args)); + // 调用方法 + console.log("dynamicMethodCall method:" + methodName); + const result: any = method.invoke(this, args); + if (method.getReturnType() == void.class) { + return null; + } else { + return result; + } + } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { + if (e instanceof InvocationTargetException) { + ((InvocationTargetException) e).getCause().printStackTrace(); + throw new BadRequestException(((InvocationTargetException) e).getCause().getMessage()); + } else { + e.printStackTrace(); + } + return null; + } } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/upload/impl/storage-config-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/upload/impl/storage-config-service-impl.service.ts index 7ac9465f..d7c45eef 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/upload/impl/storage-config-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/upload/impl/storage-config-service-impl.service.ts @@ -14,23 +14,99 @@ export class StorageConfigServiceImplService { * getStorageList */ async getStorageList(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return coreStorageService.getStorageList(RequestUtils.siteId()); } /** * getStorageConfig */ async getStorageConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const storageTypeList: Record = UploadLoader.getType(); + if (ObjectUtil.isNull(storageTypeList.get(storageType))) { + throw new AdminException("OSS_TYPE_NOT_EXIST"); + } + /** + * 获取配置 + */ + const storageConfig: Record = coreStorageService.getStorageConfig(RequestUtils.siteId()); + + const storageValues: Record = JSONUtil.parseObj(storageTypeList.get(storageType)); + const coreStorAgeConfigVo: CoreStorAgeConfigVo = new CoreStorAgeConfigVo(); + coreStorAgeConfigVo.setStorageType(storageType); + coreStorAgeConfigVo.setIsUse(storageType === storageConfig.get("default") ? StorageEnum.ON.getCode() : StorageEnum.OFF.getCode()); + coreStorAgeConfigVo.setName(storageValues.get("name").toString()); + coreStorAgeConfigVo.setComponent(storageValues.get("component").toString()); + + const encryptParams: JSONArray = ObjectUtil.defaultIfNull(storageValues.getJSONArray("encrypt_params"), new JSONArray()); + + const params: Record = new Record(); + if (ObjectUtil.isNotNull(storageValues.get("params"))) { + const valuesParams: Record = JSONUtil.parseObj(storageValues.get("params")); + const configParams: Record = new Record(); + if (ObjectUtil.isNotNull(storageConfig.get(storageType))) { + configParams = JSONUtil.parseObj(storageConfig.get(storageType)); + } + for (const paramsKey of valuesParams.keySet()) { + const itemParam: Record = new Record(); + const paramsValues: string = valuesParams.get(paramsKey).toString(); + itemParam.set("name", paramsValues); + const value: string = configParams.getStr(paramsKey); + if (encryptParams.includes(paramsKey) && ObjectUtil.isNotEmpty(value)) { + value = StringUtils.hide(value, 0, value.length()); + } + itemParam.set("value", value); + params.set(paramsKey, itemParam); + } + } + coreStorAgeConfigVo.setParams(params); + return coreStorAgeConfigVo; } /** * setStorageConfig */ async setStorageConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const storageTypeList: Record = UploadLoader.getType(); + if (ObjectUtil.isNull(storageTypeList.get(storageType))) { + throw new AdminException("云存储类型不存在"); + } + if (!storageType === FileEnum.LOCAL.getCode()) { + const domain: string = storageData.getStr("domain"); + if (domain.indexOf("http://") < 0 && domain.indexOf("https://") < 0) { + throw new AdminException("空间域名请补全http://或https://"); + } + } + /** + * 获取配置 + */ + const storageConfig: Record = coreStorageService.getStorageConfig(RequestUtils.siteId()); + + const storageValues: Record = JSONUtil.parseObj(storageTypeList.get(storageType)); + if (storageData.getInt("is_use") == 1) { + storageConfig.set("default", storageType); + } else { + if (storageData.getStr("storage_type") === storageConfig.get("default")) { + storageConfig.set("default", ""); + } + } + + const configParams: Record = new Record(); + if (ObjectUtil.isNotNull(storageConfig.get(storageType))) { + configParams = JSONUtil.parseObj(storageConfig.get(storageType)); + } + + if (ObjectUtil.isNotNull(storageValues.get("params"))) { + const valuesParams: Record = JSONUtil.parseObj(storageValues.get("params")); + for (const paramsKey of valuesParams.keySet()) { + const value: string = storageData.getStr(paramsKey); + if (!value.includes("*")) { + configParams.set(paramsKey, value); + } + } + } + + storageConfig.set(storageType, configParams); + + coreConfigService.setConfig(RequestUtils.siteId(), "STORAGE", storageConfig); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/verify/impl/verifier-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/verify/impl/verifier-service-impl.service.ts index 68e2df17..0430b893 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/verify/impl/verifier-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/verify/impl/verifier-service-impl.service.ts @@ -14,31 +14,79 @@ export class VerifierServiceImplService { * list */ async list(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return []; + const page: number = pageParam.getPage(); + const limit: number = pageParam.getLimit(); + + const queryWrapper: MPJQueryWrapper = new MPJQueryWrapper<>(); + queryWrapper.setAlias("v").innerJoin("?_member m ON v.member_id = m.member_id".replace("?_", this.config.get('tablePrefix'))); + queryWrapper.select("v.*,m.member_no,m.username,m.nickname,m.mobile,m.headimg"); + queryWrapper.eq("v.site_id", RequestUtils.siteId()); + queryWrapper.orderByDesc("id"); + + const iPage: IPage = verifierMapper.selectJoinPage(new Page<>(page, limit), VerifierVo.class, queryWrapper); + const list: VerifierListVo[] = []; + for (const item of iPage.getRecords()) { + const vo: VerifierListVo = new VerifierListVo(); + BeanUtils.copyProperties(item, vo); + + const memberInfoVo: MemberBriefInfoVo = new MemberBriefInfoVo(); + BeanUtils.copyProperties(item, memberInfoVo); + vo.setMember(memberInfoVo); + + list.add(vo); + } + return PageResult.build(page, limit, iPage.getTotal()).setData(list); } /** * all */ async all(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const queryWrapper: MPJQueryWrapper = new MPJQueryWrapper<>(); + queryWrapper.setAlias("v").innerJoin("?_member m ON v.member_id = m.member_id".replace("?_", this.config.get('tablePrefix'))); + queryWrapper.select("v.*,m.member_no,m.username,m.nickname,m.mobile,m.headimg"); + queryWrapper.eq("v.site_id", RequestUtils.siteId()); + queryWrapper.orderByDesc("id"); + + const verifierList: VerifierVo[] = verifierMapper.selectJoinList(VerifierVo.class, queryWrapper); + + const list: VerifierListVo[] = []; + for (const item of verifierList) { + const vo: VerifierListVo = new VerifierListVo(); + BeanUtils.copyProperties(item, vo); + + const memberInfoVo: MemberBriefInfoVo = new MemberBriefInfoVo(); + BeanUtils.copyProperties(item, memberInfoVo); + vo.setMember(memberInfoVo); + + list.add(vo); + } + return list; } /** * add */ async add(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const member: Member = memberMapper.selectOne(new QueryWrapper().select("member_id").eq("member_id", addParam.getMemberId()).eq("site_id", RequestUtils.siteId())); + Assert.notNull(member, "会员不存在"); + + const verifier: Verifier = verifierMapper.selectOne(new QueryWrapper().select("id").eq("member_id", addParam.getMemberId()).eq("site_id", RequestUtils.siteId())); + if (ObjectUtil.isNotEmpty(verifier)) return; + + const model: Verifier = new Verifier(); + model.setSiteId(RequestUtils.siteId()); + model.setMemberId(addParam.getMemberId()); + model.setCreateTime(System.currentTimeMillis() / 1000); + model.setVerifyType(JSONUtil.parseArray(addParam.getVerifyType()).toString()); + + verifierMapper.insert(model); } /** * del */ async del(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + verifierMapper.delete(new QueryWrapper().eq("id", id).eq("site_id", RequestUtils.siteId())); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/verify/impl/verify-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/verify/impl/verify-service-impl.service.ts index 436ed713..45813d6e 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/verify/impl/verify-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/verify/impl/verify-service-impl.service.ts @@ -14,15 +14,69 @@ export class VerifyServiceImplService { * list */ async list(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return []; + const page: number = pageParam.getPage(); + const limit: number = pageParam.getLimit(); + + const queryWrapper: MPJQueryWrapper = new MPJQueryWrapper<>(); + queryWrapper.setAlias("v").innerJoin("?_member m ON v.verifier_member_id = m.member_id".replace("?_", this.config.get('tablePrefix'))); + queryWrapper.select("v.*,m.member_no,m.username,m.nickname,m.mobile,m.headimg"); + queryWrapper.eq("v.site_id", RequestUtils.siteId()); + queryWrapper.orderByDesc("id"); + + if (ObjectUtil.isNotEmpty(searchParam.getCode())) queryWrapper.eq("code", searchParam.getCode()); + if (ObjectUtil.isNotEmpty(searchParam.getType())) queryWrapper.eq("type", searchParam.getType()); + if (ObjectUtil.isNotEmpty(searchParam.getVerifierMemberId())) queryWrapper.eq("verifier_member_id", searchParam.getVerifierMemberId()); + if (ObjectUtil.isNotEmpty(searchParam.getCreateTime())) QueryMapperUtils.buildByTime(queryWrapper, "v.create_time", searchParam.getCreateTime()); + if (ObjectUtil.isNotEmpty(searchParam.getOrderId())){ + queryWrapper.like("data", searchParam.getOrderId()); + } + + const iPage: IPage = verifyMapper.selectJoinPage(new Page<>(page, limit), VerifyVo.class, queryWrapper); + const list: VerifyListVo[] = []; + for (const item of iPage.getRecords()) { + const vo: VerifyListVo = new VerifyListVo(); + BeanUtils.copyProperties(item, vo); + + const memberInfoVo: MemberBriefInfoVo = new MemberBriefInfoVo(); + BeanUtils.copyProperties(item, memberInfoVo); + vo.setMember(memberInfoVo); + + list.add(vo); + } + return PageResult.build(page, limit, iPage.getTotal()).setData(list); } /** * detail */ async detail(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const queryWrapper: MPJQueryWrapper = new MPJQueryWrapper<>(); + queryWrapper.setAlias("v").innerJoin("?_member m ON v.verifier_member_id = m.member_id".replace("?_", this.config.get('tablePrefix'))); + queryWrapper.select("v.*,m.member_no,m.username,m.nickname,m.mobile,m.headimg"); + queryWrapper.eq("v.site_id", RequestUtils.siteId()); + queryWrapper.eq("v.code", code); + + const model: VerifyVo = verifyMapper.selectJoinOne(VerifyVo.class, queryWrapper); + Assert.notNull(model, "数据不存在"); + + const vo: VerifyInfoVo = new VerifyInfoVo(); + BeanUtils.copyProperties(model, vo); + + const memberInfoVo: MemberBriefInfoVo = new MemberBriefInfoVo(); + BeanUtils.copyProperties(model, memberInfoVo); + vo.setMember(memberInfoVo); + + VerifyInfoEventDefiner.const event: VerifyInfoEvent = new VerifyInfoEventDefiner.VerifyInfoEvent(); + event.setData(vo); + const list: VerifyInfoEventDefiner.VerifyInfoEventResult[] = EventAndSubscribeOfPublisher.publishAndCallback(event); + if (!CollectionUtils.isEmpty(list)){ + for (VerifyInfoEventDefiner.VerifyInfoEventResult verifyInfoEventResult : list) { + if (verifyInfoEventResult != null && verifyInfoEventResult.getDataMap() != null && !verifyInfoEventResult.getDataMap().isEmpty()){ + vo.setVerifyInfo(verifyInfoEventResult.getDataMap()); + break; + } + } + } + return vo; } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/weapp/impl/weapp-config-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/weapp/impl/weapp-config-service-impl.service.ts index faeb7871..8971e1db 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/weapp/impl/weapp-config-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/weapp/impl/weapp-config-service-impl.service.ts @@ -14,39 +14,78 @@ export class WeappConfigServiceImplService { * getWeappConfig */ async getWeappConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const weappConfigVo: WeappConfigVo = coreWeappConfigService.getWeappConfig(RequestUtils.siteId()); + weappConfigVo = staticInfo(weappConfigVo); + + if (weappConfigVo.getIsAuthorization() === 1) { + try { + const wxOpenMaService: WxOpenMaService = (WxOpenMaService) WechatUtils.miniapp(RequestUtils.siteId()); + const domainResult: WxOpenMaDomainResult = wxOpenMaService.getDomain(); + if (domainResult.getErrcode() === "0") { + WeappConfigVo.const domain: Domain = new WeappConfigVo.Domain(); + domain.setRequestdomain(String.join(";", domainResult.getRequestDomain())); + domain.setWsrequestdomain(String.join(";", domainResult.getWsRequestDomain())); + domain.setUploaddomain(String.join(";", domainResult.getUploadDomain())); + domain.setDownloaddomain(String.join(";", domainResult.getDownloadDomain())); + weappConfigVo.setDomain(domain); + } + } catch (Exception e) { + } + } + + return weappConfigVo; } /** * setWeappConfig */ async setWeappConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + coreWeappConfigService.setWeappConfig(RequestUtils.siteId(), weappConfigParam); } /** * setDomain */ async setDomain(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + try { + const wxOpenMaService: WxOpenMaService = (WxOpenMaService) WechatUtils.miniapp(RequestUtils.siteId()); + wxOpenMaService.modifyDomain( + "set", + ObjectUtil.isNotEmpty(param.getRequestdomain()) ? Arrays.asList(param.getRequestdomain().split(";")) : [], + ObjectUtil.isNotEmpty(param.getWsrequestdomain())? Arrays.asList(param.getWsrequestdomain().split(";")) : [], + ObjectUtil.isNotEmpty(param.getUploaddomain())? Arrays.asList(param.getUploaddomain().split(";")) : [], + ObjectUtil.isNotEmpty(param.getDownloaddomain())? Arrays.asList(param.getDownloaddomain().split(";")) : [], + ObjectUtil.isNotEmpty(param.getTcpdomain())? Arrays.asList(param.getTcpdomain().split(";")) : [], + ObjectUtil.isNotEmpty(param.getUdpdomain())? Arrays.asList(param.getUdpdomain().split(";")) : [] + ); + } catch (Exception e) { + throw new BadRequestException(e.getMessage()); + } } /** * getPrivacySetting */ async getPrivacySetting(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + try { + const wxOpenMaService: WxOpenMaService = (WxOpenMaService) WechatUtils.miniapp(RequestUtils.siteId()); + return wxOpenMaService.getPrivacyService().getPrivacySetting(2); + } catch (Exception e) { + throw new BadRequestException(e.getMessage()); + } } /** * setPrivacySetting */ async setPrivacySetting(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + try { + const wxOpenMaService: WxOpenMaService = (WxOpenMaService) WechatUtils.miniapp(RequestUtils.siteId()); + const setPrivacySetting: SetPrivacySetting = JSONUtil.toBean(privacySetting, SetPrivacySetting.class); + setPrivacySetting.setPrivacyVer(2); + wxOpenMaService.getPrivacyService().setPrivacySetting(setPrivacySetting); + } catch (Exception e) { + throw new BadRequestException(e.getMessage()); + } } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/weapp/impl/weapp-template-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/weapp/impl/weapp-template-service-impl.service.ts index a8bf63e4..9fdc24a0 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/weapp/impl/weapp-template-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/weapp/impl/weapp-template-service-impl.service.ts @@ -14,15 +14,35 @@ export class WeappTemplateServiceImplService { * list */ async list(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return []; + const addonNoticeList: AddonNoticeListVo[] = coreNoticeService.getAddonList(RequestUtils.siteId()); + + for (const item of addonNoticeList) { + const filter: NoticeInfoVo[] = []; + for (const noticeItem of item.getNotice()) { + if (noticeItem.getSupport_type().indexOf("weapp") != -1) { + filter.add(noticeItem); + } + } + item.setNotice(filter); + } + return addonNoticeList; } /** * sync */ async sync(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const list: Record = coreNoticeService.getList(RequestUtils.siteId(), param.getKeys()); + const keys: string[] = Arrays.asList(param.getKeys()); + + for (const item of list.values()) { + if (item.getWeapp() != null && (keys.size() == 0 || keys.includes(item.getKey()))) { + if (item.getWeappTemplateId().length() > 0) { + deleteTemplate(item.getWeappTemplateId()); + } + const templateId: string = addTemplate(item.getWeapp().get("tid").toString(), item.getWeapp().getJSONArray("kid_list").toList(number.class), item.getWeapp().get("scene_desc").toString()); + coreNoticeService.edit(RequestUtils.siteId(), item.getKey(), new Record().set("weapp_template_id", templateId)); + } + } } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/weapp/impl/weapp-version-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/weapp/impl/weapp-version-service-impl.service.ts index 39a33cdf..0505838a 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/weapp/impl/weapp-version-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/weapp/impl/weapp-version-service-impl.service.ts @@ -14,31 +14,119 @@ export class WeappVersionServiceImplService { * list */ async list(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return []; + const page: number = pageParam.getPage(); + const limit: number = pageParam.getLimit(); + + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + queryWrapper.eq("site_id", RequestUtils.siteId()); + queryWrapper.orderByDesc("id"); + + const iPage: IPage = weappVersionMapper.selectPage(new Page(page, limit), queryWrapper); + + const list: WeappVersionListVo[] = []; + for (const item of iPage.getRecords()) { + const vo: WeappVersionListVo = new WeappVersionListVo(); + BeanUtils.copyProperties(item, vo); + list.add(vo); + } + return PageResult.build(page,limit, iPage.getTotal()).setData(list); } /** * add */ async add(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + if (!RequestUtils.handler().getScheme() === "https") throw new BadRequestException("微信小程序请求地址只支持https请先配置ssl"); + + const weappConfig: WeappConfigVo = coreWeappConfigService.getWeappConfig(RequestUtils.siteId()); + if (weappConfig.getAppId().isEmpty()) throw new BadRequestException("还没有配置微信小程序"); + if (weappConfig.getUploadPrivateKey().isEmpty()) throw new BadRequestException("还没有配置微信小程序代码上传秘钥"); + + const uploading: WeappVersion = weappVersionMapper.selectOne(new QueryWrapper().select("id").eq("site_id", RequestUtils.siteId()).eq("status", WeappVersionStatusEnum.APPLET_UPLOADING)); + if (uploading != null) throw new BadRequestException("小程序有正在上传的版本,请等待上一版本上传完毕后再进行操作"); + + const lastVersion: WeappVersion = weappVersionMapper.selectOne(new QueryWrapper().select("version_no").eq("site_id", RequestUtils.siteId()).orderByDesc("version_no").last("limit 1")); + const versionNo: number = lastVersion == null ? 1 : lastVersion.getVersionNo() + 1; + + const addons: string[] = coreSiteService.getAddonKeysBySiteId(RequestUtils.siteId()); + + const uploadParam: WeappUploadParam = new WeappUploadParam(); + uploadParam.setBaseUrl(RequestUtils.getDomain(true)); + uploadParam.setAppId(weappConfig.getAppId()); + uploadParam.setUploadPrivateKey(weappConfig.getUploadPrivateKey()); + uploadParam.setSiteId(RequestUtils.siteId()); + uploadParam.setVersion("1.0." + versionNo); + uploadParam.setDesc(param.getDesc()); + uploadParam.setAddon(addons); + const taskKey: string = coreWeappCloudService.uploadWeapp(uploadParam); + + const model: WeappVersion = new WeappVersion(); + model.setSiteId(RequestUtils.siteId()); + model.setVersion(uploadParam.getVersion()); + model.setVersionNo(versionNo); + model.setDesc(param.getDesc()); + model.setTaskKey(taskKey); + model.setCreateTime(System.currentTimeMillis() / 1000); + + weappVersionMapper.insert(model); } /** * getWeappCompileLog */ async getWeappCompileLog(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const log: Record = coreWeappCloudService.getWeappCompileLog(key); + if (log != null) { + const data: JSONArray = ObjectUtil.defaultIfNull(log.getByPath("data.0", JSONArray.class), new JSONArray()); + if (data.size() > 0) { + const last: Record = data.getJSONObject(data.size() - 1); + if (last.getInt("code", -1) === 0) { + const model: WeappVersion = new WeappVersion(); + model.setStatus(WeappVersionStatusEnum.APPLET_UPLOAD_FAIL.getStatus()); + model.setFailReason(last.getStr("msg", "")); + model.setUpdateTime(System.currentTimeMillis() / 1000); + + weappVersionMapper.update(model, new QueryWrapper().eq("task_key", key)); + return log; + } + if (last.getInt("percent", 0) === 100) { + const model: WeappVersion = new WeappVersion(); + model.setStatus(WeappVersionStatusEnum.APPLET_UPLOAD_SUCCESS.getStatus()); + model.setUpdateTime(System.currentTimeMillis() / 1000); + + weappVersionMapper.update(model, new QueryWrapper().eq("task_key", key)); + } + } + } + return log; } /** * getWeappPreviewImage */ async getWeappPreviewImage(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + number[] status = new number[] { WeappVersionStatusEnum.APPLET_AUDITING.getStatus(), WeappVersionStatusEnum.APPLET_UPLOAD_SUCCESS.getStatus() }; + const version: WeappVersion = weappVersionMapper.selectOne(new QueryWrapper() + .eq("site_id", RequestUtils.siteId()) + .in("status", status) + .orderByDesc("id") + .last("limit 1") + ); + if (version == null) return ""; + + if (version.getFromType() === "cloud_build") { + return coreWeappCloudService.getWeappPreviewImage(); + } else { + try { + const wxOpenMaService: WxOpenMaService = (WxOpenMaService) WechatUtils.miniapp(RequestUtils.siteId()); + const qrcode: string = wxOpenMaService.getTestQrcode("", {}); + if (fs.existsSync(qrcode)) { + return "data:image/jpeg;base64," + Base64.getEncoder().encodeToString(FileUtils.readFileToByteArray(qrcode)); + } + return ""; + } catch (Exception e) { + return ""; + } + } } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/wechat/impl/wechat-config-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/wechat/impl/wechat-config-service-impl.service.ts index fb5c9317..ca5f3915 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/wechat/impl/wechat-config-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/wechat/impl/wechat-config-service-impl.service.ts @@ -14,23 +14,30 @@ export class WechatConfigServiceImplService { * getWechatConfig */ async getWechatConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return coreWechatConfigService.getWechatConfig(RequestUtils.siteId()); } /** * setWechatConfig */ async setWechatConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + coreWechatConfigService.setWechatConfig(RequestUtils.siteId(), wechatConfigParam); } /** * staticInfo */ async staticInfo(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const sysUrl: SceneDomainVo = sysConfigService.getUrl(); + const request: HttpServletRequest = RequestUtils.handler(); + + const vo: WechatStaticInfoVo = new WechatStaticInfoVo(); + vo.setServeUrl(request.getScheme() + "://" + request.getServerName() + "/api/wechat/serve/" + RequestUtils.siteId()); + vo.setBusinessDomain(sysUrl.getWapDomain()); + vo.setJsSecureDomain(sysUrl.getWapDomain()); + vo.setWebAuthDomain(sysUrl.getWapDomain()); + vo.setEncryptionType(WechatEncryptionTypeEnum.getMap()); + + return vo; } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/wechat/impl/wechat-media-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/wechat/impl/wechat-media-service-impl.service.ts index 48e8fa8c..1e61cf6f 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/wechat/impl/wechat-media-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/wechat/impl/wechat-media-service-impl.service.ts @@ -14,31 +14,130 @@ export class WechatMediaServiceImplService { * list */ async list(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return []; + const page: number = pageParam.getPage(); + const limit: number = pageParam.getLimit(); + + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + queryWrapper.eq("site_id", RequestUtils.siteId()); + queryWrapper.orderByDesc("id"); + + if (ObjectUtil.isNotEmpty(searchParam.getType())) queryWrapper.eq("type", searchParam.getType()); + + const iPage: IPage = wechatMediaMapper.selectPage(new Page<>(page, limit), queryWrapper); + const list: WechatMediaListVo[] = []; + for (const item of iPage.getRecords()) { + const vo: WechatMediaListVo = new WechatMediaListVo(); + BeanUtils.copyProperties(item, vo); + list.add(vo); + } + return PageResult.build(page, limit, iPage.getTotal()).setData(list); } /** * image */ async image(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const param: AttachmentUploadParam = new AttachmentUploadParam(); + param.setSiteId(RequestUtils.siteId()); + param.setStorageType("local"); + param.setFile(file); + param.setAttType("image"); + param.setDir("attachment/image/" + param.getSiteId() + "/" + (new SimpleDateFormat("yyyyMM/dd").format(new Date())) + "/"); + const uploadRes: AttachmentUploadVo = coreUploadService.upload(param); + + const wxMaterial: WxMpMaterial = new WxMpMaterial(); + wxMaterial.setFile(this.config.get('webRootDownResource' + uploadRes.getUrl())); + wxMaterial.setName(param.getNewFilename()); + + try { + const res: WxMpMaterialUploadResult = WechatUtils.mp(RequestUtils.siteId()).getMaterialService().materialFileUpload(WechatMediaTypeEnum.IMAGE.getType(), wxMaterial); + + const model: WechatMedia = new WechatMedia(); + model.setSiteId(RequestUtils.siteId()); + model.setType(WechatMediaTypeEnum.IMAGE.getType()); + model.setValue(uploadRes.getUrl()); + model.setMediaId(res.getMediaId()); + model.setCreateTime(System.currentTimeMillis() / 1000); + wechatMediaMapper.insert(model); + + const vo: WechatMediaInfoVo = new WechatMediaInfoVo(); + BeanUtils.copyProperties(model, vo); + return vo; + } catch (Exception e) { + throw new BadRequestException(e.getMessage()); + } } /** * video */ async video(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const param: AttachmentUploadParam = new AttachmentUploadParam(); + param.setSiteId(RequestUtils.siteId()); + param.setStorageType("local"); + param.setFile(file); + param.setAttType("video"); + param.setDir("attachment/video/" + param.getSiteId() + "/" + (new SimpleDateFormat("yyyyMM/dd").format(new Date())) + "/"); + const uploadRes: AttachmentUploadVo = coreUploadService.upload(param); + + const wxMaterial: WxMpMaterial = new WxMpMaterial(); + wxMaterial.setFile(this.config.get('webRootDownResource' + uploadRes.getUrl())); + wxMaterial.setName(param.getNewFilename()); + wxMaterial.setVideoIntroduction((new SimpleDateFormat("yyyyMM/dd").format(new Date())) + "上传"); + wxMaterial.setVideoTitle(param.getNewFilename()); + + try { + const res: WxMpMaterialUploadResult = WechatUtils.mp(RequestUtils.siteId()).getMaterialService().materialFileUpload(WechatMediaTypeEnum.VIDEO.getType(), wxMaterial); + + const model: WechatMedia = new WechatMedia(); + model.setSiteId(RequestUtils.siteId()); + model.setType(WechatMediaTypeEnum.VIDEO.getType()); + model.setValue(uploadRes.getUrl()); + model.setMediaId(res.getMediaId()); + model.setCreateTime(System.currentTimeMillis() / 1000); + wechatMediaMapper.insert(model); + + const vo: WechatMediaInfoVo = new WechatMediaInfoVo(); + BeanUtils.copyProperties(model, vo); + return vo; + } catch (Exception e) { + throw new BadRequestException(e.getMessage()); + } } /** * syncNews */ async syncNews(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + try { + const count: number = 20; + + const result: WxMpMaterialNewsBatchGetResult = WechatUtils.mp(RequestUtils.siteId()).getMaterialService().materialNewsBatchGet(offset, count); + if (result.getItemCount() > 0) { + for (WxMpMaterialNewsBatchGetResult.WxMaterialNewsBatchGetNewsItem item: result.getItems()) { + const media: WechatMedia = wechatMediaMapper.selectOne(new QueryWrapper().eq("site_id", RequestUtils.siteId()).eq("media_id", item.getMediaId())); + + if (ObjectUtil.isNotEmpty(media)) { + media.setValue(JSONUtil.toJsonStr(item.getContent())); + media.setUpdateTime(System.currentTimeMillis() / 1000); + wechatMediaMapper.updateById(media); + } else { + const model: WechatMedia = new WechatMedia(); + model.setSiteId(RequestUtils.siteId()); + model.setType(WechatMediaTypeEnum.VIDEO.getType()); + model.setValue(JSONUtil.toJsonStr(item.getContent())); + model.setMediaId(item.getMediaId()); + model.setCreateTime(System.currentTimeMillis() / 1000); + wechatMediaMapper.insert(model); + } + } + } + if (offset < Math.ceil(result.getTotalCount() / count)) { + offset++; + this.syncNews(offset); + } + } catch (Exception e) { + throw new BadRequestException(e.getMessage()); + } } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/wechat/impl/wechat-menu-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/wechat/impl/wechat-menu-service-impl.service.ts index bcd33b95..613b30cf 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/wechat/impl/wechat-menu-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/wechat/impl/wechat-menu-service-impl.service.ts @@ -14,15 +14,20 @@ export class WechatMenuServiceImplService { * info */ async info(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return coreConfigService.getConfigArrayValue(RequestUtils.siteId(), "WECHAT_MENU"); } /** * edit */ async edit(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + try{ + const params: Record = {}; + params.put("button", data); + WechatUtils.mp(RequestUtils.siteId()).getMenuService().menuCreate(JSONUtil.parseObj(params).toString()) ; + coreConfigService.setConfig(RequestUtils.siteId(), "WECHAT_MENU", data); + }catch (WxErrorException e){ + throw new AdminException(e.getMessage()); + } } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/wechat/impl/wechat-reply-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/wechat/impl/wechat-reply-service-impl.service.ts index 6baa0ffa..3dd57695 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/wechat/impl/wechat-reply-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/wechat/impl/wechat-reply-service-impl.service.ts @@ -14,71 +14,150 @@ export class WechatReplyServiceImplService { * getKeywordList */ async getKeywordList(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const page: number = pageParam.getPage(); + const limit: number = pageParam.getLimit(); + + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + queryWrapper.eq("reply_type", WechatReplyTypeEnum.REPLY_KEYWORD.getType()); + queryWrapper.eq("site_id", RequestUtils.siteId()); + queryWrapper.orderByDesc(Arrays.asList("sort", "id")); + + if (ObjectUtil.isNotEmpty(searchParam.getKeyword())) queryWrapper.like("keyword", searchParam.getKeyword()); + if (ObjectUtil.isNotEmpty(path.basename(searchParam))) queryWrapper.like("name", path.basename(searchParam)); + + const iPage: IPage = wechatReplyMapper.selectPage(new Page<>(page, limit), queryWrapper); + const list: WechatReplyListVo[] = []; + for (const item of iPage.getRecords()) { + const vo: WechatReplyListVo = new WechatReplyListVo(); + BeanUtils.copyProperties(item, vo); + list.add(vo); + } + return PageResult.build(page, limit, iPage.getTotal()).setData(list); } /** * getKeywordInfo */ async getKeywordInfo(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: WechatReply = wechatReplyMapper.selectOne( + new QueryWrapper() + .eq("id", id) + .eq("site_id", RequestUtils.siteId()) + .eq("reply_type", WechatReplyTypeEnum.REPLY_KEYWORD.getType())); + + Assert.notNull(model, "数据不存在"); + + const vo: WechatReplyInfoVo = new WechatReplyInfoVo(); + BeanUtils.copyProperties(model, vo); + return vo; } /** * addKeyword */ async addKeyword(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: WechatReply = new WechatReply(); + model.setName(path.basename(addParam)); + model.setSiteId(RequestUtils.siteId()); + model.setKeyword(addParam.getKeyword()); + model.setReplyType(WechatReplyTypeEnum.REPLY_KEYWORD.getType()); + model.setMatchingType(addParam.getMatchingType()); + model.setContent(addParam.getContent().toString()); + model.setSort(addParam.getSort()); + model.setCreateTime(System.currentTimeMillis() / 1000); + model.setReplyMethod(addParam.getReplyMethod()); + wechatReplyMapper.insert(model); } /** * editKeyword */ async editKeyword(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: WechatReply = wechatReplyMapper.selectOne( + new QueryWrapper() + .eq("id", id) + .eq("site_id", RequestUtils.siteId()) + .eq("reply_type", WechatReplyTypeEnum.REPLY_KEYWORD.getType())); + + Assert.notNull(model, "数据不存在!"); + + model.setName(path.basename(editParam)); + model.setKeyword(editParam.getKeyword()); + model.setMatchingType(editParam.getMatchingType()); + model.setContent(editParam.getContent().toString()); + model.setSort(editParam.getSort()); + model.setUpdateTime(System.currentTimeMillis() / 1000); + model.setReplyMethod(editParam.getReplyMethod()); + wechatReplyMapper.updateById(model); } /** * getDefault */ async getDefault(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return coreWechatReplyService.getDefault(RequestUtils.siteId()); } /** * editDefault */ async editDefault(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const queryWrapper: QueryWrapper = new QueryWrapper() + .eq("reply_type", WechatReplyTypeEnum.REPLY_DEFAULT.getType()) + .eq("site_id", RequestUtils.siteId()); + + const reply: WechatReply = wechatReplyMapper.selectOne(queryWrapper); + + if (ObjectUtil.isEmpty(reply)) { + const model: WechatReply = new WechatReply(); + model.setContent(param.getContent().toString()); + model.setSiteId(RequestUtils.siteId()); + model.setReplyType(WechatReplyTypeEnum.REPLY_DEFAULT.getType()); + wechatReplyMapper.insert(model); + } else { + const model: WechatReply = new WechatReply(); + model.setContent(param.getContent().toString()); + wechatReplyMapper.update(model, queryWrapper); + } } /** * getSubscribe */ async getSubscribe(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return coreWechatReplyService.getSubscribe(RequestUtils.siteId()); } /** * editSubscribe */ async editSubscribe(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const queryWrapper: QueryWrapper = new QueryWrapper() + .eq("reply_type", WechatReplyTypeEnum.REPLY_SUBSCRIBE.getType()) + .eq("site_id", RequestUtils.siteId()); + + const reply: WechatReply = wechatReplyMapper.selectOne(queryWrapper); + + if (ObjectUtil.isEmpty(reply)) { + const model: WechatReply = new WechatReply(); + model.setContent(param.getContent().toString()); + model.setSiteId(RequestUtils.siteId()); + model.setReplyType(WechatReplyTypeEnum.REPLY_DEFAULT.getType()); + wechatReplyMapper.insert(model); + } else { + const model: WechatReply = new WechatReply(); + model.setContent(param.getContent().toString()); + wechatReplyMapper.update(model, queryWrapper); + } } /** * delKeyword */ async delKeyword(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + wechatReplyMapper.delete(new QueryWrapper() + .eq("reply_type", WechatReplyTypeEnum.REPLY_KEYWORD.getType()) + .eq("id", id) + .eq("site_id", RequestUtils.siteId())); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/wechat/impl/wechat-template-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/wechat/impl/wechat-template-service-impl.service.ts index 64c57b7f..030c614b 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/wechat/impl/wechat-template-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/wechat/impl/wechat-template-service-impl.service.ts @@ -14,15 +14,35 @@ export class WechatTemplateServiceImplService { * list */ async list(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return []; + const addonNoticeList: AddonNoticeListVo[] = coreNoticeService.getAddonList(RequestUtils.siteId()); + + for (const item of addonNoticeList) { + const filter: NoticeInfoVo[] = []; + for (const noticeItem of item.getNotice()) { + if (noticeItem.getSupport_type().indexOf("wechat") != -1) { + filter.add(noticeItem); + } + } + item.setNotice(filter); + } + return addonNoticeList; } /** * sync */ async sync(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const list: Record = coreNoticeService.getList(RequestUtils.siteId(), param.getKeys()); + const keys: string[] = Arrays.asList(param.getKeys()); + + for (const item of list.values()) { + if (item.getWechat() != null && (keys.size() == 0 || keys.includes(item.getKey()))) { + if (item.getWeappTemplateId().length() > 0) { + deleteTemplate(item.getWeappTemplateId()); + } + const templateId: string = addTemplate(item.getWechat().get("temp_key").toString(), item.getWechat().getJSONArray("keyword_name_list").toList(String.class)); + coreNoticeService.edit(RequestUtils.siteId(), item.getKey(), new Record().set("wechat_template_id", templateId)); + } + } } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/wxoplatform/impl/oplatform-config-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/wxoplatform/impl/oplatform-config-service-impl.service.ts index 0a5c164b..363735e4 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/wxoplatform/impl/oplatform-config-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/wxoplatform/impl/oplatform-config-service-impl.service.ts @@ -14,23 +14,28 @@ export class OplatformConfigServiceImplService { * getOplatformStaticInfo */ async getOplatformStaticInfo(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return coreOplatformConfigService.getOplatformStaticInfo(); } /** * getWxOplatformConfig */ async getWxOplatformConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const jsonObject: Record = coreConfigService.getConfigValue(RequestUtils.defaultSiteId(), ConfigKeyEnum.path.basename(WXOPLATFORM)); + const configJsonObject: Record = new Record(); + configJsonObject.set("app_id", jsonObject.getStr("app_id", "")); + configJsonObject.set("app_secret", jsonObject.getStr("app_secret", "")); + configJsonObject.set("token", jsonObject.getStr("token", "")); + configJsonObject.set("aes_key", jsonObject.getStr("aes_key", "")); + configJsonObject.set("develop_app_id", jsonObject.getStr("develop_app_id", "")); + configJsonObject.set("develop_upload_private_key", jsonObject.getStr("develop_upload_private_key", "")); + return configJsonObject; } /** * setWxOplatformConfig */ async setWxOplatformConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + coreOplatformConfigService.setOplatformConfig(oplatformConfigParam); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/wxoplatform/impl/oplatform-server-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/wxoplatform/impl/oplatform-server-service-impl.service.ts index c01b811f..c21a2b07 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/wxoplatform/impl/oplatform-server-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/wxoplatform/impl/oplatform-server-service-impl.service.ts @@ -14,15 +14,64 @@ export class OplatformServerServiceImplService { * server */ async server(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + if (!StringUtils.toLowerCase() === "aes", param.getEncryptType(.toLowerCase()) + || !WechatUtils.WxOpen().getWxOpenComponentService().checkSignature(param.getTimestamp(), param.getNonce(), param.getSignature())) { + throw new IllegalArgumentException("非法请求"); + } + + const inMessage: WxOpenXmlMessage = WxOpenXmlMessage.fromEncryptedXml(param.getRequestBody(), WechatUtils.WxOpen().getWxOpenConfigStorage(), param.getTimestamp(), param.getNonce(), param.getMsgSignature()); + log.info("开放平台授权事件推送消息:{}", inMessage); + + try { + WechatUtils.WxOpen().getWxOpenComponentService().route(inMessage); + + // 授权取消 + if (inMessage.getInfoType() === "unauthorized") { + oplatformService.clearAuthorization(inMessage.getAuthorizerAppid()); + } + // 更新授权 + if (inMessage.getInfoType() === "updateauthorized") { + const siteId: number = coreOplatformService.getSiteIdByAuthorizerAppid(inMessage.getAuthorizerAppid()); + RequestUtils.setSiteId(siteId); + + const authorizationParam: AuthorizationParam = new AuthorizationParam(); + authorizationParam.setAuthCode(inMessage.getAuthorizationCode()); + oplatformService.authorization(authorizationParam); + } + } catch (Exception e) { + log.error("处理开放平台授权事件消息异常", e); + } } /** * message */ async message(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + if (!StringUtils.toLowerCase() === "aes", param.getEncryptType(.toLowerCase()) + || !WechatUtils.WxOpen().getWxOpenComponentService().checkSignature(param.getTimestamp(), param.getNonce(), param.getSignature())) { + throw new IllegalArgumentException("非法请求"); + } + + const inMessage: WxMpXmlMessage = WxOpenXmlMessage.fromEncryptedMpXml(param.getRequestBody(), WechatUtils.WxOpen().getWxOpenConfigStorage(), param.getTimestamp(), param.getNonce(), param.getMsgSignature()); + log.info("开放平台消息与事件推送消息:{}", inMessage); + + if (inMessage.getMsgType() === WxConsts.XmlMsgType.EVENT) { + // 小程序审核成功 + if (inMessage.getEvent() === WxConsts.EventType.WEAPP_AUDIT_SUCCESS) { + weappAuditSuccess(inMessage); + } + // 小程序审核失败 + if (inMessage.getEvent() === WxConsts.EventType.WEAPP_AUDIT_FAIL) { + weappAuditFail(inMessage); + } + } + + const wxOpenMessageRouter: WxOpenMessageRouter = new WxOpenMessageRouter(WechatUtils.WxOpen()); + + const outMessage: WxMpXmlOutMessage = wxOpenMessageRouter.route(inMessage, appid); + if(outMessage != null){ + return WxOpenXmlMessage.wxMpOutXmlMessageToEncryptedXml(outMessage, WechatUtils.WxOpen().getWxOpenConfigStorage()); + } + return "success"; } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/wxoplatform/impl/oplatform-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/wxoplatform/impl/oplatform-service-impl.service.ts index 1307bcd5..c45b7f5a 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/wxoplatform/impl/oplatform-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/wxoplatform/impl/oplatform-service-impl.service.ts @@ -14,31 +14,92 @@ export class OplatformServiceImplService { * createPreAuthorizationUrl */ async createPreAuthorizationUrl(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + try { + const url: string = RequestUtils.getDomain(true) + "/site/wxoplatform/callback"; + return WechatUtils.WxOpen().getWxOpenComponentService().getPreAuthUrl(url); + } catch (Exception e) { + throw new BadRequestException(e.getMessage()); + } } /** * authorization */ async authorization(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + try { + const queryAuth: WxOpenQueryAuthResult = WechatUtils.WxOpen().getWxOpenComponentService().getQueryAuth(param.getAuthCode()); + + // 授权账号信息 授权信息 + const result: WxOpenAuthorizerInfoResult = WechatUtils.WxOpen().getWxOpenComponentService().getAuthorizerInfo(queryAuth.getAuthorizationInfo().getAuthorizerAppid()); + + const authorizerInfo: WxOpenAuthorizerInfo = result.getAuthorizerInfo(); + const authorization: WxOpenAuthorizationInfo = result.getAuthorizationInfo(); + + // 小程序 + if (ObjectUtil.isNotEmpty(authorizerInfo.getMiniProgramInfo())) { + this.weappCheck(authorizerInfo, authorization); + + const weappConfig: WeappConfigParam = new WeappConfigParam(); + weappConfig.setAppId(authorization.getAuthorizerAppid()); + weappConfig.setWeappName(authorizerInfo.getNickName()); + weappConfig.setWeappOriginal(authorizerInfo.getUserName()); + weappConfig.setIsAuthorization(1); + weappConfig.setQrCode(coreFetchService.image(authorizerInfo.getQrcodeUrl(), RequestUtils.siteId())); + coreWeappConfigService.setWeappConfig(RequestUtils.siteId(), weappConfig); + + coreWeappConfigService.setWeappAuthorizationInfo(RequestUtils.siteId(), result); + } else { // 公众号 + this.wechatCheck(authorizerInfo, authorization); + + const wechatConfig: WechatConfigParam = new WechatConfigParam(); + wechatConfig.setAppId(authorization.getAuthorizerAppid()); + wechatConfig.setWechatName(authorizerInfo.getNickName()); + wechatConfig.setWechatOriginal(authorizerInfo.getUserName()); + wechatConfig.setIsAuthorization(1); + wechatConfig.setQrcode(coreFetchService.image(authorizerInfo.getQrcodeUrl(), RequestUtils.siteId())); + coreWechatConfigService.setWechatConfig(RequestUtils.siteId(), wechatConfig); + + coreWechatConfigService.setWechatAuthorizationInfo(RequestUtils.siteId(), result); + } + } catch (Exception e) { + throw new BadRequestException(e.getMessage()); + } } /** * clearAuthorization */ async clearAuthorization(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + String[] configKey = new String[]{ ConfigKeyEnum.path.basename(WECHAT), ConfigKeyEnum.path.basename(WEAPP), ConfigKeyEnum.path.basename(WEAPP_AUTHORIZATION_INFO), ConfigKeyEnum.path.basename(WECHAT_AUTHORIZATION_INFO)}; + sysConfigMapper.delete(new QueryWrapper().like("value", appid).in("config_key", configKey)); + coreConfigService.cacheClear(); } /** * getAuthRecord */ async getAuthRecord(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const page: number = pageParam.getPage(); + const limit: number = pageParam.getLimit(); + + const wrapper: MPJLambdaWrapper = new MPJLambdaWrapper(); + wrapper.select(SysConfig::getCreateTime,SysConfig::getAddon,SysConfig::getStatus,SysConfig::getConfigKey, SysConfig::getValue, SysConfig::getSiteId, SysConfig::getUpdateTime); + wrapper.leftJoin(Site.class, "siteinfo",Site::getSiteId, SysConfig::getSiteId).select("site_name"); + wrapper.in(SysConfig::getConfigKey, ConfigKeyEnum.path.basename(WECHAT_AUTHORIZATION_INFO), ConfigKeyEnum.path.basename(WEAPP_AUTHORIZATION_INFO)); + wrapper.eq(SysConfig::getSiteId, RequestUtils.siteId()); + wrapper.orderByDesc(SysConfig::getUpdateTime); + const pageObj: Page = new Page<>(page, limit); + const iPage: IPage = sysConfigMapper.selectPage(pageObj, wrapper); + const listInfo: OplatformRecordVo[] = []; + for (const item of iPage.getRecords()) { + const vo: OplatformRecordVo = new OplatformRecordVo(); + BeanUtils.copyProperties(item, vo); + vo.setValue(JSONUtil.parseObj(item.getValue())); + const siteInfo: Site = new Site(); + siteInfo.setSiteName(item.getSiteName()); + vo.setSite(siteInfo); + listInfo.add(vo); + } + return PageResult.build(page, limit, iPage.getTotal()).setData(listInfo); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/wxoplatform/impl/weapp-version-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/wxoplatform/impl/weapp-version-service-impl.service.ts index f002f5eb..d4d63c36 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/wxoplatform/impl/weapp-version-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/wxoplatform/impl/weapp-version-service-impl.service.ts @@ -14,95 +14,340 @@ export class WeappVersionServiceImplService { * setWeappVersionService */ async setWeappVersionService(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + this.weappVersionService = weappVersionService; } /** * getLastCommitRecord */ async getLastCommitRecord(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + queryWrapper.orderByDesc("id") + .last("limit 1"); + const wxOplatfromWeappVersion: WxOplatfromWeappVersion = wxOplatfromWeappVersionMapper.selectOne(queryWrapper); + if (wxOplatfromWeappVersion==null) return null; + const wxOplatfromWeappVersionVo: WxOplatfromWeappVersionVo = new WxOplatfromWeappVersionVo(); + BeanUtils.copyProperties(wxOplatfromWeappVersion, wxOplatfromWeappVersionVo); + return wxOplatfromWeappVersionVo; } /** * list */ async list(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return []; + const page: number = pageParam.getPage(); + const limit: number = pageParam.getLimit(); + + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + queryWrapper.orderByDesc("id"); + + const wxOplatfromMPJQueryWrapper: MPJQueryWrapper = new MPJQueryWrapper<>(); + wxOplatfromMPJQueryWrapper.select("wowv.id, wowv.site_group_id, wowv.template_id, wowv.user_version, wowv.user_desc, wowv.task_key, wowv.status, wowv.fail_reason, wowv.version_no, wowv.create_time, wowv.update_time, nsg.group_name as site_group_name") + .setAlias("wowv") + .leftJoin("?_site_group nsg ON nsg.group_id = wowv.site_group_id".replace("?_", this.config.get('tablePrefix'))); + wxOplatfromMPJQueryWrapper.orderByDesc("wowv.id"); + + const iPage: IPage = wxOplatfromWeappVersionMapper.selectJoinPage(new Page<>(page, limit), WxOplatfromWeappVersionVo.class, wxOplatfromMPJQueryWrapper); + return PageResult.build(page, limit, iPage.getTotal()).setData(iPage.getRecords()); } /** * add */ async add(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const siteGroupList: SiteGroup[] = siteGroupMapper.selectList(new QueryWrapper().gt("group_id", 0).orderByAsc("create_time")); + if (ObjectUtil.isEmpty(siteGroupList)) throw new BadRequestException("请先添加站点套餐"); + + const siteGroup: SiteGroup = siteGroupId == null || siteGroupId == 0 ? siteGroupList.get(0) : siteGroupMapper.selectById(siteGroupId); + + const uploading: WxOplatfromWeappVersion = wxOplatfromWeappVersionMapper.selectOne(new QueryWrapper() + .eq("site_group_id", siteGroup.getGroupId()) + .eq("status", 0) + .last("limit 1") + ); + if (uploading != null) throw new BadRequestException("小程序有正在上传的版本,请等待上一版本上传完毕后再进行操作"); + + const lastVersion: WxOplatfromWeappVersion = wxOplatfromWeappVersionMapper.selectOne(new QueryWrapper() + .select("version_no") + .eq("site_group_id", siteGroup.getGroupId()) + .orderByDesc("id") + .last("limit 1") + ); + + const config: OplatformConfigVo = coreOplatformConfigService.getWxOplatformConfig(); + + const addon: string[] = CollUtil.newArrayList(); + if (!siteGroup.getApp().isEmpty()) CollUtil.addAll(addon, JSONUtil.parseArray(siteGroup.getApp())); + if (!siteGroup.getAddon().isEmpty()) CollUtil.addAll(addon, JSONUtil.parseArray(siteGroup.getAddon())); + + const weappUploadParam: WeappUploadParam = new WeappUploadParam(); + weappUploadParam.setAppId(config.getDevelopAppId()); + weappUploadParam.setBaseUrl(RequestUtils.getDomain(true)); + weappUploadParam.setSiteId(0); + weappUploadParam.setVersion("1." + siteGroup.getGroupId() + "." + (lastVersion == null ? 1 : lastVersion.getVersionNo() + 1)); + weappUploadParam.setUploadPrivateKey(config.getDevelopUploadPrivateKey()); + weappUploadParam.setAddon(addon); + const taskKey: string = coreWeappCloudService.uploadWeapp(weappUploadParam); + + const model: WxOplatfromWeappVersion = new WxOplatfromWeappVersion(); + model.setSiteGroupId(siteGroup.getGroupId()); + model.setUserVersion(weappUploadParam.getVersion()); + model.setVersionNo(lastVersion == null ? 1 : lastVersion.getVersionNo() + 1); + model.setCreateTime(System.currentTimeMillis() / 1000); + model.setTaskKey(taskKey); + wxOplatfromWeappVersionMapper.insert(model); + + weappVersionService.getVersionUploadResult(taskKey, isAll); } /** * getVersionUploadResult */ async getVersionUploadResult(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + if (scheduler == null || scheduler.isShutdown() || scheduler.isTerminated()) { + scheduler = Executors.newScheduledThreadPool(1); + } + scheduler.schedule(() => checkVersionUploadResult(taskKey, isAll), 10, TimeUnit.SECONDS); } /** * uploadSuccess */ async uploadSuccess(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const version: WxOplatfromWeappVersion = wxOplatfromWeappVersionMapper.selectOne(new QueryWrapper().eq("task_key", taskKey)); + + const wxOpenService: WxOpenComponentService = WechatUtils.WxOpen().getWxOpenComponentService(); + + try { + const draftList: WxOpenMaCodeTemplate[] = wxOpenService.getTemplateDraftList(); + if (ObjectUtil.isNotEmpty(draftList)) { + for (const item of draftList) { + if (item.getUserVersion() === version.getUserVersion()) { + // 添加模板 + wxOpenService.addToTemplate(item.getDraftId()); + + const templateList: WxOpenMaCodeTemplate[] = wxOpenService.getTemplateList(); + for (const template of templateList) { + if (template.getUserVersion() === version.getUserVersion()) { + version.setTemplateId(template.getTemplateId().toString()); + wxOplatfromWeappVersionMapper.updateById(version); + + // 删除之前的模板 + const prev: WxOplatfromWeappVersion = wxOplatfromWeappVersionMapper.selectOne(new QueryWrapper() + .select("template_id") + .eq("site_group_id", version.getSiteGroupId()) + .lt("id", version.getId()) + .orderByDesc("id") + .last("limit 1") + ); + if (prev!= null) { + wxOpenService.deleteTemplate(number.valueOf(prev.getTemplateId())); + } + break; + } + } + } + } + } + } catch (Exception e) { + console.log("小程序模板上传成功获取模板id异常"); + e.printStackTrace(); + } + + if (isAll) { + const siteGroup: SiteGroup = siteGroupMapper.selectOne(new QueryWrapper() + .select("group_id") + .gt("group_id", version.getSiteGroupId()) + .orderByDesc("group_id") + .last("limit 1") + ); + if (siteGroup != null) { + weappVersionService.add(siteGroup.getGroupId(), true); + } + } } /** * weappCommit */ async weappCommit(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + if (version == null) { + version = wxOplatfromWeappVersionMapper.selectOne(new QueryWrapper() + .eq("site_group_id", siteGroupId) + .ne("template_id", "") + .orderByDesc("id") + .last("limit 1")); + if (version == null) throw new BadRequestException("平台尚未上传小程序到模板库"); + } + + const uploading: WeappVersion = weappVersionMapper.selectOne(new QueryWrapper().select("site_id").eq("site_id", siteId).eq("status", WeappVersionStatusEnum.APPLET_AUDITING.getStatus()).last("limit 1")); + if (uploading!= null) throw new BadRequestException("小程序有正在上传的版本,请等待上一版本上传完毕后再进行操作"); + + const weappCofig: WeappConfigVo = coreWeappConfigService.getWeappConfig(siteId); + + try { + const extJson: Record = new Record(); + extJson.set("extAppid", weappCofig.getAppId()); + extJson.set("entryPagePath", "app/pages/index/index"); + extJson.set("directCommit", true); + extJson.putByPath("ext.site_id", siteId); + + const commitResult: WxOpenResult = WechatUtils.WxOpen().getWxOpenComponentService() + .getWxMaServiceByAppid(weappCofig.getAppId()) + .codeCommit(number.valueOf(version.getTemplateId()), version.getUserVersion(), version.getUserDesc(), extJson); + + if (!commitResult.getErrcode() === "0") throw new BadRequestException(commitResult.getErrmsg()); + + const model: WeappVersion = new WeappVersion(); + model.setSiteId(siteId); + model.setVersion(version.getUserVersion()); + model.setVersionNo(version.getVersionNo()); + model.setDesc(version.getUserDesc()); + model.setStatus(WeappVersionStatusEnum.APPLET_AUDITING.getStatus()); + model.setCreateTime(System.currentTimeMillis() / 1000); + model.setFromType("open_platform"); + weappVersionMapper.insert(model); + + // 提交审核 + weappVersionService.submitAudit(siteId, model.getId()); + } catch (Exception e) { + console.log("小程序提交代码异常"); + e.printStackTrace(); + throw new BadRequestException(e.getMessage()); + } } /** * submitAudit */ async submitAudit(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const version: WeappVersion = weappVersionMapper.selectById(versionId); + + try { + const wxOpenMaService: WxOpenMaService = (WxOpenMaService) WechatUtils.miniapp(siteId); + + const privacyInfo: WxOpenMaGetCodePrivacyInfoResult = wxOpenMaService.getCodePrivacyInfo(); + if (!privacyInfo.getErrcode() === "0") { + version.setStatus(WeappVersionStatusEnum.APPLET_AUDIT_FAIL.getStatus()); + version.setFailReason(privacyInfo.getErrmsg()); + version.setUpdateTime(System.currentTimeMillis() / 1000); + weappVersionMapper.updateById(version); + return; + } + + const submitAuditMessage: WxOpenMaSubmitAuditMessage = new WxOpenMaSubmitAuditMessage(); + const submitResult: WxOpenMaSubmitAuditResult = wxOpenMaService.submitAudit(submitAuditMessage); + + version.setStatus(submitResult.getErrcode() === "0" ? WeappVersionStatusEnum.APPLET_AUDITING.getStatus() : WeappVersionStatusEnum.APPLET_AUDIT_FAIL.getStatus()); + version.setFailReason(submitResult.getErrmsg()); + version.setUpdateTime(System.currentTimeMillis() / 1000); + version.setAuditid(ObjectUtil.isNotNull(submitResult.getAuditId()) ? submitResult.getAuditId().toString() : ""); + + weappVersionMapper.updateById(version); + + if (scheduler != null && !scheduler.isShutdown()) { + scheduler.shutdown(); + } + } catch (WxErrorException e) { + // 如果检测任务结束未结束 + if (e.getError().getErrorCode() == 61039) { + if (scheduler == null || scheduler.isShutdown() || scheduler.isTerminated()) { + scheduler = Executors.newScheduledThreadPool(1); + } + scheduler.schedule(() => submitAudit(siteId, versionId), 30, TimeUnit.SECONDS); + } else { + version.setStatus(WeappVersionStatusEnum.APPLET_AUDIT_FAIL.getStatus()); + version.setFailReason(e.getError().getErrorMsg()); + version.setUpdateTime(System.currentTimeMillis() / 1000); + weappVersionMapper.updateById(version); + + if (scheduler != null && !scheduler.isShutdown()) { + scheduler.shutdown(); + } + + console.log("小程序提交审核异常"); + e.printStackTrace(); + throw new BadRequestException(e.getMessage()); + } + } } /** * siteWeappCommit */ async siteWeappCommit(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const site: SiteInfoVo = coreSiteService.getSiteCache(RequestUtils.siteId()); + this.weappCommit(site.getSiteId(), site.getGroupId(), null); } /** * getSiteGroupCommitRecord */ async getSiteGroupCommitRecord(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const page: number = pageParam.getPage(); + const limit: number = pageParam.getLimit(); + + const iPage: IPage = siteGroupMapper.selectPage(new Page<>(page, limit), new QueryWrapper().select("group_id,group_name")); + const list: SiteGroupWeappVersionVo[] = []; + + for (const item of iPage.getRecords()) { + const vo: SiteGroupWeappVersionVo = new SiteGroupWeappVersionVo(); + BeanUtils.copyProperties(item, vo); + + const lastVersion: WxOplatfromWeappVersion = wxOplatfromWeappVersionMapper.selectOne(new QueryWrapper().eq("site_group_id", item.getGroupId()).orderByDesc("id").last("limit 1")); + if (lastVersion != null) { + const versionVo: WxOplatfromWeappVersionVo = new WxOplatfromWeappVersionVo(); + BeanUtils.copyProperties(lastVersion, versionVo); + vo.setCommitRecord(versionVo); + } + list.add(vo); + } + + return PageResult.build(page, limit, iPage.getTotal()).setData(list); } /** * undoAudit */ async undoAudit(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const version: WeappVersion = weappVersionMapper.selectOne(new QueryWrapper().eq("id", param.getId()).eq("site_id", RequestUtils.siteId())); + Assert.notNull(version, "未获取到小程序版本提交记录"); + if (!version.getStatus() === WeappVersionStatusEnum.APPLET_AUDITING.getStatus()) throw new BadRequestException("只有审核中的才可以撤回"); + + const weappCofig: WeappConfigVo = coreWeappConfigService.getWeappConfig(RequestUtils.siteId()); + + try { + const commitResult: WxOpenResult = WechatUtils.WxOpen().getWxOpenComponentService() + .getWxMaServiceByAppid(weappCofig.getAppId()).undoCodeAudit(); + } catch (Exception e) { + throw new BadRequestException(e.getMessage()); + } + + version.setStatus(WeappVersionStatusEnum.APPLET_AUDIT_UNDO.getStatus()); + version.setUpdateTime(System.currentTimeMillis() / 1000); + weappVersionMapper.updateById(version); } /** * syncSiteGroupAuthWeapp */ async syncSiteGroupAuthWeapp(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const version: WxOplatfromWeappVersion = wxOplatfromWeappVersionMapper.selectOne(new QueryWrapper() + .eq("site_group_id", param.getSiteGroupId()) + .ne("template_id", "") + .orderByDesc("id") + .last("limit 1") + ); + Assert.notNull(version, "平台尚未上传小程序到模板库"); + + const siteIds: number[] = siteMapper.selectList(new QueryWrapper().select("site_id").eq("group_id", param.getSiteGroupId())).stream().map(Site::getSiteId).toList(); + if (ObjectUtil.isNotEmpty(siteIds)) { + const authSite: SysConfig[] = sysConfigMapper.selectList(new QueryWrapper().in("site_id", siteIds).eq("config_key", ConfigKeyEnum.path.basename(WEAPP_AUTHORIZATION_INFO))); + if (ObjectUtil.isNotEmpty(authSite)) { + authSite.forEach(item => { + weappCommit(item.getSiteId(), param.getSiteGroupId(), version); + }); + } + } } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/agreement/impl/agreement-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/agreement/impl/agreement-service-impl.service.ts index 0802df46..924f714b 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/agreement/impl/agreement-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/agreement/impl/agreement-service-impl.service.ts @@ -14,7 +14,16 @@ export class AgreementServiceImplService { * info */ async info(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + queryWrapper.select("site_id, agreement_key, title, content, create_time, update_time"); + queryWrapper.eq("agreement_key", param.getKey()); + queryWrapper.eq("site_id", param.siteId()); + const sysAgreement: SysAgreement = sysAgreementMapper.selectOne(queryWrapper); + if (sysAgreement == null) { + return null; + } + const agreementInfoVo: AgreementInfoVo = new AgreementInfoVo(); + BeanUtils.copyProperties(sysAgreement, agreementInfoVo); + return agreementInfoVo; } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/channel/impl/app-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/channel/impl/app-service-impl.service.ts index fb7fe650..dfafc251 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/channel/impl/app-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/channel/impl/app-service-impl.service.ts @@ -14,39 +14,98 @@ export class AppServiceImplService { * wechatLogin */ async wechatLogin(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + try { + const app: WxMpService = WechatUtils.app(RequestUtils.siteId()); + + const wxOAuth2AccessToken: WxOAuth2AccessToken = app.getOAuth2Service().getAccessToken(param.getCode()); + const wxUser: WxOAuth2UserInfo = app.getOAuth2Service().getUserInfo(wxOAuth2AccessToken, null); + + return this.login( + ObjectUtil.defaultIfNull(wxUser.getOpenid(), ""), + ObjectUtil.defaultIfNull(wxUser.getUnionId(), ""), + ObjectUtil.defaultIfNull(wxUser.getNickname(), ""), + ObjectUtil.defaultIfNull(wxUser.getHeadImgUrl(), ""), + param.getPid() + ); + } catch (Exception e) { + throw new BadRequestException(e.getMessage()); + } } /** * getNewVersion */ async getNewVersion(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const appVersion: AppVersion = appVersionMapper.selectOne(new QueryWrapper() + .eq("site_id", RequestUtils.siteId()) + .eq("platform", param.getPlatform()) + .gt("version_code", param.getVersionCode()) + .eq("status", AppDict.StatusEnum.STATUS_PUBLISHED.getValue()) + .orderByDesc("version_code")); + + if (appVersion == null) { + return null; + } + + const newVersionVo: NewVersionVo = new NewVersionVo(); + BeanUtil.copyProperties(appVersion, newVersionVo); + + return newVersionVo; } /** * register */ async register(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + switch (param.getRegisterType()) { + case "wechat": + return wechatRegister(param); + default: + return null; + } } /** * getAppConfig */ async getAppConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const vo: ApiAppConfigVo = new ApiAppConfigVo(); + const config: AppConfigVo = coreAppService.getConfig(RequestUtils.siteId()); + BeanUtil.copyProperties(config, vo); + + const weappConfig: WeappConfigVo = coreWeappConfigService.getWeappConfig(RequestUtils.siteId()); + vo.setWeappOriginal(weappConfig.getWeappOriginal()); + return vo; } /** * wechatRegister */ async wechatRegister(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + if (param.getOpenid().isEmpty()) throw new BadRequestException("openid不能为空"); + try { + const member: Member = memberMapper.selectOne(new QueryWrapper().eq("wxapp_openid", param.getOpenid()).eq("site_id", RequestUtils.siteId())); + if (ObjectUtil.isNotNull(member)) throw new BadRequestException("账号已存在"); + + if (!param.getUnionid().isEmpty()) { + const unionidMember: Member = memberMapper.selectOne(new QueryWrapper().eq("wx_unionid", param.getUnionid()).eq("site_id", RequestUtils.siteId())); + if (ObjectUtil.isNotNull(unionidMember)) throw new BadRequestException("账号已存在"); + } + + const config: LoginConfigVo = coreMemberConfigService.getLoginConfig(RequestUtils.siteId()); + if (config.getIsBindMobile() == 1) { + if (param.getMobile().isEmpty()) throw new BadRequestException("手机号不能为空"); + registerService.checkMobileCode(param.getMobile(), param.getMobileKey(), param.getMobileCode()); + } + + const registerMember: Member = new Member(); + registerMember.setWxappOpenid(param.getOpenid()); + registerMember.setMobile(param.getMobile()); + registerMember.setWxUnionid(param.getUnionid()); + registerMember.setPid(param.getPid()); + return registerService.register(registerMember); + } catch (Exception e) { + throw new BadRequestException(e.getMessage()); + } } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/diy/impl/diy-form-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/diy/impl/diy-form-service-impl.service.ts index 66c7590e..e3022bd6 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/diy/impl/diy-form-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/diy/impl/diy-form-service-impl.service.ts @@ -14,47 +14,256 @@ export class DiyFormServiceImplService { * getInfo */ async getInfo(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + // 查询 const writeConfigWrapper: DiyFormWriteConfig + QueryWrapper = new QueryWrapper<>(); + writeConfigWrapper.eq("form_id", formId) + .eq("site_id", RequestUtils.siteId()); + const writeConfig: DiyFormWriteConfig = diyFormWriteConfigMapper.selectOne(writeConfigWrapper); + + // 查询表单信息 + const formWrapper: QueryWrapper = new QueryWrapper<>(); + formWrapper.eq("form_id", formId) + .eq("status", 1) + .eq("site_id", RequestUtils.siteId()); + const formInfo: DiyForm = diyFormMapper.selectOne(formWrapper); + + const error: Record[] = []; + const info: DiyFormInfoVo = new DiyFormInfoVo(); + if (formInfo != null) { + BeanUtil.copyProperties(formInfo, info); + // 过滤隐藏的组件 + const valueObj: Record = JSONUtil.parseObj(formInfo.getValue()); + if (valueObj.containsKey("value")) { + const valueArray: JSONArray = valueObj.getJSONArray("value"); + if (valueArray != null) { + const newArray: JSONArray = new JSONArray(); + for (const obj of valueArray) { + const item: Record = (Record) obj; + if (!item.getBool("isHidden", false)) { + newArray.add(item); + } + } + valueObj.put("value", newArray); + info.setValue(valueObj.toString()); + } + } + + + // 检查会员相关限制 + const memberId: number = RequestUtils.memberId(); + if (writeConfig != null && memberId != null) { + Map errorMsg; + errorMsg = checkMemberCanJoinOrNot(memberId, writeConfig); + if (ObjectUtil.isNotEmpty(errorMsg)) { + error.add(errorMsg); + } + errorMsg = checkFormWriteTime(writeConfig); + if (ObjectUtil.isNotEmpty(errorMsg)) { + error.add(errorMsg); + } + errorMsg = checkFormWriteLimitNum(formId, writeConfig); + if (ObjectUtil.isNotEmpty(errorMsg)) { + error.add(errorMsg); + } + errorMsg = checkMemberWriteLimitNum(memberId, formId, writeConfig); + if (ObjectUtil.isNotEmpty(errorMsg)) { + error.add(errorMsg); + } + } + } else { + const errorMap: Record = {}; + errorMap.put("title", "当前表单无法查看"); + errorMap.put("type", "表单状态"); + errorMap.put("desc", "该表单已关闭"); + error.add(errorMap); + } + info.setError(error); + return info; } /** * addRecord */ async addRecord(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + diyFormRecordsParam.setSiteId(RequestUtils.siteId()); + diyFormRecordsParam.setMemberId(RequestUtils.memberId()); + + // 检查表单是否存在且已开启 + const formQueryWrapper: QueryWrapper = new QueryWrapper<>(); + formQueryWrapper.eq("form_id", diyFormRecordsParam.getFormId()) + .eq("site_id", RequestUtils.siteId()); + const formInfo: DiyForm = diyFormMapper.selectOne(formQueryWrapper); + if (formInfo == null) { + throw new ApiException("表单不存在"); + } + if (formInfo.getStatus() == 0) { + throw new ApiException("该表单已关闭"); + } + + // 查询表单填写配置 + const writeConfigQueryWrapper: QueryWrapper = new QueryWrapper<>(); + writeConfigQueryWrapper.eq("form_id", diyFormRecordsParam.getFormId()) + .eq("site_id", RequestUtils.siteId()); + const writeConfig: DiyFormWriteConfig = diyFormWriteConfigMapper.selectOne(writeConfigQueryWrapper); + + if (writeConfig != null) { + // 检查会员是否可以参与 + const canJoinError: Record = checkMemberCanJoinOrNot(RequestUtils.memberId(), writeConfig); + if (!canJoinError.length === 0) { + throw new ApiException(canJoinError.get("desc")); + } + + // 检查表单填写时间 + const timeError: Record = checkFormWriteTime(writeConfig); + if (!timeError.length === 0) { + throw new ApiException(timeError.get("desc")); + } + + // 检查表单总填写次数限制 + const formLimitError: Record = checkFormWriteLimitNum(diyFormRecordsParam.getFormId(), writeConfig); + if (!formLimitError.length === 0) { + throw new ApiException(formLimitError.get("desc")); + } + + // 检查会员填写次数限制 + const memberLimitError: Record = checkMemberWriteLimitNum(RequestUtils.memberId(), diyFormRecordsParam.getFormId(), writeConfig); + if (!memberLimitError.length === 0) { + throw new ApiException(memberLimitError.get("desc")); + } + } + + // 调用核心服务添加记录 + return coreDiyFormRecordsService.add(diyFormRecordsParam); } /** * getResult */ async getResult(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const diyFormRecords: DiyFormRecords = diyFormRecordsMapper.selectOne(new QueryWrapper().eq("record_id", recordId).eq("site_id", RequestUtils.siteId()).eq("member_id", RequestUtils.memberId())); + if (ObjectUtil.isEmpty(diyFormRecords)) throw new ApiException("表单记录不存在"); + const vo: DiyFormRecordsInfoVo = new DiyFormRecordsInfoVo(); + BeanUtil.copyProperties(diyFormRecords, vo); + const diyFormSubmitConfig: DiyFormSubmitConfig = diyFormSubmitConfigMapper.selectOne(new QueryWrapper().eq("form_id", vo.getFormId())); + const configInfoVo: DiyFormSubmitConfigInfoVo = new DiyFormSubmitConfigInfoVo(); + if (ObjectUtil.isNotEmpty(diyFormSubmitConfig)) { + BeanUtil.copyProperties(diyFormSubmitConfig, configInfoVo); + } + vo.setDiyFormSubmitConfig(configInfoVo); + return vo; } /** * getFormRecordInfo */ async getFormRecordInfo(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const diyFormRecords: DiyFormRecords = diyFormRecordsMapper.selectOne(new QueryWrapper().eq("record_id", recordId).eq("site_id", RequestUtils.siteId()).eq("member_id", RequestUtils.memberId())); + const vo: DiyFormRecordsDetailVo = new DiyFormRecordsDetailVo(); + if (ObjectUtil.isEmpty(diyFormRecords)) { + return vo; + } + BeanUtil.copyProperties(diyFormRecords, vo); + const list: DiyFormRecordsFields[] = diyFormRecordsFieldsMapper.selectList(new QueryWrapper().eq("record_id", vo.getRecordId())); + if (ObjectUtil.isNotEmpty(list)) { + const volist: DiyFormRecordsFieldsListVo[] = []; + for (const item of list) { + const diyFormRecordsFieldsListVo: DiyFormRecordsFieldsListVo = new DiyFormRecordsFieldsListVo(); + BeanUtils.copyProperties(item, diyFormRecordsFieldsListVo); + volist.add(diyFormRecordsFieldsListVo); + } + vo.setRecordsFieldList(volist); + } + return vo; } /** * getMemberInfoRecord */ async getMemberInfoRecord(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const memberConfig: MemberConfigVo = coreMemberConfigService.getMemberConfig(RequestUtils.siteId()); + if (ObjectUtil.isEmpty(memberConfig.getFormId())) { + return List.of(); + } + const formId: number = memberConfig.getFormId(); + const mpjqw: MPJQueryWrapper = new MPJQueryWrapper<>(); + mpjqw.setAlias("fr").leftJoin("?_diy_form_records_fields frf on frf.record_id = fr.record_id".replace("?_", this.config.get('tablePrefix'))); + mpjqw.select("frf.form_id, frf.form_field_id, frf.field_key, frf.field_type, frf.field_name, frf.field_value, frf.field_required, frf.field_unique, frf.privacy_protection"); + mpjqw.eq("fr.member_id", RequestUtils.memberId()) + .eq("fr.form_id", formId) + .orderByDesc("fr.create_time"); + const diyFormRecordsFields: DiyFormRecordsFields[] = diyFormRecordsMapper.selectJoinList(DiyFormRecordsFields.class, mpjqw); + + const diyFormMpjqw: MPJQueryWrapper = new MPJQueryWrapper<>(); + diyFormMpjqw.setAlias("df") + .leftJoin("?_diy_form_fields dfi on dfi.form_id = df.form_id".replace("?_", this.config.get('tablePrefix'))); + diyFormMpjqw.select("df.form_id,df.type, dfi.field_id, dfi.field_key, dfi.field_type, dfi.field_name, dfi.field_required, dfi.field_hidden, dfi.field_unique, dfi.privacy_protection"); + diyFormMpjqw.eq("df.form_id", formId).eq("df.status", 1); + const diyFormFields: DiyFormFields[] = diyFormMapper.selectJoinList(DiyFormFields.class, diyFormMpjqw); + + + if (ObjectUtil.isEmpty(diyFormFields)) { + return List.of(); + } + if (ObjectUtil.isEmpty(diyFormRecordsFields)) { + return setResult(diyFormFields); + } + + const result: DiyMemberRecordVo = setResult(diyFormFields); + const fieldMap: Record = diyFormRecordsFields.stream().collect(Collectors.toMap(DiyFormRecordsFields::getFieldKey, field => field)); + for (const field of result.getFormField()) { + if (fieldMap.containsKey(field.getFieldKey())) { + field.setFieldValue(fieldMap.get(field.getFieldKey()).getFieldValue() == null ? "" : fieldMap.get(field.getFieldKey()).getFieldValue()); + } + } + return result; } /** * editRecord */ async editRecord(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const diyFormRecords: DiyFormRecords = diyFormRecordsMapper.selectById(param.getRecordId()); + if (ObjectUtil.isEmpty(diyFormRecords)) { + throw new ApiException("表单记录不存在"); + } + const diyForm: DiyForm = diyFormMapper.selectOne(new LambdaQueryWrapper().eq(DiyForm::getFormId, param.getFormId())); + if (ObjectUtil.isEmpty(diyForm)) { + throw new ApiException("表单不存在"); + } + if (diyForm.getStatus() == 0) { + throw new ApiException("该表单已关闭"); + } + // 查询表单填写配置 + const writeConfigQueryWrapper: QueryWrapper = new QueryWrapper<>(); + writeConfigQueryWrapper.eq("form_id", param.getFormId()) + .eq("site_id", RequestUtils.siteId()); + const writeConfig: DiyFormWriteConfig = diyFormWriteConfigMapper.selectOne(writeConfigQueryWrapper); + + if (writeConfig != null) { + // 检查会员是否可以参与 + const canJoinError: Record = checkMemberCanJoinOrNot(RequestUtils.memberId(), writeConfig); + if (!canJoinError.length === 0) { + throw new ApiException(canJoinError.get("desc")); + } + + // 检查表单填写时间 + const timeError: Record = checkFormWriteTime(writeConfig); + if (!timeError.length === 0) { + throw new ApiException(timeError.get("desc")); + } + + // 检查表单总填写次数限制 + const formLimitError: Record = checkFormWriteLimitNum(param.getFormId(), writeConfig); + if (!formLimitError.length === 0) { + throw new ApiException(formLimitError.get("desc")); + } + + // 检查会员填写次数限制 + const memberLimitError: Record = checkMemberWriteLimitNum(RequestUtils.memberId(), param.getFormId(), writeConfig); + if (!memberLimitError.length === 0) { + throw new ApiException(memberLimitError.get("desc")); + } + } + coreDiyFormRecordsService.edit(param); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/diy/impl/diy-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/diy/impl/diy-service-impl.service.ts index 31f23f35..fa9713af 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/diy/impl/diy-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/diy/impl/diy-service-impl.service.ts @@ -14,39 +14,150 @@ export class DiyServiceImplService { * info */ async info(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const id: number = ObjectUtil.defaultIfNull(param.getId(), 0); + const name: string = ObjectUtil.defaultIfNull(path.basename(param), ""); + + log.info("id: {}, name: {}", id, name); + + const startUpPage: StartUpPageConfigVo = null; + const template: Record = null; + + if (!StrUtil.isEmpty(name)) { + // 查询启动页 + startUpPage = coreDiyConfigService.getStartUpPageConfig(param.siteId(), name); + log.info("startUpPage: {}", JSONUtil.toJsonStr(startUpPage)); + + const templateParam: TemplateParam = new TemplateParam(); + String[] key = { name }; + templateParam.setKey(key); + template = TemplateEnum.getTemplate(templateParam).getJSONObject(name); + } + + if (id == 0 && startUpPage != null && template != null && !startUpPage.getPage() === template.getStr("page")) { + log.info("enter if, template: {}", template.toString()); + return startUpPage; + } else { + const queryWrapper: QueryWrapper = new QueryWrapper(); + queryWrapper.eq("site_id", param.siteId()); + log.info("site_id: {}",param.siteId() ); + + const info: DiyPage = null; + + log.info("id: {}, name: {}", id, name); + if (id > 0) { + queryWrapper.eq("id", id); + info = diyPageMapper.selectOne(queryWrapper); + } else if (!name.length === 0) { + queryWrapper.eq("name", name); + queryWrapper.eq("is_default", 1); + queryWrapper.orderByDesc("create_time"); + queryWrapper.last("limit 1"); + info = diyPageMapper.selectOne(queryWrapper); + } + + log.info("info: {}", JSONUtil.toJsonStr(info)); + + if (info == null) { + if (!name.length === 0) { + const pageData: Record = getFirstPageData(name, ""); + if (pageData != null) { + info = new DiyPage(); + info.setId(param.siteId()); + info.setTitle(pageData.getStr("title")); + info.setName(pageData.getStr("type")); + info.setType(pageData.getStr("type")); + info.setTemplate(pageData.getStr("template")); + info.setMode(pageData.getStr("mode")); + info.setValue(pageData.getJSONObject("data").toString()); + info.setIsDefault(1); + } + } + } + + log.info("info: {}", JSONUtil.toJsonStr(info)); + if (info == null) return null; + + const vo: DiyInfoVo = new DiyInfoVo(); + BeanUtils.copyProperties(info, vo); + log.info("vo: {}", JSONUtil.toJsonStr(vo)); + return vo; + } } /** * getFirstPageData */ async getFirstPageData(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const pages: Record = PagesEnum.getPagesByAddon(type, addon); + if (pages == null || pages.keySet().size() == 0) return null; + + const template: string = pages.keySet().iterator().next(); + const data: Record = pages.getJSONObject(template); + data.set("type", type); + data.set("template", template); + + return data; } /** * tabbar */ async tabbar(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const diyTabbarVo: DiyTabbarVo = null; + return diyTabbarVo; } /** * tabbarList */ async tabbarList(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const list: BottomConfigVo[] = coreDiyConfigService.getBottomList(); + const site: SiteInfoVo = coreSiteService.getSiteCache(param.siteId()); + + const tabbarList: BottomConfigVo[] = []; + for (const item of list) { + if (item.getKey() === "app" && list.size() > 1 && site.getApps().size() == 1) continue; + const config: BottomConfigVo = coreDiyConfigService.getBottomConfig(param.siteId(), item.getKey()); + tabbarList.add(config); + } + + return tabbarList; } /** * share */ async share(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const queryWrapper: QueryWrapper = new QueryWrapper(); + queryWrapper.select("id,title,name,page,share,is_share"); + queryWrapper.eq("page", param.getRoute()); + queryWrapper.eq("site_id", param.siteId()); + + const diyRoute: DiyRoute = diyRouteMapper.selectOne(queryWrapper); + if (diyRoute == null || diyRoute.getShare().isEmpty()) return new Record(); + + const share: Record = JSONUtil.parseObj(diyRoute.getShare()); + share.set("route", diyRoute.getPage()); + share.set("query", ""); + + const query: Record = new Record(); + + if (param.getParams() != null && !param.getParams().isEmpty()) { + query = JSONUtil.parseObj(param.getParams()); + } + + if (param.memberId() != null && param.memberId() > 0) { + query.set("mid", param.memberId()); + } + + const queryStr: string = ""; + if (query.keySet().size() > 0) { + for (const key of query.keySet()) { + queryStr += queryStr.length === 0 ? key + "=" + query.getStr(key) : "&" + key + "=" + query.getStr(key); + } + } + share.set("url", share.getStr("route") + (queryStr.length === 0 ? "" : "?" + queryStr)); + + return share; } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/login/impl/auth-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/login/impl/auth-service-impl.service.ts index 7f5c6803..48ae2dc7 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/login/impl/auth-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/login/impl/auth-service-impl.service.ts @@ -14,23 +14,64 @@ export class AuthServiceImplService { * checkSite */ async checkSite(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const siteId: number = RequestUtils.apiSiteId(); + + if (siteId == 0) { + const site: Site = siteMapper.selectOne(new QueryWrapper().select("site_id").eq("site_domain", RequestUtils.getRequestDomain())); + if (site == null) throw new UnauthorizedException("站点不存在", 403); + siteId = site.getSiteId(); + } + + const siteInfoVo: SiteInfoVo = coreSiteService.getSiteCache(siteId); + if(ObjectUtil.isEmpty(siteInfoVo)){ + throw new UnauthorizedException("站点不存在", 403); + } + const rule: string = RequestUtils.getReqeustURI(); + if(!rule === "site"){ + if(siteInfoVo.getStatus() == SiteStatusEnum.CLOSE.getCode() || siteInfoVo.getExpireTime() < DateUtils.currTime()){ + throw new UnauthorizedException("站点已停止", 402); + } + } + RequestUtils.setSiteId(siteId); } /** * checkSiteAuth */ async checkSiteAuth(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + if(ObjectUtil.isNotNull(RequestUtils.memberId()) && RequestUtils.memberId()>0){ + const memberInfoParam: MemberInfoParam = new MemberInfoParam(); + memberInfoParam.setMemberId(RequestUtils.memberId()); + memberInfoParam.setSiteId(RequestUtils.siteId()); + const memberInfoVo: MemberInfoVo = memberService.info(memberInfoParam); + if(ObjectUtil.isNull(memberInfoVo) || ObjectUtil.isEmpty(memberInfoVo)){ + // 退出登录 + StpUtil.logout(RequestUtils.apiToken()); + throw new UnauthorizedException("MEMBER_NOT_EXIST", 401); + } + } } /** * checkChannel */ async checkChannel(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const channel: string = RequestUtils.channel(); + const siteId: number = RequestUtils.siteId(); + if (channel != null){ + if (channel === ChannelEnum.H5.getCode()){ + const h5ConfigVo: H5ConfigVo = coreH5Service.getH5(siteId); + const isOpen: number = h5ConfigVo.getIsOpen(); + if(isOpen==0){ + throw new UnauthorizedException("站点已停止", 402); + } + }else if (channel === ChannelEnum.PC.getCode()){ + const pcConfigVo: PcConfigVo = corePcService.getPc(siteId); + const isOpen: number = pcConfigVo.getIsOpen(); + if(isOpen==0){ + throw new UnauthorizedException("站点已停止", 402); + } + } + } } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/login/impl/login-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/login/impl/login-service-impl.service.ts index 7782600d..7ad66723 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/login/impl/login-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/login/impl/login-service-impl.service.ts @@ -14,63 +14,130 @@ export class LoginServiceImplService { * setRegisterService */ async setRegisterService(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + this.registerService = registerService; } /** * account */ async account(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return 0; + const member: Member = memberMapper.selectOne(new QueryWrapper().eq("site_id", RequestUtils.siteId()).and(i => i.eq("username", param.getUsername()).or().eq("mobile", param.getUsername()))); + + if (ObjectUtil.isNull(member)) throw new BadRequestException("账号不存在"); + if (!PasswordEncipher.matche(param.getPassword(), member.getPassword())) throw new BadRequestException("账号或密码错误"); + member.setLoginType(MemberLoginTypeEnum.USERNAME.getType()); + + return this.login(member); } /** * mobile */ async mobile(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const member: Member = memberMapper.selectOne(new QueryWrapper().eq("mobile", param.getMobile()).eq("site_id", RequestUtils.siteId())); + + if (member != null) { + member.setLoginType(MemberLoginTypeEnum.MOBILE.getType()); + return this.login(member); + } else { + const config: LoginConfigVo = coreMemberConfigService.getLoginConfig(RequestUtils.siteId()); + // 开启强制绑定手机号 登录会自动注册 + if (config.getIsBindMobile() == 1) { + const registerParam: MobileRegisterParam = new MobileRegisterParam(); + BeanUtils.copyProperties(param, registerParam); + return registerService.mobile(registerParam); + } + } + throw new BadRequestException("账号不存在"); } /** * login */ async login(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + member = memberMapper.selectById(member.getMemberId()); + if (StatusEnum.OFF === member.getStatus()) throw new BadRequestException("账号被锁定"); + + member.setLoginTime(System.currentTimeMillis() / 1000); + member.setLoginIp(RequestUtils.ip()); + member.setLoginCount(member.getLoginCount() + 1); + member.setLoginChannel(RequestUtils.channel()); + if (member.getLoginType() != null) member.setLoginType(member.getLoginType()); + member.setLastVisitTime(System.currentTimeMillis() / 1000); + this.memberMapper.updateById(member); + + const loginModel: SaLoginModel = SaLoginModel.create(); + loginModel.setDevice(RequestUtils.handler().getHeader("User-Agent")); + loginModel.setExtra("memberId", member.getMemberId()); + loginModel.setExtra("username", member.getUsername()); + loginModel.setExtra("siteId", member.getSiteId()); + // 执行登录 + StpUtil.login("member-" + member.getMemberId(), loginModel); + // 获取返回内容 + const saTokenInfo: SaTokenInfo = StpUtil.getTokenInfo(); + + const vo: LoginVo = new LoginVo(); + vo.setToken(saTokenInfo.getTokenValue()); + vo.setExpiresTime(DateUtils.currTime()+saTokenInfo.getTokenTimeout()); + vo.setMobile(member.getMobile()); + + // 会员登录事件 + const loginEvent: MemberLoginEvent = new MemberLoginEvent(); + loginEvent.setSiteId(RequestUtils.siteId()); + loginEvent.addAppSign("core"); + loginEvent.setName("MemberLoginEvent"); + loginEvent.setMember(member); + EventPublisher.publishEvent(loginEvent); + + return vo; } /** * resetPassword */ async resetPassword(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const member: Member = memberMapper.selectOne(new QueryWrapper().select("member_id").eq("mobile", param.getMobile()).eq("site_id", RequestUtils.siteId())); + if (ObjectUtil.isNull(member)) throw new BadRequestException("当前填写的手机号不存在账号"); + + member.setPassword(PasswordEncipher.encode(param.getPassword())); + this.memberMapper.updateById(member); } /** * getLoginConfig */ async getLoginConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return coreMemberConfigService.getLoginConfig(RequestUtils.siteId()); } /** * sendMobileCode */ async sendMobileCode(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const key: string = RandomUtil.randomString(30); + + const cache: MobileCodeCacheVo = new MobileCodeCacheVo(); + cache.setMobile(param.getMobile()); + cache.setCode(String.format("%0" + 4 + "d", RandomUtil.randomInt(1, 9999))); + cache.setType(param.getType()); + + const data: Record = {}; + data.put("mobile", param.getMobile()); + data.put("code", cache.getCode()); + + coreNoticeService.send(param.siteId(), "member_verify_code", data); + + this.cached.put(key, cache, 600); + + const vo: SendMobileCodeVo = new SendMobileCodeVo(); + vo.setKey(key); + return vo; } /** * logout */ async logout(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + StpUtil.logout(); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/login/impl/register-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/login/impl/register-service-impl.service.ts index 50543c7f..e4fc1f7b 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/login/impl/register-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/login/impl/register-service-impl.service.ts @@ -14,39 +14,110 @@ export class RegisterServiceImplService { * checkLoginConfig */ async checkLoginConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const config: LoginConfigVo = coreMemberConfigService.getLoginConfig(RequestUtils.siteId()); + if (MemberLoginTypeEnum.USERNAME.getType() === type && config.getIsUsername() != 1) throw new BadRequestException("未开启账号登录注册"); + if (MemberLoginTypeEnum.MOBILE.getType() === type && config.getIsMobile() != 1) throw new BadRequestException("未开启手机验证码登录注册"); } /** * account */ async account(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return 0; + const memberExist: Member = memberMapper.selectOne(new QueryWrapper().select("member_id").eq("username", param.getUsername()).eq("site_id", RequestUtils.siteId())); + if (ObjectUtil.isNotNull(memberExist)) throw new BadRequestException("账号已存在"); + + if (!param.getMobile().isEmpty()) { + const mobileExist: Member = memberMapper.selectOne(new QueryWrapper().select("member_id").eq("mobile", param.getMobile()).eq("site_id", RequestUtils.siteId())); + if (ObjectUtil.isNotNull(mobileExist)) throw new BadRequestException("当前手机号已绑定账号"); + this.checkMobileCode(param.getMobile(), param.getMobileKey(), param.getMobileCode()); + } + + const member: Member = new Member(); + member.setUsername(param.getUsername()); + member.setNickname(param.getUsername()); + member.setPassword(PasswordEncipher.encode(param.getPassword())); + member.setMobile(param.getMobile()); + member.setRegisterType(MemberRegisterTypeEnum.USERNAME.getType()); + member.setLoginType(MemberLoginTypeEnum.USERNAME.getType()); + member.setPid(param.getPid()); + + return this.register(member); } /** * mobile */ async mobile(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const memberExist: Member = memberMapper.selectOne(new QueryWrapper().select("member_id").eq("mobile", param.getMobile()).eq("site_id", RequestUtils.siteId())); + if (ObjectUtil.isNotNull(memberExist)) throw new BadRequestException("账号已存在"); + + const member: Member = new Member(); + member.setMobile(param.getMobile()); + member.setNickname(param.getMobile().substring(0, 3) + "****" + param.getMobile().substring(7)); + member.setRegisterType(MemberRegisterTypeEnum.MOBILE.getType()); + member.setLoginType(MemberLoginTypeEnum.MOBILE.getType()); + member.setPid(param.getPid()); + member.setHeadimg(ObjectUtil.defaultIfNull(param.getAvatar(), "")); + member.setNickname(ObjectUtil.defaultIfNull(param.getNickname(), "")); + member.setWxOpenid(ObjectUtil.defaultIfNull(param.getOpenid(), "")); + + return this.register(member); } /** * register */ async register(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const request: HttpServletRequest = RequestUtils.handler(); + const pid: number = ObjectUtil.defaultIfNull(member.getPid(), 0); + if (pid > 0) { + const inviteMember: Member = memberMapper.selectOne(new QueryWrapper().select("member_id").eq("member_id", member.getPid()).eq("site_id", RequestUtils.siteId())); + if (inviteMember == null) member.setPid(0); + } + if (member.getMobile() != null && !member.getMobile().isEmpty()) { + const mobile: Member = memberMapper.selectOne(new QueryWrapper().select("member_id").eq("mobile", member.getMobile()).eq("site_id", RequestUtils.siteId())); + if (ObjectUtil.isNotNull(mobile)) throw new BadRequestException("账号已存在"); + } + + if (ObjectUtil.isEmpty(member.getNickname())) { + if (ObjectUtil.isNotEmpty(member.getUsername())) { + member.setNickname(member.getUsername()); + } else if (ObjectUtil.isNotEmpty(member.getMobile())) { + member.setNickname(member.getMobile().substring(0, 3) + "****" + member.getMobile().substring(7)); + } else { + member.setNickname(createName()); + } + } + + member.setSiteId(RequestUtils.siteId()); + member.setCreateTime(System.currentTimeMillis() / 1000); + member.setMemberNo(coreMemberService.createMemberNo(RequestUtils.siteId())); + member.setRegisterChannel(RequestUtils.channel()); + this.memberMapper.insert(member); + + // 会员注册事件 + const registerEvent: MemberRegisterEvent = new MemberRegisterEvent(); + registerEvent.setSiteId(RequestUtils.siteId()); + registerEvent.addAppSign("core"); + registerEvent.setName("MemberRegisterEvent"); + registerEvent.setMember(member); + EventPublisher.publishEvent(registerEvent); + + return loginService.login(member); } /** * checkMobileCode */ async checkMobileCode(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + if (mobile.length === 0) throw new BadRequestException("手机号必须填写"); + const request: HttpServletRequest = RequestUtils.handler(); + if (ObjectUtil.isEmpty(mobileKey) || ObjectUtil.isEmpty(mobileCode)) throw new BadRequestException("手机验证码有误"); + const cache: any = cached.get(mobileKey); + if (ObjectUtil.isNull(cache)) throw new BadRequestException("手机验证码有误"); + const vo: MobileCodeCacheVo = new MobileCodeCacheVo(); + BeanUtils.copyProperties(cache, vo); + if (!vo.getMobile() === mobile || !vo.getCode() === mobileCode) throw new BadRequestException("手机验证码有误"); + cached.remove(mobileKey); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/member/impl/member-account-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/member/impl/member-account-service-impl.service.ts index a4e7a4f2..d11fd868 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/member/impl/member-account-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/member/impl/member-account-service-impl.service.ts @@ -14,23 +14,65 @@ export class MemberAccountServiceImplService { * accountRecords */ async accountRecords(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return 0; + const queryWrapper: QueryWrapper = new QueryWrapper(); + queryWrapper.select("id"); + queryWrapper.eq("member_id", param.memberId()); + if (StrUtil.isNotEmpty(param.getAccountType())) { + queryWrapper.eq("account_type", param.getAccountType()); + } + if (StrUtil.isNotEmpty(param.getFromType())) { + queryWrapper.eq("from_type", param.getFromType()); + } + if (ObjectUtil.isNotEmpty(param.getCreateTime())) { + QueryMapperUtils.buildByTime(queryWrapper, "create_time", param.getCreateTime()); + } + const count: number = this.memberAccountLogMapper.selectCount(queryWrapper); + return count; } /** * getAccountSource */ async getAccountSource(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return 0; + const jsonObject: Record = JsonModuleLoader.build().mergeResultElement("account_change_type.json"); + const accountTypeObject: Record = jsonObject.getJSONObject(param.getAccountType()); + if (accountTypeObject == null) { + throw new BaseException("MEMBER_TYPE_NOT_EXIST"); + } + return accountTypeObject; } /** * pointCount */ async pointCount(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const accountPointCountVo: AccountPointCountVo = new AccountPointCountVo(); + const queryWrapper: QueryWrapper = new QueryWrapper(); + queryWrapper.select("point,point_get"); + queryWrapper.eq("site_id", param.siteId()); + queryWrapper.eq("member_id", param.memberId()); + const member: Member = this.memberMapper.selectOne(queryWrapper); + if (member == null) { + throw new BaseException("会员不存在"); + } + if (member.getPoint() != null) { + accountPointCountVo.setPoint(member.getPoint()); + } + if (member.getPointGet() != null) { + accountPointCountVo.setPointGet(member.getPointGet()); + } + + const accountLog: MemberAccountLog = memberAccountLogMapper.selectOne(new QueryWrapper() + .eq("site_id", param.siteId()) + .eq("member_id", param.memberId()) + .eq("account_type", AccountTypeEnum.POINT.getType()) + .lt("account_data", 0) + .select("SUM(account_data) AS account_data") + .groupBy("member_id") + ); + if (accountLog != null) { + accountPointCountVo.setUse(Math.abs(accountLog.getAccountData().doubleValue())); + } + return accountPointCountVo; } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/member/impl/member-address-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/member/impl/member-address-service-impl.service.ts index 85aa9106..641b6fd6 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/member/impl/member-address-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/member/impl/member-address-service-impl.service.ts @@ -14,39 +14,93 @@ export class MemberAddressServiceImplService { * add */ async add(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + // 校验区域有效性 + // this.checkAndFillAddressValue(param); + // 默认地址设定 + if (param.getIsDefault() != null && param.getIsDefault() == 1) { + try { + this.deleteDefaultAddress(param.memberId()); + } catch (Exception e) { + log.error("更新会员默认地址数据库操作错误:", e.getMessage()); + throw new BaseException("添加会员收货地址错误."); + } + } + // 插入实体表 + const newMemberAddress: MemberAddress = CollectUtils.build(param, MemberAddress.class); + // 前置业务条件 + newMemberAddress.setSiteId(param.siteId()); + newMemberAddress.setMemberId(param.memberId()); + // 插入显式的设置为空 + newMemberAddress.setId(null); + const result: number = this.memberAddressMapper.insert(newMemberAddress); + if (result <= 0) { + throw new BaseException("添加会员收货地址失败."); + } + return result; } /** * delete */ async delete(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return; + const queryWrapper: QueryWrapper = new QueryWrapper(); + queryWrapper.eq("site_id", param.siteId()); + queryWrapper.eq("member_id", param.memberId()); + queryWrapper.eq("id", param.getId()); + const result: number = this.memberAddressMapper.delete(queryWrapper); + if (result == 0) { + throw new BaseException("删除会员收货地址失败."); + } + return result; } /** * edit */ async edit(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + // 校验区域有效性 + // this.checkAndFillAddressValue(param); + // 默认地址设定 + if (param.getIsDefault() != null && param.getIsDefault() == 1) { + try { + deleteDefaultAddress(param.memberId()); + } catch (Exception e) { + log.error("更新会员默认地址数据库操作错误:", e.getMessage()); + throw new BaseException("添加会员收货地址错误."); + } + } + // 存在校验 + const oldMemberAddress: MemberAddress = this.getMemberAddress(param.siteId(), param.memberId(), param.getId()); + if (oldMemberAddress == null) { + throw new BaseException("[" + oldMemberAddress.getId() + "]会员收货地址不存在"); + } + // 修改实体表 + const newMemberAddress: MemberAddress = CollectUtils.build(param, MemberAddress.class); + newMemberAddress.setId(oldMemberAddress.getId()); + return this.memberAddressMapper.updateById(newMemberAddress); } /** * getInfo */ async getInfo(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const memberAddress: MemberAddress = this.getMemberAddress(param.siteId(), param.memberId(), param.getId()); + const memberAddressGetInfoVo: MemberAddressGetInfoVo = new MemberAddressGetInfoVo(); + BeanUtils.copyProperties(memberAddress, memberAddressGetInfoVo); + return memberAddressGetInfoVo; } /** * getList */ async getList(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + queryWrapper.select("id,member_id,name,mobile,address,address_name,full_address,is_default,lng,lat"); + queryWrapper.eq("site_id", param.siteId()); + queryWrapper.eq("member_id", param.memberId()); + queryWrapper.orderByDesc(Arrays.asList("is_default", "id")); + const memberAddressList: MemberAddress[] = memberAddressMapper.selectList(queryWrapper); + const memberAddressListInfoVo: MemberAddressListInfoVo[] = CollectUtils.convert(memberAddressList, MemberAddressListInfoVo.class); + return memberAddressListInfoVo; } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/member/impl/member-cash-out-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/member/impl/member-cash-out-service-impl.service.ts index 4b5ddd9b..9ed87165 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/member/impl/member-cash-out-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/member/impl/member-cash-out-service-impl.service.ts @@ -14,95 +14,171 @@ export class MemberCashOutServiceImplService { * cashOutInfo */ async cashOutInfo(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const vo: MemberCashOutInfoVo = memberCashOutMapper.selectJoinOne( + MemberCashOutInfoVo.class, + new MPJQueryWrapper() + .select("mco.*,m.member_no,m.username,m.nickname,m.mobile,m.headimg,pt.transfer_voucher,pt.transfer_remark,pt.extra,pt.package_info") + .eq("mco.id", param.getId()) + .eq("mco.member_id", param.memberId()) + .eq("mco.site_id", param.siteId()) + .setAlias("mco") + .leftJoin("?_member m ON mco.member_id = m.member_id".replace("?_", this.config.get('tablePrefix'))) + .leftJoin("?_pay_transfer pt ON mco.transfer_no = pt.transfer_no".replace("?_", this.config.get('tablePrefix'))) + ); + + if (vo != null) { + MemberCashOutInfoVo.const transfer: Transfer = new MemberCashOutInfoVo.Transfer(); + transfer.setTransferNo(vo.getTransferNo()); + transfer.setTransferRemark(vo.getTransferRemark()); + transfer.setTransferVoucher(vo.getTransferVoucher()); + transfer.setExtra(vo.getExtra()); + transfer.setPackageInfo(vo.getPackageInfo()); + vo.setTransfer(transfer); + } + + return vo; } /** * cashOutConfig */ async cashOutConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return coreMemberConfigService.getCashOutConfig(param.siteId()); } /** * transferMethod */ async transferMethod(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return TransferTypeEnum.getMap(); } /** * cashOutApply */ async cashOutApply(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + param.setMemberId(RequestUtils.memberId()); + param.setSiteId(RequestUtils.siteId()); + return coreMemberCashOutService.apply(param); } /** * cashOutCancel */ async cashOutCancel(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const cashOut: MemberCashOut = memberCashOutMapper.selectOne(new QueryWrapper() + .eq("member_id", param.memberId()) + .eq("site_id", param.siteId()) + .eq("id", param.getId())); + if (ObjectUtil.isEmpty(cashOut)) throw new BadRequestException("提现申请不存在"); + + coreMemberCashOutService.cancel(cashOut.getSiteId(), cashOut.getId()); + return true; } /** * transfer */ async transfer(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const cashOut: MemberCashOut = memberCashOutMapper.selectOne(new QueryWrapper() + .eq("member_id", RequestUtils.memberId()) + .eq("site_id", RequestUtils.siteId()) + .eq("id", param.getId())); + if (ObjectUtil.isEmpty(cashOut)) throw new BadRequestException("提现申请不存在"); + if (!cashOut.getStatus() === MemberCashOutStatusEnum.WAIT_TRANSFER.getStatus()) throw new BadRequestException("当前提现申请未处于待转账状态"); + + return coreMemberCashOutService.transfer(cashOut, param); } /** * accountList */ async accountList(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return 0; + const page: number = pageParam.getPage(); + const limit: number = pageParam.getLimit(); + const queryWrapper: QueryWrapper = new QueryWrapper(); + queryWrapper.select("account_id,site_id,member_id,account_type,bank_name,realname,account_no,transfer_payment_code"); + queryWrapper.eq("site_id", param.siteId()); + queryWrapper.eq("member_id", param.memberId()); + if (ObjectUtil.isNotEmpty(param.getAccountType())) queryWrapper.eq("account_type", param.getAccountType()); + queryWrapper.orderByDesc(Arrays.asList("create_time")); + const iPage: IPage = this.memberCashOutAccountMapper.selectPage(new Page<>(page, limit), queryWrapper); + const dataList: MemberCashOutAccountVo[] = CollectUtils.convert(iPage.getRecords(), MemberCashOutAccountVo.class); + return PageResult.build(page, limit, iPage.getTotal()).setData(dataList); } /** * accountDetails */ async accountDetails(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return 0; + const queryWrapper: QueryWrapper = new QueryWrapper(); + queryWrapper.select("account_id,site_id,member_id,account_type,bank_name,realname,account_no,transfer_payment_code"); + queryWrapper.eq("account_id", param.getAccountId()); + queryWrapper.eq("site_id", param.siteId()); + queryWrapper.eq("member_id", param.memberId()); + const memberCashOutAccount: MemberCashOutAccount = this.memberCashOutAccountMapper.selectOne(queryWrapper); + const memberCashOutAccountDetailsVo: MemberCashOutAccountDetailsVo = new MemberCashOutAccountDetailsVo(); + BeanUtils.copyProperties(memberCashOutAccount, memberCashOutAccountDetailsVo); + return memberCashOutAccountDetailsVo; } /** * accountDetailsOfFirst */ async accountDetailsOfFirst(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return 0; + const queryWrapper: QueryWrapper = new QueryWrapper(); + queryWrapper.select("account_id,site_id,member_id,account_type,bank_name,realname,account_no,transfer_payment_code"); + queryWrapper.eq("site_id", param.siteId()); + queryWrapper.eq("member_id", param.memberId()); + if (ObjectUtil.isNotEmpty(param.getAccountType())) queryWrapper.eq("account_type", param.getAccountType()); + queryWrapper.orderByDesc("create_time"); + queryWrapper.last("limit 1"); + const memberCashOutAccount: MemberCashOutAccount = this.memberCashOutAccountMapper.selectOne(queryWrapper); + if (memberCashOutAccount == null) return null; + const memberCashOutFirstAccountDetailsVo: MemberCashOutFirstAccountDetailsVo = new MemberCashOutFirstAccountDetailsVo(); + BeanUtils.copyProperties(memberCashOutAccount, memberCashOutFirstAccountDetailsVo); + return memberCashOutFirstAccountDetailsVo; } /** * addAccount */ async addAccount(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return 0; + // 构建新的对象,并插入数据库 + const newMemberCashOutAccount: MemberCashOutAccount = new MemberCashOutAccount(); + newMemberCashOutAccount.setSiteId(param.siteId()); + newMemberCashOutAccount.setMemberId(param.memberId()); + newMemberCashOutAccount.setCreateTime(System.currentTimeMillis() / 1000); + BeanUtils.copyProperties(param, newMemberCashOutAccount); + this.memberCashOutAccountMapper.insert(newMemberCashOutAccount); + // 返回当前对象的ID + return newMemberCashOutAccount.getAccountId(); } /** * editAccount */ async editAccount(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return 0; + // 根据ID查找实体对象,对象存在即更新数据库 + const oldMemberCashOutAccount: MemberCashOutAccount = this.memberCashOutAccountMapper.selectOne(new QueryWrapper() + .eq("account_id", accountId) + .eq("member_id", param.memberId())); + if (oldMemberCashOutAccount == null) { + throw new Error("会员账户不存在"); + } + const newMemberCashOutAccount: MemberCashOutAccount = new MemberCashOutAccount(); + BeanUtils.copyProperties(param, newMemberCashOutAccount); + newMemberCashOutAccount.setAccountId(accountId); + newMemberCashOutAccount.setUpdateTime(System.currentTimeMillis() / 1000); + return this.memberCashOutAccountMapper.updateById(newMemberCashOutAccount); } /** * deleteAccount */ async deleteAccount(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return 0; + return this.memberCashOutAccountMapper.delete(new QueryWrapper() + .eq("account_id", param.getAccountId()) + .eq("member_id", param.memberId())); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/member/impl/member-level-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/member/impl/member-level-service-impl.service.ts index 42989b1e..49da61b9 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/member/impl/member-level-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/member/impl/member-level-service-impl.service.ts @@ -14,39 +14,117 @@ export class MemberLevelServiceImplService { * findById */ async findById(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return memberLevelMapper.selectById(id); } /** * findByIds */ async findByIds(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const queryWrapper: QueryWrapper = new QueryWrapper(); + queryWrapper.select("level_id,level_name"); + queryWrapper.in("id", idSet); + const memberLevelList: MemberLevel[] = memberLevelMapper.selectList(queryWrapper); + return CollectUtils.convert(memberLevelList, MemberLevelSimpleInfoVo.class); } /** * list */ async list(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return []; + const queryWrapper: QueryWrapper = new QueryWrapper(); + queryWrapper.select("level_id,site_id,level_name,growth,remark,level_benefits,level_gifts"); + queryWrapper.eq("site_id", param.siteId()); + const memberLevelList: MemberLevel[] = memberLevelMapper.selectList(queryWrapper); + + if (memberLevelList == null) return null; + + const levelStyle: Record = MemberLevelStyleEnum.getStyle(); + + const filling: Record = new Record(); + filling.put("benefits_one", new Record().set("title", "专属客服").set("desc", "专业服务").set("icon", "/static/resource/images/member/benefits/benefits_kefu.png")); + filling.put("benefits_two", new Record().set("title", "专属徽章").set("desc", "专属徽章").set("icon", "/static/resource/images/member/benefits/benefits_badge.png")); + filling.put("benefits_four", new Record().set("title", "经验累计").set("desc", "经验累计").set("icon", "/static/resource/images/member/benefits/benefits_experience.png")); + filling.put("benefits_three", new Record().set("title", "尊享客服").set("desc", "尊享客服").set("icon", "/static/resource/images/member/benefits/benefits_badge.png")); + + const index: number = 0; + const list: MemberLevelInfoVo[] = []; + for (const level of memberLevelList) { + const vo: MemberLevelInfoVo = new MemberLevelInfoVo(); + BeanUtils.copyProperties(level, vo); + + if (ObjectUtil.isNotEmpty(level.getLevelBenefits())) { + const benefits: Record = JSONUtil.parseObj(level.getLevelBenefits()); + benefits = coreMemberService.getBenefitsContent(param.siteId(), benefits, "member_level"); + vo.setLevelBenefits(benefits); + } else { + vo.setLevelBenefits(filling); + } + + if (vo.getLevelBenefits().size() < 4) { + for (const key of filling.keySet()) { + if (vo.getLevelBenefits().size() == 4) break; + vo.getLevelBenefits().putByPath(key + ".content", filling.get(key)); + } + } + + if (!level.getLevelGifts().isEmpty()) { + const gifts: Record = JSONUtil.parseObj(level.getLevelGifts()); + gifts = coreMemberService.getGiftContent(param.siteId(), gifts, "member_level"); + vo.setLevelGifts(gifts); + } + const levelKey: number = index % 7 + 1; + vo.setLevelBg("/static/resource/images/member/level/bg_" + levelKey + ".png"); + vo.setMemberBg("/static/resource/images/member/level/member_" + levelKey + ".png"); + vo.setLevelIcon("/static/resource/images/member/level/level_icon" + levelKey + ".png"); + vo.setLevelTag("/static/resource/images/member/level/level_" + levelKey + ".png"); + vo.setLevelStyle(levelStyle.getJSONObject("level_" + levelKey)); + + list.add(vo); + index++; + } + + return list; } /** * findMemberLevel */ async findMemberLevel(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const queryWrapper: MPJQueryWrapper = new MPJQueryWrapper<>(); + queryWrapper.setAlias("m") + .leftJoin("?_member_level ml ON ml.level_id = m.member_level".replace("?_", this.config.get('tablePrefix'))); + queryWrapper.select("ml.*"); + queryWrapper.eq("m.member_id", memberId); + queryWrapper.ne("m.member_level", 0); + const level: MemberLevel = memberMapper.selectJoinOne(MemberLevel.class, queryWrapper); + if (level == null) return null; + + const vo: MemberLevelInfoVo = new MemberLevelInfoVo(); + BeanUtils.copyProperties(level, vo); + + if (ObjectUtil.isNotEmpty(level.getLevelBenefits()) && JSONUtil.isJson(level.getLevelBenefits())) vo.setLevelBenefits(JSONUtil.parseObj(level.getLevelBenefits())); + if (ObjectUtil.isNotEmpty(level.getLevelGifts()) && JSONUtil.isJson(level.getLevelGifts())) vo.setLevelGifts(JSONUtil.parseObj(level.getLevelGifts())); + + return vo; } /** * getMobile */ async getMobile(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + try { + const phoneInfo: WxMaPhoneNumberInfo = WechatUtils.miniapp(RequestUtils.siteId()).getUserService().getPhoneNoInfo(mobileCode); + const mobile: string = phoneInfo.getPurePhoneNumber(); + + const member: Member = memberMapper.selectOne(new QueryWrapper().select("member_id").eq("mobile", mobile).eq("site_id", RequestUtils.siteId())); + if (member != null) throw new BadRequestException("当前手机号已绑定账号"); + + const vo: MemberGetMobileVo = new MemberGetMobileVo(); + vo.setMobile(mobile); + return vo; + } catch (Exception e) { + throw new BadRequestException(e.getMessage()); + } } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/member/impl/member-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/member/impl/member-service-impl.service.ts index 5e5ff1ac..0aa50559 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/member/impl/member-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/member/impl/member-service-impl.service.ts @@ -14,55 +14,146 @@ export class MemberServiceImplService { * info */ async info(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const queryWrapper: MPJQueryWrapper = new MPJQueryWrapper<>(); + queryWrapper.setAlias("m") + .leftJoin("?_member_level ml ON ml.level_id = m.member_level".replace("?_", this.config.get('tablePrefix'))); + queryWrapper.select("member_id, m.site_id, username, member_no, mobile, register_channel, nickname, headimg, member_level, member_label, login_ip, login_type, login_time, m.create_time, last_visit_time, last_consum_time, sex, m.status, birthday, point, balance, m.growth, is_member, member_time, is_del, province_id, city_id, district_id, address, location, money, money_get, wx_openid, weapp_openid, commission, commission_get, commission_cash_outing, ml.level_name as member_level_name"); + queryWrapper.eq("member_id", param.memberId()); + // SAAS域控制(交给SQL引擎处理) + queryWrapper.eq("m.site_id", param.siteId()); + const memberInfoVo: MemberInfoVo = memberMapper.selectJoinOne(MemberInfoVo.class, queryWrapper); + if (ObjectUtil.isNotEmpty(memberInfoVo)){ + const memberConfig: MemberConfigVo = coreMemberConfigService.getMemberConfig(memberInfoVo.getSiteId()); + memberInfoVo.setFormId(memberConfig.getFormId() == null ? "" : memberConfig.getFormId().toString()); + memberInfoVo.setFormRecordId(""); + if ((memberInfoVo.getFormId( && memberInfoVo.getFormId(.trim() !== ''))){ + const diyFormRecords: DiyFormRecords = diyFormRecordsMapper.selectOne(new LambdaQueryWrapper() + .eq(DiyFormRecords::getFormId, memberConfig.getFormId()) + .eq(DiyFormRecords::getMemberId, memberInfoVo.getMemberId()) + .orderByDesc(DiyFormRecords::getCreateTime)); + if (ObjectUtil.isNotEmpty(diyFormRecords)){ + memberInfoVo.setFormRecordId(diyFormRecords.getRecordId().toString()); + } + } + } + return memberInfoVo; } /** * center */ async center(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const queryWrapper: QueryWrapper = new QueryWrapper(); + queryWrapper.select("member_id, site_id, username, member_no, mobile, register_channel, nickname, headimg, member_level, member_label, login_ip, login_type, login_time, create_time, last_visit_time, last_consum_time, sex, status, birthday, point, balance, growth, is_member, member_time, is_del, province_id, city_id, district_id, address, location, money, money_get, commission, commission_get, commission_cash_outing"); + queryWrapper.eq("member_id", param.memberId()); + queryWrapper.eq("site_id", param.siteId()); + const member: Member = memberMapper.selectOne(queryWrapper); + if (member == null) { + return null; + } + + const memberCenterVo: MemberCenterVo = new MemberCenterVo(); + BeanUtils.copyProperties(member, memberCenterVo); + return memberCenterVo; } /** * modify */ async modify(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const oldMember: Member = this.memberMapper.selectById(param.memberId()); + Assert.notNull(oldMember, "会员不存在"); + + const newMember: Member = new Member(); + newMember.setMemberId(oldMember.getMemberId()); + + switch (param.getField()) { + case "nickname": + newMember.setNickname(String.valueOf(param.getValue())); + break; + case "headimg": + newMember.setHeadimg(String.valueOf(param.getValue())); + break; + case "member_label": + newMember.setMemberLabel(String.valueOf(param.getValue())); + break; + case "member_level": + newMember.setMemberLevel(number.parseInt(String.valueOf(param.getValue()))); + break; + case "birthday": + newMember.setBirthday(String.valueOf(param.getValue())); + break; + case "sex": + newMember.setSex(number.parseInt(String.valueOf(param.getValue()))); + break; + default: + throw new BadRequestException("不允许修改的信息"); + } + return this.memberMapper.updateById(newMember); } /** * edit */ async edit(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const oldMember: Member = this.memberMapper.selectById(param.memberId()); + Assert.notNull(oldMember, "会员不存在"); + + const newMember: Member = new Member(); + newMember.setMemberId(oldMember.getMemberId()); + if (ObjectUtil.isNotEmpty(param.getData().getNickname())) newMember.setNickname(param.getData().getNickname()); + if (ObjectUtil.isNotEmpty(param.getData().getHeadimg())) newMember.setHeadimg(param.getData().getHeadimg()); + if (ObjectUtil.isNotEmpty(param.getData().getBirthday())) newMember.setBirthday(param.getData().getBirthday()); + if (ObjectUtil.isNotEmpty(param.getData().getSex())) newMember.setSex(param.getData().getSex()); + if (ObjectUtil.isNotEmpty(param.getData().getLastVisitTime())) newMember.setLastVisitTime(param.getData().getLastVisitTime()); + return this.memberMapper.updateById(newMember); } /** * mobile */ async mobile(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const oldMember: Member = this.memberMapper.selectById(param.memberId()); + Assert.notNull(oldMember, "会员不存在"); + + if (ObjectUtil.isNotEmpty(param.getMobile())) { + registerService.checkMobileCode(param.getMobile(), param.getMobileKey(), param.getMobileCode()); + } else if (ObjectUtil.isNotEmpty(param.getMobileCode())) { + try { + const phoneInfo: WxMaPhoneNumberInfo = WechatUtils.miniapp(RequestUtils.siteId()).getUserService().getPhoneNoInfo(param.getMobileCode()); + param.setMobile(phoneInfo.getPurePhoneNumber()); + } catch (Exception e) { + throw new BadRequestException(e.getMessage()); + } + } else { + throw new BadRequestException("手机号不存在"); + } + + const mobileExist: Member = memberMapper.selectOne(new QueryWrapper().select("member_id").eq("mobile", param.getMobile()).eq("site_id", RequestUtils.siteId())); + if (ObjectUtil.isNotNull(mobileExist)) throw new BadRequestException("当前手机号已绑定账号"); + + const newMember: Member = new Member(); + newMember.setMemberId(param.memberId()); + newMember.setMobile(param.getMobile()); + + return this.memberMapper.updateById(newMember); } /** * log */ async log(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const updateMember: Member = new Member(); + updateMember.setMemberId(param.memberId()); + updateMember.setLastVisitTime(DateUtils.currTime()); + this.memberMapper.updateById(updateMember); + return 1; } /** * qrcode */ async qrcode(...args: any[]): Promise { - // TODO: 实现业务逻辑 return null; } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/member/impl/member-sign-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/member/impl/member-sign-service-impl.service.ts index 1f9f0c74..6ce10c0a 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/member/impl/member-sign-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/member/impl/member-sign-service-impl.service.ts @@ -14,39 +14,187 @@ export class MemberSignServiceImplService { * signRecord */ async signRecord(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const page: number = pageParam.getPage(); + const limit: number = pageParam.getLimit(); + + const queryWrapper: QueryWrapper = new QueryWrapper(); + queryWrapper.select("sign_id, site_id, member_id, days, day_award, continue_award, continue_tag, create_time, is_sign"); + queryWrapper.eq("site_id", param.siteId()); + queryWrapper.eq("member_id", param.memberId()); + queryWrapper.orderByDesc(Arrays.asList("create_time")); + + const iPage: IPage = this.memberSignMapper.selectPage(new Page<>(page, limit), queryWrapper); + const dataList: MemberSignRecordVo[] = CollectUtils.convert(iPage.getRecords(), MemberSignRecordVo.class); + return PageResult.build(page, limit, iPage.getTotal()).setData(dataList); } /** * signDetails */ async signDetails(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const queryWrapper: QueryWrapper = new QueryWrapper(); + queryWrapper.select("sign_id, site_id, member_id, days, day_award, continue_award, continue_tag, create_time, is_sign"); + queryWrapper.eq("sign_id", param.getSignId()); + queryWrapper.eq("site_id", param.siteId()); + queryWrapper.eq("member_id", param.memberId()); + const memberSignList: MemberSign[] = this.memberSignMapper.selectList(queryWrapper); + const memberSignDetailsVo: MemberSignDetailsVo = null; + if (memberSignList != null && memberSignList.size() > 0) { + memberSignDetailsVo = new MemberSignDetailsVo(); + BeanUtils.copyProperties(memberSignList.get(0), memberSignDetailsVo); + } + return memberSignDetailsVo; } /** * signOperate */ async signOperate(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const signConfig: Record = coreConfigService.getConfigValue(RequestUtils.siteId(), "SIGN_CONFIG"); + const config: MemberSignConfigVo = JSONUtil.toBean(signConfig, MemberSignConfigVo.class); + + if (!config.getIsUse()) throw new Error("签到未开启"); + + // 获取今天的签到 + const todayMemberSign: MemberSign = this.queryMemberSign(param.siteId(), param.memberId(), DateUtils.getFormatTodayString()); + if (todayMemberSign != null) throw new Error("今日已签到"); + + const vo: MemberSignOperateVo = new MemberSignOperateVo(); + vo.setTitle("签到成功"); + vo.setInfo("恭喜您获得以下奖励"); + + // 获取昨天的签到 + const yesterdayMemberSign: MemberSign = this.queryMemberSign(param.siteId(), param.memberId(), DateUtils.getFormatYesterdayString()); + + const days: number = 1; + if (yesterdayMemberSign != null) { + //连签天数大于签到周期,连签天数重置为const days: 1 + = yesterdayMemberSign.getDays() + 1; + if (days > config.getSignPeriod()) { + days = 1; + } + if (ObjectUtil.isNotEmpty(config.getContinueAward())) { + const continueSigns: JSONArray = config.getContinueAward(); + CollUtil.sort(continueSigns, Comparator.comparing(o => ((Record) o).getInt("continue_sign")).reversed()); + // 获取最大的连签天数 + const maxContinueSign: number = continueSigns.getJSONObject(0).getInt("continue_sign"); + if (days > maxContinueSign) { + days = 1; + } + } + } + + // 添加签到记录 + const model: MemberSign = new MemberSign(); + model.setSiteId(param.siteId()); + model.setMemberId(param.memberId()); + model.setIsSign(1); + model.setCreateTime(System.currentTimeMillis() / 1000); + model.setDays(days); + model.setDayAward(config.getDayAward().toString()); + model.setContinueAward(""); + if (days === 1) model.setStartTime(System.currentTimeMillis() / 1000); + memberSignMapper.insert(model); + + // 发放日签奖励 + const dayAwardVar: Record = {}; + dayAwardVar.put("from_type", "day_sign_award"); + dayAwardVar.put("memo", "日签奖励"); + coreMemberService.memberGiftGrant(param.siteId(), param.memberId(), config.getDayAward(), dayAwardVar); + vo.setAwards(coreMemberService.getGiftContent(param.siteId(), config.getDayAward(), "member_sign")); + + // 发放连签奖励 + if (config.getContinueAward().size() > 0) { + const continueAward: Record = null; + for (const i of number = 0; i < config.getContinueAward().size(); i++) { + const item: Record = config.getContinueAward().getJSONObject(i); + if (item.getInt("continue_sign") === days) { + // 是否限制领取 + if (item.getInt("receive_limit") === 2) { + // 周期开始时间 + const periodStartTime: number = memberSignMapper.selectOne(new QueryWrapper() + .select("start_time") + .eq("member_id", param.memberId()) + .eq("site_id", param.siteId()) + .eq("days", 1) + .gt("start_time", 0) + .orderByDesc("sign_id") + .last("limit 1") + ).getStartTime(); + // 周期结束时间 + const periodEndTime: number = periodStartTime + (config.getSignPeriod() * 86400); + // 领取次数 + const receiveNum: number = memberSignMapper.selectCount(new QueryWrapper() + .eq("member_id", param.memberId()) + .eq("site_id", param.siteId()) + .between("create_time", periodStartTime, periodEndTime) + .eq("continue_tag", item.getStr("continue_tag")) + ); + if (receiveNum < item.getInt("receive_num")) { + continueAward = item; + } + } else { + continueAward = item; + } + break; + } + } + + if (continueAward != null) { + model.setContinueTag(continueAward.getStr("continue_tag")); + continueAward.remove("continue_sign"); + continueAward.remove("continue_tag"); + continueAward.remove("receive_limit"); + continueAward.remove("receive_num"); + + const continueAwardVar: Record = {}; + continueAwardVar.put("from_type", "continue_sign_award"); + continueAwardVar.put("memo", "连签奖励"); + coreMemberService.memberGiftGrant(param.siteId(), param.memberId(), continueAward, continueAwardVar); + + model.setContinueAward(continueAward.toString()); + memberSignMapper.updateById(model); + + vo.setInfo("连签" + days.toString() + "天恭喜您获得以下奖励"); + vo.setAwards(coreMemberService.getGiftContent(param.siteId(), continueAward, "member_sign")); + } + } + + return vo; } /** * signMonthRecord */ async signMonthRecord(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const vo: MemberSignMonthRecordVo = new MemberSignMonthRecordVo(); + const days: number[] = []; + const period: MemberSignMonthRecordVo.Period[] = []; + + const date: Date = DateUtil.parse(param.getYear() + "-" + param.getMonth() + "-1"); + + const signRecord: MemberSign[] = this.memberSignMapper.selectList(new QueryWrapper() + .eq("member_id", param.memberId()) + .between("create_time", + DateUtil.beginOfMonth(date).getTime() / 1000, + DateUtil.endOfMonth(date).getTime() / 1000) + .orderByAsc("create_time")); + + if (signRecord.size() > 0) { + for (const item of signRecord) { + days.add(number.parseInt(DateUtil.format(new Date(item.getCreateTime() * 1000), "dd"))); + } + } + + vo.setDays(days); + vo.setPeriod(period); + return vo; } /** * signDayRecord */ async signDayRecord(...args: any[]): Promise { - // TODO: 实现业务逻辑 return null; } @@ -54,7 +202,58 @@ export class MemberSignServiceImplService { * signConfig */ async signConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const config: Record = coreConfigService.getConfigValue(RequestUtils.siteId(), "SIGN_CONFIG"); + const signConfig: MemberSignConfigVo = JSONUtil.toBean(config, MemberSignConfigVo.class); + + if (!signConfig.getDayAward().isEmpty()) { + signConfig.setDayAward(coreMemberService.getGiftContent(RequestUtils.siteId(), signConfig.getDayAward(), "member_sign")); + } + if (!signConfig.getContinueAward().isEmpty()) { + const continueAward: JSONArray = new JSONArray(); + for (const i of number = 0; i < signConfig.getContinueAward().size(); i++) { + const awardItem: Record = new Record(); + const item: Record = signConfig.getContinueAward().getJSONObject(i); + awardItem.set("continue_sign", item.get("continue_sign")); + + item.remove("continue_sign"); + item.remove("continue_tag"); + item.remove("receive_limit"); + item.remove("receive_num"); + + const award: Record = coreMemberService.getGiftContent(RequestUtils.siteId(), item, "member_sign_continue"); + + const content: string[] = []; + const icon: string = ""; + + for (const key of award.keySet()) { + if (award.getJSONObject(key).get("content") != null) { + content.add(award.getByPath(key + ".content.text", String.class)); + icon = award.getByPath(key + ".content.icon", String.class); + } + } + const gift: Record = new Record(); + if (content.size() > 0) { + gift.set("text", String.join("+", content)); + gift.set("icon", content.size() > 1 ? "static/resource/images/member/sign/pack01.png" : icon); + } + + awardItem.set("gift", new Record().set("total", gift)); + continueAward.add(awardItem); + } + signConfig.setContinueAward(continueAward); + } + + // 获取今天的签到 + const todayMemberSign: MemberSign = this.queryMemberSign(param.siteId(), param.memberId(), DateUtils.getFormatTodayString()); + signConfig.setIsSign(todayMemberSign == null ? false : true); + + // 获取昨天的签到 + const yesterdayMemberSign: MemberSign = this.queryMemberSign(param.siteId(), param.memberId(), DateUtils.getFormatYesterdayString()); + if (todayMemberSign == null) { + signConfig.setDays(yesterdayMemberSign == null ? 0 : yesterdayMemberSign.getDays()); + } else { + signConfig.setDays(todayMemberSign.getDays()); + } + return signConfig; } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/pay/impl/pay-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/pay/impl/pay-service-impl.service.ts index 32c640cb..48936960 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/pay/impl/pay-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/pay/impl/pay-service-impl.service.ts @@ -14,31 +14,86 @@ export class PayServiceImplService { * pay */ async pay(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + param.setSiteId(RequestUtils.siteId()); + param.setChannel(RequestUtils.channel()); + param.setBuyerId(RequestUtils.memberId()); + + if (RequestUtils.channel() === ChannelEnum.WECHAT.getCode() && param.getOpenid().isEmpty()) { + const member: Member = memberMapper.selectOne(new QueryWrapper().select("wx_openid").eq("site_id", param.getSiteId()).eq("member_id", RequestUtils.memberId())); + param.setOpenid(ObjectUtil.defaultIfNull(member.getWxOpenid(), "")); + } + if (RequestUtils.channel() === ChannelEnum.WEAPP.getCode() && param.getOpenid().isEmpty()) { + const member: Member = memberMapper.selectOne(new QueryWrapper().select("weapp_openid").eq("site_id", param.getSiteId()).eq("member_id", RequestUtils.memberId())); + param.setOpenid(ObjectUtil.defaultIfNull(member.getWeappOpenid(), "")); + } + + return corePayService.pay(param); } /** * asyncNotify */ async asyncNotify(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return corePayService.asyncNotify(param, request, response); } /** * getInfoByTrade */ async getInfoByTrade(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return corePayService.getInfoByTrade(RequestUtils.siteId(), tradeType, tradeId, RequestUtils.channel(), scene); } /** * friendspayInfo */ async friendspayInfo(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const payQueryWrapper: QueryWrapper = new QueryWrapper<>(); + payQueryWrapper.eq("trade_type", tradeType) + .eq("trade_id", tradeId); + const fromPayInfos: Pay[] = payMapper.selectList(payQueryWrapper); + if (ObjectUtil.isEmpty(fromPayInfos) || fromPayInfos.stream().noneMatch(o => o.getSiteId() === RequestUtils.siteId())) { + throw new Error("支付单据不存在"); + } + + const payInfo: GetInfoByTradeVo = getInfoByTrade(tradeType, tradeId, "friendspay"); + if (ObjectUtil.isEmpty(payInfo)) { + return new FriendspayInfoVo(); + } + + const vo: FriendspayInfoVo = new FriendspayInfoVo(); + BeanUtil.copyProperties(payInfo, vo); + vo.setConfig(payInfo.getConfig()); + vo.setPayTypeList(payInfo.getPayTypeList()); + vo.setCreateTime(DateUtils.timestampToString(payInfo.getCreateTime())); + if (payInfo.getPayTime() != 0) { + vo.setPayTime(DateUtils.timestampToString(payInfo.getPayTime())); + } + + if (payInfo.getCancelTime() != 0) { + vo.setCancelTime(DateUtils.timestampToString(payInfo.getCancelTime())); + } + + PayTradeInfoDefiner.const event: PayTradeInfoEvent = new PayTradeInfoDefiner.PayTradeInfoEvent(tradeType, tradeId); + const trades: PayTradeInfoDefiner.PayTradeInfoEventResult[] = EventAndSubscribeOfPublisher.publishAndCallback(event); + if (ObjectUtil.isNotEmpty(trades)) { + vo.setTradeInfo(trades.get(0).getJsonObject()); + } + + vo.setSelf(payInfo.getMainId() === RequestUtils.memberId()); + + const posterQueryWrapper: QueryWrapper = new QueryWrapper<>(); + posterQueryWrapper.eq("site_id", RequestUtils.siteId()) + .eq("type", "friendspay") + .eq("status", 1) + .eq("is_default", 1); + const sysPoster: SysPoster = sysPosterMapper.selectOne(posterQueryWrapper); + if (ObjectUtil.isNotEmpty(sysPoster)) { + vo.setPosterId(sysPoster.getId()); + } + + const member: Member = memberMapper.selectById(payInfo.getMainId()); + vo.setMember(member); + return vo; } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/sys/impl/base64-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/sys/impl/base64-service-impl.service.ts index 89ab3feb..569746d3 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/sys/impl/base64-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/sys/impl/base64-service-impl.service.ts @@ -14,7 +14,10 @@ export class Base64ServiceImplService { * image */ async image(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const url: string = coreBase64Service.image(content, RequestUtils.siteId()); + const base64ImageVo: Base64ImageVo = new Base64ImageVo(); + base64ImageVo.setUrl(url); + console.log("base64ImageVo = " + url); + return base64ImageVo; } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/sys/impl/sys-area-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/sys/impl/sys-area-service-impl.service.ts index 9d027ef3..a192c8ff 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/sys/impl/sys-area-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/sys/impl/sys-area-service-impl.service.ts @@ -14,39 +14,121 @@ export class SysAreaServiceImplService { * getAreaById */ async getAreaById(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + // 缓存分组名称 + const group: string = SysArea.class.getSimpleName(); + // 缓存Key值计算参数 + const paramList: any[] = Arrays.asList(id); + // 自动缓存 + return cached.rememberObject(useCache, group, paramList, (uniqueKey) => { + const sysArea: SysArea = sysAreaMapper.selectById(id); + log.info("result object => " + sysArea); + return sysArea; + }); } /** * getListByPid */ async getListByPid(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + // 缓存分组名称 + const group: string = SysAreaListVo.class.getSimpleName(); + // 缓存Key值计算参数 + const paramList: any[] = Arrays.asList(pid); + // 自动缓存 + const outterSysAreaList: SysAreaListVo[] = cached.remember(useCache, group, paramList, uniqueKey => { + List sysAreaVoList = null; + try { + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + queryWrapper.select("id,name"); + queryWrapper.eq("pid", pid); + const sysAreaList: SysArea[] = sysAreaMapper.selectList(queryWrapper); + sysAreaVoList = CollectUtils.convert(sysAreaList, SysAreaListVo.class); + } catch (Exception e) { + log.error("查询区域错误:", e.getMessage()); + throw new BaseException("查询区域错误"); + } + return sysAreaVoList; + }); + return outterSysAreaList; } /** * getAreaTree */ async getAreaTree(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + if (level == 1) { + // 参数级别:1,返回1级 + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + queryWrapper.select("id, pid, name"); + queryWrapper.eq("level", level); + const sysAreaList: SysArea[] = sysAreaMapper.selectList(queryWrapper); + return CollectUtils.convert(sysAreaList, SysAreaLevelVo.class); + } else if (level == 2) { + // 参数级别:2,返回1级包含2级 + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + queryWrapper.select("id, pid, name, level"); + queryWrapper.in("level", 1, 2); + const sysAreaList: SysArea[] = sysAreaMapper.selectList(queryWrapper); + const sysAreaLevelVoList: SysAreaLevelVo[] = CollectUtils.convert(sysAreaList, SysAreaLevelVo.class); + const sysAreaMap: Record = ObjectGroupUtils.groupList(sysAreaLevelVoList, "pid"); + return assembleAreaTree(sysAreaLevelVoList, sysAreaMap, 1, 2); + } else if (level == 3) { + // 参数级别:3,返回1级包含2级,2级包含3级 + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + queryWrapper.select("id, pid, name, level"); + queryWrapper.in("level", 1, 2, 3); + const sysAreaList: SysArea[] = sysAreaMapper.selectList(queryWrapper); + const sysAreaLevelVoList: SysAreaLevelVo[] = CollectUtils.convert(sysAreaList, SysAreaLevelVo.class); + const sysAreaMap: Record = ObjectGroupUtils.groupList(sysAreaLevelVoList, "pid"); + return assembleAreaTree(sysAreaLevelVoList, sysAreaMap, 1, 3); + } + return []; } /** * getAreaByAreaCode */ async getAreaByAreaCode(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const sysArea: SysArea = this.sysAreaMapper.selectById(code); + const jsonObject: Record = new Record(); + if (sysArea != null) { + if (sysArea.getLevel() == 1) { + jsonObject.putOpt("province", convertJsonObject(sysArea)); + } else if (sysArea.getLevel() == 2) { + jsonObject.putOpt("city", convertJsonObject(sysArea)); + const provinceSysArea: SysArea = this.sysAreaMapper.selectById(sysArea.getPid()); + if (provinceSysArea != null) { + jsonObject.putOpt("province", convertJsonObject(provinceSysArea)); + } + } else if (sysArea.getLevel() == 3) { + jsonObject.putOpt("district", convertJsonObject(sysArea)); + const citySysArea: SysArea = this.sysAreaMapper.selectById(sysArea.getPid()); + if (citySysArea != null) { + jsonObject.putOpt("city", convertJsonObject(citySysArea)); + const provinceSysArea: SysArea = this.sysAreaMapper.selectById(citySysArea.getPid()); + if (provinceSysArea != null) { + jsonObject.putOpt("province", convertJsonObject(provinceSysArea)); + } + } + } + } + return jsonObject; } /** * getAddressByLatlng */ async getAddressByLatlng(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const sysMapVo: SysMapVo = coreSysConfigService.getMap(param.siteId()); + const key: string = sysMapVo.getKey(); + const addressJsonString: string = TencentGeocoder.getAddress(key, param.getLatlng(), param.getGetPoi()); + const jsonObjectResult: Record = TencentGeocoder.formatData(addressJsonString); + const province: string = jsonObjectResult.getStr("province"); + jsonObjectResult.putOpt("province_id", this.queryCodeByNameAndLevel(province, 1)); + const city: string = jsonObjectResult.getStr("city"); + jsonObjectResult.putOpt("city_id", this.queryCodeByNameAndLevel(city, 2)); + const district: string = jsonObjectResult.getStr("district"); + jsonObjectResult.putOpt("district_id", this.queryCodeByNameAndLevel(district, 3)); + return jsonObjectResult; } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/sys/impl/sys-config-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/sys/impl/sys-config-service-impl.service.ts index 2599f4f5..8e8f00fe 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/sys/impl/sys-config-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/sys/impl/sys-config-service-impl.service.ts @@ -14,31 +14,27 @@ export class SysConfigServiceImplService { * copyright */ async copyright(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return coreSysConfigService.getCopyRight(param.siteId()); } /** * site */ async site(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return coreSiteService.getSiteCache(param.siteId()); } /** * sceneDomain */ async sceneDomain(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return coreSysConfigService.getSceneDomain(param.siteId()); } /** * map */ async map(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return coreSysConfigService.getMap(param.siteId()); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/sys/impl/sys-verify-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/sys/impl/sys-verify-service-impl.service.ts index 3fba98e7..12ecf581 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/sys/impl/sys-verify-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/sys/impl/sys-verify-service-impl.service.ts @@ -14,47 +14,203 @@ export class SysVerifyServiceImplService { * getVerifyCode */ async getVerifyCode(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + // 生成核销码(对应业务调用) + const verifyCodeList: string[] = this.createVerifyCode(param.siteId(), param.memberId(), param.getType(), param.getData()); + const sysVerifyGetCodeVoList: SysVerifyGetCodeVo[] = []; + for (const verifyCode of verifyCodeList) { + const sysVerifyGetCodeVo: SysVerifyGetCodeVo = new SysVerifyGetCodeVo(); + sysVerifyGetCodeVo.setCode(verifyCode); + sysVerifyGetCodeVo.setQrcode(QrcodeUtils.qrcode(param.siteId(), "h5", verifyCode, "", null)); + if (param.getNeedBarcode() == 1){ + const barcode: string = null; + try { + const qrcodeDir: string = this.config.get('webRootDownResource') + "upload/temp/"; + const barcodePath: string = BarcodeUtils.generateBarcode(verifyCode, qrcodeDir); + barcode = ImageUtils.imageToBase64(barcodePath); + } catch (Exception e) { + log.error("条形码生成失败:{}", e.getMessage(), e); + throw new BadRequestException("条形码生成失败"); + } + sysVerifyGetCodeVo.setBarcode(barcode); + } + sysVerifyGetCodeVoList.add(sysVerifyGetCodeVo); + } + return sysVerifyGetCodeVoList; } /** * checkVerifier */ async checkVerifier(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const queryWrapper: LambdaQueryWrapper = new LambdaQueryWrapper(); + queryWrapper.eq(Verifier::getMemberId, RequestUtils.memberId()); + queryWrapper.eq(Verifier::getSiteId, RequestUtils.siteId()); + return verifierMapper.exists(queryWrapper); } /** * records */ async records(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const page: number = pageParam.getPage(); + const limit: number = pageParam.getLimit(); + + const queryWrapper: QueryWrapper = new QueryWrapper(); + queryWrapper.eq("site_id", param.siteId()); + queryWrapper.eq("verifier_member_id", param.memberId()); + + if (StrUtil.isNotEmpty(param.getCode())) { + queryWrapper.eq("code", param.getCode()); + } + if (StrUtil.isNotEmpty(param.getType())) { + queryWrapper.eq("type", param.getType()); + } + if (ObjectUtil.isNotEmpty(param.getCreateTime())) { + QueryMapperUtils.buildByTime(queryWrapper, "create_time", param.getCreateTime()); + } + if (StrUtil.isNotEmpty(param.getRelateTag())) { + queryWrapper.eq("relate_tag", param.getRelateTag()); + } + if (StrUtil.isNotEmpty(param.getKeyword())) { + queryWrapper.eq("keyword", param.getKeyword()); + } + queryWrapper.orderByDesc(Arrays.asList("create_time")); + + const iPage: IPage = this.verifyMapper.selectPage(new Page<>(page, limit), queryWrapper); + const dataList: SysVerifyRecordsVo[] = CollectUtils.convert(iPage.getRecords(), SysVerifyRecordsVo.class); + + if (dataList.size() > 0) { + // 以下代码块=====>用以填充SysVerifyRecordsVo类对象的:nickname, mobile, headimg属性 + // 根据集合ID主键索引查询到对象列表 + const withQueryWrapper: QueryWrapper = new QueryWrapper(); + withQueryWrapper.select("member_id, nickname, mobile, headimg"); + const memberIdList: number[] = CollectBuildUtils.getKeyValueList(dataList, "verifierMemberId"); + withQueryWrapper.in("member_id", memberIdList); + const memberList: Member[] = memberMapper.selectList(withQueryWrapper); + // 先将数据分组,然后放入结果集 + const memberMap: Record = ObjectGroupUtils.group(memberList, "memberId"); + dataList.stream().forEach(bean => { + const member: Member = memberMap.get(bean.getVerifierMemberId()); + if (member != null) { + const membervo: MemberBriefInfoVo = new MemberBriefInfoVo(); + BeanUtils.copyProperties(member, membervo); + bean.setMember(membervo); + } + }); + } + return PageResult.build(page, limit, iPage.getTotal()).setData(dataList); } /** * records2 */ async records2(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const page: number = pageParam.getPage(); + const limit: number = pageParam.getLimit(); + const mpjQueryWrapper: MPJQueryWrapper = new MPJQueryWrapper<>(); + mpjQueryWrapper.select("t.*"); + mpjQueryWrapper.setAlias("t"); + mpjQueryWrapper.innerJoin("?_site_group nsg ON ns.group_id = nsg.group_id"); + mpjQueryWrapper.eq("site_id", param.siteId()); + mpjQueryWrapper.eq("verifier_member_id", param.memberId()); + const iPage: IPage = memberMapper.selectJoinPage(new Page<>(page, limit), SysVerifyRecordsVo.class, mpjQueryWrapper ); + return PageResult.build(page, limit, iPage.getTotal()).setData(iPage.getRecords()); } /** * detail */ async detail(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const verifyQueryWrapper: QueryWrapper = new QueryWrapper(); + verifyQueryWrapper.eq("site_id", param.siteId()); + verifyQueryWrapper.eq("verifier_member_id", param.memberId()); + verifyQueryWrapper.eq("code", param.getCode()); + const verify: Verify = this.verifyMapper.selectOne(verifyQueryWrapper); + const sysVerifyDetailVo: SysVerifyDetailVo = new SysVerifyDetailVo(); + if (verify != null) { + BeanUtils.copyProperties(verify, sysVerifyDetailVo); + const memberQueryWrapper: QueryWrapper = new QueryWrapper(); + memberQueryWrapper.select("member_id, nickname, mobile, headimg"); + memberQueryWrapper.eq("member_id", param.memberId()); + const member: Member = this.memberMapper.selectOne(memberQueryWrapper); + if (member != null) { + const membervo: MemberBriefInfoVo = new MemberBriefInfoVo(); + BeanUtils.copyProperties(member, membervo); + sysVerifyDetailVo.setMember(membervo); + } + } + + //处理时间的问题 解析JSON字符串 + const jsonObject: Record = JSONUtil.parseObj(sysVerifyDetailVo.getValue().toString()); + // 获取content下的diy数组 + const diyArray: JSONArray = jsonObject.getJSONObject("content").getJSONArray("diy"); + // 遍历diy数组 + for (const i of number = 0; i < diyArray.size(); i++) { + const diyItem: Record = diyArray.getJSONObject(i); + const listArray: JSONArray = diyItem.getJSONArray("list"); + + // 遍历list数组 + for (const j of number = 0; j < listArray.size(); j++) { + const listItem: Record = listArray.getJSONObject(j); + const title: string = listItem.getStr("title"); + + // 如果是支付时间,则转换格式 + if ("支付时间" === title) { + const timestamp: number = listItem.getLong("value"); + const timeStr: string = DateUtils.timestampToString(timestamp); + listItem.put("value", timeStr); + } + } + } + sysVerifyDetailVo.setValue(JSONUtil.toJsonStr(jsonObject)); + + return sysVerifyDetailVo; } /** * verifyCode */ async verifyCode(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + // 1、获取核销码数据 + const verifyMap: Record = this.getCodeData(param.getCode()); + // 检测站点数据 + if (verifyMap.get("site_id") == null || !verifyMap.get("site_id") === param.siteId()) { + // 核销码已过期 + throw new Error("当前核销码已核销或已失效"); + } + // 检测核销员身份 + const queryWrapper: LambdaQueryWrapper = new LambdaQueryWrapper(); + queryWrapper.eq(Verifier::getMemberId, param.memberId()); + queryWrapper.eq(Verifier::getSiteId, param.siteId()); + const verifier: boolean = verifierMapper.exists(queryWrapper); + if (!verifier) { + throw new Error("核销员不存在"); + } + // 核销操作 + const verifyDataMap: Record = {}; + verifyDataMap.put("site_id", verifyMap.get("site_id")); + verifyDataMap.put("code", param.getCode()); + verifyDataMap.put("body", verifyMap.get("body")); + verifyDataMap.put("data", verifyMap.get("data")); + verifyDataMap.put("value", verifyMap.get("value")); + verifyDataMap.put("type", verifyMap.get("type")); + verifyDataMap.put("relate_tag", verifyMap.get("relate_tag")); + verifyDataMap.put("create_time", DateUtils.currTime()); + verifyDataMap.put("verifier_member_id", param.memberId()); + // 核销 + VerifyEventDefiner.const verifyEvent: VerifyEvent = new VerifyEventDefiner.VerifyEvent(); + verifyEvent.setSiteId(param.siteId()); + verifyEvent.build(verifyDataMap); + EventAndSubscribeOfPublisher.publishAndCallback(verifyEvent); + + // 添加核销记录 + const model: Verify = new Verify(); + BeanUtils.copyProperties(verifyEvent, model); + model.setData(JSONUtil.parseObj(verifyEvent.getData()).toString()); + verifyMapper.insert(model); + + // 核销码失效 + this.clearCode(param.getCode()); + return true; } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/sys/impl/task-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/sys/impl/task-service-impl.service.ts index 51a182cd..53622f69 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/sys/impl/task-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/sys/impl/task-service-impl.service.ts @@ -14,15 +14,39 @@ export class TaskServiceImplService { * getGrowthTask */ async getGrowthTask(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const config: Record = coreMemberConfigService.getGrowthRuleConfig(RequestUtils.siteId()); + if (config != null) { + config = coreMemberService.getGrowthRuleContent(RequestUtils.siteId(), config, "task"); + + const filteredObject: Record = new Record(); + for (const key of config.keySet()) { + const value: Record = config.getJSONObject(key); + if (value.get("content") != null) { + filteredObject.set(key, value); + } + } + return filteredObject; + } + return null; } /** * getPointTask */ async getPointTask(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const config: Record = coreMemberConfigService.getPointRuleConfig(RequestUtils.siteId()).getJSONObject("grant"); + if (config != null) { + config = coreMemberService.getPointGrantRuleContent(RequestUtils.siteId(), config, "task"); + + const filteredObject: Record = new Record(); + for (const key of config.keySet()) { + const value: Record = config.getJSONObject(key); + if (value.get("content") != null) { + filteredObject.set(key, value); + } + } + return filteredObject; + } + return new Record(); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/sys/impl/upload-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/sys/impl/upload-service-impl.service.ts index 5d6c5385..10af7e90 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/sys/impl/upload-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/sys/impl/upload-service-impl.service.ts @@ -14,15 +14,21 @@ export class UploadServiceImplService { * image */ async image(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + param.setSiteId(RequestUtils.siteId()); + param.setIsAttachment(0); + param.setAttType("image"); + param.setDir("attachment/image/" + param.getSiteId() + "/" + DateFormatUtils.getUploadFormat() + "/"); + return coreUploadService.upload(param); } /** * video */ async video(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + param.setSiteId(RequestUtils.siteId()); + param.setIsAttachment(0); + param.setAttType("video"); + param.setDir("attachment/video/" + param.getSiteId() + "/" + DateFormatUtils.getUploadFormat() + "/"); + return coreUploadService.upload(param); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/weapp/impl/serve-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/weapp/impl/serve-service-impl.service.ts index c2583d69..9626742b 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/weapp/impl/serve-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/weapp/impl/serve-service-impl.service.ts @@ -14,7 +14,54 @@ export class ServeServiceImplService { * service */ async service(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + response.setContentType("text/html;charset=utf-8"); + response.setStatus(HttpServletResponse.SC_OK); + + try { + const signature: string = request.getParameter("signature"); + const nonce: string = request.getParameter("nonce"); + const timestamp: string = request.getParameter("timestamp"); + + const wxMaService: WxMaService = WechatUtils.miniapp(RequestUtils.siteId()); + if (!wxMaService.checkSignature(timestamp, nonce, signature)) { + response.getWriter().println("非法请求"); + return; + } + + // 说明是一个仅仅用来验证的请求,回显const echostr: echostr + String = request.getParameter("echostr"); + if (StringUtils.isNotBlank(echostr)) { + response.getWriter().println(echostr); + return; + } + + const encryptType: string = StringUtils.isBlank(request.getParameter("encrypt_type")) ? "raw" : request.getParameter("encrypt_type"); + + const inMessage: WxMaMessage = null; + + if ("raw" === encryptType) { + // 明文传输的消息 + inMessage = inMessage.fromXml(request.getInputStream()); + } else if ("aes" === encryptType) { + // 是aes加密的消息 + const msgSignature: string = request.getParameter("msg_signature"); + inMessage = WxMaMessage.fromEncryptedXml(request.getInputStream(), wxMaService.getWxMaConfig(), timestamp, nonce, msgSignature); + } else { + response.getWriter().println("不可识别的加密类型"); + return; + } + + const outMessage: WxMaXmlOutMessage = this.message(inMessage); + if (outMessage != null) { + if ("raw" === encryptType) { + response.getWriter().write(outMessage.toXml()); + } else if ("aes" === encryptType) { + response.getWriter().write(outMessage.toEncryptedXml(wxMaService.getWxMaConfig())); + } + return; + } + } catch (Exception e) { + e.printStackTrace(); + } } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/weapp/impl/weapp-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/weapp/impl/weapp-service-impl.service.ts index 7ec18fec..cdd71851 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/weapp/impl/weapp-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/weapp/impl/weapp-service-impl.service.ts @@ -14,47 +14,160 @@ export class WeappServiceImplService { * loginByCode */ async loginByCode(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + try { + const wxUser: WxMaJscode2SessionResult = WechatUtils.miniapp(RequestUtils.siteId()).getUserService().getSessionInfo(param.getCode()); + + const member: Member = memberMapper.selectOne(new QueryWrapper().eq("weapp_openid", wxUser.getOpenid()).eq("site_id", RequestUtils.siteId())); + if (ObjectUtil.isNotNull(member)) { + const vo: LoginVo = loginService.login(member); + return vo; + } + if (ObjectUtil.isNotEmpty(wxUser.getUnionid())) { + const unionidMember: Member = memberMapper.selectOne(new QueryWrapper().eq("wx_unionid", wxUser.getUnionid()).eq("site_id", RequestUtils.siteId())); + if (ObjectUtil.isNotNull(unionidMember)) { + const vo: LoginVo = loginService.login(unionidMember); + return vo; + } + } + + const loginVo: LoginVo = new LoginVo(); + loginVo.setOpenid(wxUser.getOpenid()); + loginVo.setUnionid(ObjectUtil.defaultIfNull(wxUser.getUnionid(), "")); + + const config: LoginConfigVo = coreMemberConfigService.getLoginConfig(RequestUtils.siteId()); + + const registerParam: AuthRegisterParam = new AuthRegisterParam(); + registerParam.setOpenid(wxUser.getOpenid()); + registerParam.setUnionid(ObjectUtil.defaultIfNull(wxUser.getUnionid(), "")); + registerParam.setPid(param.getPid()); + registerParam.setHeadimg(param.getHeadimg()); + registerParam.setNickname(param.getNickname()); + registerParam.setMobile(param.getMobile()); + registerParam.setMobileCode(param.getMobileCode()); + + // 开启自动注册会员 + if (config.getIsAuthRegister() == 1) { + if (config.getIsBindMobile() == 1 && config.getIsForceAccessUserInfo() == 1) { + if (ObjectUtil.isNotEmpty(param.getMobile()) && ObjectUtil.isNotEmpty(param.getHeadimg()) && ObjectUtil.isNotEmpty(param.getNickname())) { + return this.register(registerParam); + } + } else if (config.getIsForceAccessUserInfo() == 1) { + if (ObjectUtil.isNotEmpty(param.getHeadimg()) && ObjectUtil.isNotEmpty(param.getNickname())) { + return this.register(registerParam); + } + } else if (config.getIsBindMobile() == 1) { + if (ObjectUtil.isNotEmpty(param.getMobile()) || ObjectUtil.isNotEmpty(param.getMobileCode())) { + return this.register(registerParam); + } + } else { + return this.register(registerParam); + } + } else { + // 关闭自动注册,但是开启了强制绑定手机号,必须获取手机号才能进行注册 + if (config.getIsBindMobile() == 1 || config.getIsMobile() == 1) { + if (ObjectUtil.isNotEmpty(param.getMobile()) || ObjectUtil.isNotEmpty(param.getMobileCode())) { + return this.register(registerParam); + } + } + } + + return loginVo; + } catch (Exception e) { + throw new BadRequestException(e.getMessage()); + } } /** * register */ async register(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + if (param.getOpenid().isEmpty()) throw new BadRequestException("openid不能为空"); + try { + const member: Member = memberMapper.selectOne(new QueryWrapper().eq("weapp_openid", param.getOpenid()).eq("site_id", RequestUtils.siteId())); + if (ObjectUtil.isNotNull(member)) throw new BadRequestException("账号已存在"); + + if (!param.getUnionid().isEmpty()) { + const unionidMember: Member = memberMapper.selectOne(new QueryWrapper().eq("wx_unionid", param.getUnionid()).eq("site_id", RequestUtils.siteId())); + if (ObjectUtil.isNotNull(unionidMember)) throw new BadRequestException("账号已存在"); + } + + const config: LoginConfigVo = coreMemberConfigService.getLoginConfig(RequestUtils.siteId()); + if (config.getIsBindMobile() == 1) { + if (!param.getMobile().isEmpty() || !param.getMobileCode().isEmpty()) { + if (!param.getMobileCode().isEmpty()) { + const phoneInfo: WxMaPhoneNumberInfo = WechatUtils.miniapp(RequestUtils.siteId()).getUserService().getPhoneNoInfo(param.getMobileCode()); + param.setMobile(phoneInfo.getPurePhoneNumber()); + } + } else { + throw new BadRequestException("手机号不能为空"); + } + } + + const registerMember: Member = new Member(); + registerMember.setWeappOpenid(param.getOpenid()); + registerMember.setMobile(param.getMobile()); + registerMember.setWxUnionid(param.getUnionid()); + registerMember.setPid(param.getPid()); + registerMember.setNickname(param.getNickname()); + registerMember.setHeadimg(param.getHeadimg()); + return registerService.register(registerMember); + } catch (Exception e) { + throw new BadRequestException(e.getMessage()); + } } /** * updateOpenid */ async updateOpenid(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + try { + const wxUser: WxMaJscode2SessionResult = WechatUtils.miniapp(RequestUtils.siteId()).getUserService().getSessionInfo(param.getCode()); + + const member: Member = memberMapper.selectOne(new QueryWrapper().eq("wx_openid", wxUser.getOpenid()).eq("site_id", RequestUtils.siteId())); + if (ObjectUtil.isNotNull(member)) throw new BadRequestException("账号已存在"); + + const updateMember: Member = new Member(); + updateMember.setMemberId(RequestUtils.memberId()); + updateMember.setWxOpenid(wxUser.getOpenid()); + this.memberMapper.updateById(updateMember); + } catch (Exception e) { + throw new BadRequestException(e.getMessage()); + } } /** * subscribeMessage */ async subscribeMessage(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return sysNoticeMapper.selectList(new QueryWrapper() + .select("weapp_template_id") + .in("`key`", keys.split(",")) + .eq("is_weapp", 1) + .eq("site_id", RequestUtils.siteId()) + .ne("weapp_template_id", "") + ).stream().map(item => item.getWeappTemplateId()).collect(Collectors.toList()); } /** * getIsTradeManaged */ async getIsTradeManaged(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return coreWeappDeliveryService.getIsTradeManaged(RequestUtils.siteId()); } /** * getMsgJumpPath */ async getMsgJumpPath(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const pay: Pay = payMapper.selectOne(new QueryWrapper().eq("out_trade_no", outTradeNo)); + if (pay == null) return null; + + WapOrderDetailPathDefiner.const event: WapOrderDetailPathEvent = new WapOrderDetailPathDefiner.WapOrderDetailPathEvent(pay); + const eventData: WapOrderDetailPathDefiner.WapOrderDetailPathResult[] = EventAndSubscribeOfPublisher.publishAndCallback(event); + + if (ObjectUtil.isNotEmpty(eventData)) { + return eventData.get(0); + } + return null; } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/wechat/impl/serve-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/wechat/impl/serve-service-impl.service.ts index c2583d69..e2cda7cd 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/wechat/impl/serve-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/wechat/impl/serve-service-impl.service.ts @@ -14,7 +14,55 @@ export class ServeServiceImplService { * service */ async service(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + response.setContentType("text/html;charset=utf-8"); + response.setStatus(HttpServletResponse.SC_OK); + + try { + const signature: string = request.getParameter("signature"); + const nonce: string = request.getParameter("nonce"); + const timestamp: string = request.getParameter("timestamp"); + + // 消息签名不正确,说明不是公众平台发过来的消息 + const wxMpService: WxMpService = WechatUtils.mp(RequestUtils.siteId()); + if (!wxMpService.checkSignature(timestamp, nonce, signature)) { + response.getWriter().println("非法请求"); + return; + } + + // 说明是一个仅仅用来验证的请求,回显const echostr: echostr + String = request.getParameter("echostr"); + if (StringUtils.isNotBlank(echostr)) { + response.getWriter().println(echostr); + return; + } + + const encryptType: string = StringUtils.isBlank(request.getParameter("encrypt_type")) ? "raw" : request.getParameter("encrypt_type"); + + const inMessage: WxMpXmlMessage = null; + + if ("raw" === encryptType) { + // 明文传输的消息 + inMessage = WxMpXmlMessage.fromXml(request.getInputStream()); + } else if ("aes" === encryptType) { + // 是aes加密的消息 + const msgSignature: string = request.getParameter("msg_signature"); + inMessage = WxMpXmlMessage.fromEncryptedXml(request.getInputStream(), wxMpService.getWxMpConfigStorage(), timestamp, nonce, msgSignature); + } else { + response.getWriter().println("不可识别的加密类型"); + return; + } + + const outMessage: WxMpXmlOutMessage = this.message(inMessage); + if (outMessage != null) { + if ("raw" === encryptType) { + response.getWriter().write(outMessage.toXml()); + } else if ("aes" === encryptType) { + response.getWriter().write(outMessage.toEncryptedXml(wxMpService.getWxMpConfigStorage())); + } + return; + } + } catch (Exception e) { + e.printStackTrace(); + } } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/wechat/impl/wechat-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/wechat/impl/wechat-service-impl.service.ts index 1bff9fb9..02312cd9 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/wechat/impl/wechat-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/api/wechat/impl/wechat-service-impl.service.ts @@ -14,71 +14,164 @@ export class WechatServiceImplService { * setCoreScanService */ async setCoreScanService(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + this.coreScanService = coreScanService; } /** * getCodeUrl */ async getCodeUrl(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const authorizationUrl: string = WechatUtils.mp(RequestUtils.siteId()).getOAuth2Service().buildAuthorizationUrl(url, scopes, ""); + const vo: WechatCodeUrlVo = new WechatCodeUrlVo(); + vo.setUrl(authorizationUrl); + return vo; } /** * loginByCode */ async loginByCode(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + try { + const wxOAuth2AccessToken: WxOAuth2AccessToken = WechatUtils.mp(RequestUtils.siteId()).getOAuth2Service().getAccessToken(param.getCode()); + const wxUser: WxOAuth2UserInfo = WechatUtils.mp(RequestUtils.siteId()).getOAuth2Service().getUserInfo(wxOAuth2AccessToken, null); + + return this.login( + ObjectUtil.defaultIfNull(wxUser.getOpenid(), ""), + ObjectUtil.defaultIfNull(wxUser.getUnionId(), ""), + ObjectUtil.defaultIfNull(wxUser.getNickname(), ""), + ObjectUtil.defaultIfNull(wxUser.getHeadImgUrl(), ""), + param.getPid() + ); + } catch (Exception e) { + throw new BadRequestException(e.getMessage()); + } } /** * wechatLogin */ async wechatLogin(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const data: Record = JSONUtil.parseObj(param.getData()); + + return this.login( + data.getStr("openid", ""), + data.getStr("unionid", ""), + data.getStr("nickname", ""), + data.getStr("avatar", ""), + param.getPid() + ); } /** * register */ async register(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + if (param.getOpenid().isEmpty()) throw new BadRequestException("openid不能为空"); + try { + const member: Member = memberMapper.selectOne(new QueryWrapper().eq("wx_openid", param.getOpenid()).eq("site_id", RequestUtils.siteId())); + if (ObjectUtil.isNotNull(member)) throw new BadRequestException("账号已存在"); + + if (!param.getUnionid().isEmpty()) { + const unionidMember: Member = memberMapper.selectOne(new QueryWrapper().eq("wx_unionid", param.getUnionid()).eq("site_id", RequestUtils.siteId())); + if (ObjectUtil.isNotNull(unionidMember)) throw new BadRequestException("账号已存在"); + } + + const config: LoginConfigVo = coreMemberConfigService.getLoginConfig(RequestUtils.siteId()); + if (config.getIsBindMobile() == 1) { + if (param.getMobile().isEmpty()) throw new BadRequestException("手机号不能为空"); + registerService.checkMobileCode(param.getMobile(), param.getMobileKey(), param.getMobileCode()); + } + + const registerMember: Member = new Member(); + registerMember.setWxOpenid(param.getOpenid()); + registerMember.setMobile(param.getMobile()); + registerMember.setWxUnionid(param.getUnionid()); + registerMember.setPid(param.getPid()); + return registerService.register(registerMember); + } catch (Exception e) { + throw new BadRequestException(e.getMessage()); + } } /** * sync */ async sync(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + try { + const wxOAuth2AccessToken: WxOAuth2AccessToken = WechatUtils.mp(RequestUtils.siteId()).getOAuth2Service().getAccessToken(param.getCode()); + const wxUser: WxOAuth2UserInfo = WechatUtils.mp(RequestUtils.siteId()).getOAuth2Service().getUserInfo(wxOAuth2AccessToken, null); + + const member: Member = new Member(); + member.setMemberId(RequestUtils.memberId()); + member.setNickname(ObjectUtil.defaultIfNull(wxUser.getNickname(), "")); + member.setHeadimg(ObjectUtil.defaultIfNull(wxUser.getHeadImgUrl(), "")); + this.memberMapper.updateById(member); + } catch (Exception e) { + throw new BadRequestException(e.getMessage()); + } } /** * getWechatUser */ async getWechatUser(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + try { + const vo: WechatUserInfoVo = new WechatUserInfoVo(); + + const mp: WxMpService = WechatUtils.mp(RequestUtils.siteId()); + + const wxOAuth2AccessToken: WxOAuth2AccessToken = mp.getOAuth2Service().getAccessToken(param.getCode()); + if (wxOAuth2AccessToken.getScope() === "snsapi_base") { + vo.setOpenid(ObjectUtil.defaultIfNull(wxOAuth2AccessToken.getOpenId(), "")); + } else { + const userInfo: WxOAuth2UserInfo = mp.getOAuth2Service().getUserInfo(wxOAuth2AccessToken, null); + vo.setOpenid(ObjectUtil.defaultIfNull(userInfo.getOpenid(), "")); + vo.setUnionid(ObjectUtil.defaultIfNull(userInfo.getUnionId(), "")); + vo.setNickname(ObjectUtil.defaultIfNull(userInfo.getNickname(), "")); + vo.setAvatar(ObjectUtil.defaultIfNull(userInfo.getHeadImgUrl(), "")); + } + return vo; + } catch (Exception e) { + throw new BadRequestException(e.getMessage()); + } } /** * scanLogin */ async scanLogin(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + try { + const key: string = coreScanService.scan(RequestUtils.siteId(), "wechat_login", new Record().set("channel", RequestUtils.channel()), 300); + const ticket: WxMpQrCodeTicket = WechatUtils.mp(RequestUtils.siteId()).getQrcodeService().qrCodeCreateTmpTicket(key, 300); + const url: string = WechatUtils.mp(RequestUtils.siteId()).getQrcodeService().qrCodePictureUrl(ticket.getTicket()); + + const vo: WechatScanLoginVo = new WechatScanLoginVo(); + vo.setKey(key); + vo.setUrl(url); + + return vo; + } catch (Exception e) { + throw new BadRequestException(e.getMessage()); + } } /** * updateOpenid */ async updateOpenid(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + try { + const wxOAuth2AccessToken: WxOAuth2AccessToken = WechatUtils.mp(RequestUtils.siteId()).getOAuth2Service().getAccessToken(param.getCode()); + const wxUser: WxOAuth2UserInfo = WechatUtils.mp(RequestUtils.siteId()).getOAuth2Service().getUserInfo(wxOAuth2AccessToken, null); + + const member: Member = memberMapper.selectOne(new QueryWrapper().eq("wx_openid", wxUser.getOpenid()).eq("site_id", RequestUtils.siteId())); + if (ObjectUtil.isNotNull(member)) throw new BadRequestException("账号已存在"); + + const updateMember: Member = new Member(); + updateMember.setMemberId(RequestUtils.memberId()); + updateMember.setWxOpenid(wxUser.getOpenid()); + this.memberMapper.updateById(updateMember); + } catch (Exception e) { + throw new BadRequestException(e.getMessage()); + } } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/cached-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/cached-service-impl.service.ts index e5caf18a..4aa02c1b 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/cached-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/cached-service-impl.service.ts @@ -14,55 +14,67 @@ export class CachedServiceImplService { * getCacheOperator */ async getCacheOperator(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return cached; } /** * findUseCacheById */ async findUseCacheById(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const target: T = (T) cached.tag(CacheTag.key(tClass)).get(String.valueOf(id)); + if (target == null) { + target = super.getById(id); + if (target != null) { + cached.tag(CacheTag.key(tClass)).put(String.valueOf(id), target); + } + } + return target; } /** * refreshCacheById */ async refreshCacheById(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const target: T = super.getById(id); + if (target != null) { + cached.tag(CacheTag.key(tClass)).put(String.valueOf(id), target); + } + return target; } /** * refreshCacheByIds */ async refreshCacheByIds(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + for (const id of ids) { + this.refreshCacheById(tClass, id); + } } /** * removeCacheById */ async removeCacheById(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return; + const target: T = (T) cached.tag(CacheTag.key(tClass)).get(String.valueOf(id)); + if (target != null) { + cached.tag(CacheTag.key(tClass)).remove(String.valueOf(id)); + } + return target; } /** * removeCacheByIds */ async removeCacheByIds(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return; + for (const id of ids) { + this.removeCacheById(tClass, id); + } } /** * clearCache */ async clearCache(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + cached.tag(CacheTag.key(tClass)).clear(); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/addon/impl/core-addon-install-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/addon/impl/core-addon-install-service-impl.service.ts index 074cc330..68cc429d 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/addon/impl/core-addon-install-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/addon/impl/core-addon-install-service-impl.service.ts @@ -14,63 +14,204 @@ export class CoreAddonInstallServiceImplService { * installCheck */ async installCheck(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + this.installCheck = true; + const checkResult: Record = new Record(); + const rootPath: string = ""; + const runtimePath: string = ""; + const readableDir: JSONArray = new JSONArray(); + const writeDir: JSONArray = new JSONArray(); + + if (this.config.get('envType') === "dev") { + rootPath = this.config.get('projectRoot') + "/"; + runtimePath = rootPath; + + readableDir.put(new Record().set("dir", rootPath + "niucloud-addon").set("status", true)); + writeDir.put(new Record().set("dir", rootPath + "niucloud-addon").set("status", true)); + readableDir.put(new Record().set("dir", rootPath + "webroot").set("status", true)); + writeDir.put(new Record().set("dir", rootPath + "webroot").set("status", true)); + } else { + rootPath = this.config.get('webRoot') + "/"; + runtimePath = rootPath + "runtime/"; + + readableDir.put(new Record().set("dir", runtimePath).set("status", true)); + writeDir.put(new Record().set("dir", runtimePath).set("status", true)); + } + + readableDir.put(new Record().set("dir", runtimePath + "admin").set("status", true)); + readableDir.put(new Record().set("dir", runtimePath + "uni-app").set("status", true)); + readableDir.put(new Record().set("dir", runtimePath + "web").set("status", true)); + + writeDir.put(new Record().set("dir", runtimePath + "admin").set("status", true)); + writeDir.put(new Record().set("dir", runtimePath + "uni-app").set("status", true)); + writeDir.put(new Record().set("dir", runtimePath + "web").set("status", true)); + + for (const i of number = 0; i < readableDir.size(); i++) { + const dir: Record = readableDir.getJSONObject(i); + dir.set("status", dir.getStr("dir").canRead()); + dir.set("dir", dir.getStr("dir").replace(rootPath, "")); + readableDir.set(i, dir); + if (!dir.getBool("status")) this.installCheck = false; + } + + for (const i of number = 0; i < writeDir.size(); i++) { + const dir: Record = writeDir.getJSONObject(i); + dir.set("status", dir.getStr("dir").canWrite()); + dir.set("dir", dir.getStr("dir").replace(rootPath, "")); + writeDir.set(i, dir); + if (!dir.getBool("status")) this.installCheck = false; + } + + checkResult.put("is_pass", this.installCheck); + checkResult.put("dir", new Record().set("is_readable", readableDir).set("is_write", writeDir)); + return checkResult; } /** * install */ async install(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + if (!this.installCheck) { + throw new BadRequestException("安装校验未通过"); + } + const addonObject: Addon = coreAddonService.getInfoByKey(addon); + if (ObjectUtil.isNotEmpty(addonObject)) { + throw new BadRequestException("当前插件已安装,不能重复安装"); + } + if (ObjectUtil.isNotEmpty(this.getInstallTask())) { + throw new BadRequestException("有正在安装中的插件"); + } + this.installTask.put("mode", mode); + this.installTask.put("addon", addon); + this.installTask.put("status", "installing"); + + try { + this.installDir(); + this.installDepend(); + this.installUniapp(addon); + if (mode === "local") { + this.handleAddonInstall(); + } else { + this.cloudInstall(); + } + return installTask; + } catch (Exception e) { + e.printStackTrace(); + this.installExceptionHandle(); + this.cancleInstall(); + throw new BadRequestException(e.getMessage()); + } } /** * getInstallTask */ async getInstallTask(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + if (this.installTask.length === 0) return null; + return this.installTask; } /** * cancleInstall */ async cancleInstall(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + if (ObjectUtil.isNotEmpty(this.getInstallTask())) this.installTask.clear(); + this.installStep.clear(); } /** * uninstall */ async uninstall(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + if (!ObjectUtil.isNotEmpty(coreAddonService.getInfoByKey(addon))) { + throw new BadRequestException("当前插件未安装,不能进行卸载操作"); + } + + // 卸载前先打包 + if (this.config.get('runActive').equalsIgnoreCase("dev")) { + addonDevelopBuildService.build(addon); + } + + try { + // 卸载菜单 + coreMenuService.deleteMenu(addon, true); + // 执行卸载sql + this.uninstallSql(addon); + // 处理uniapp + addonInstallTools.uninstallUniapp(addon); + // 移除定时任务 + coreScheduleService.uninstallAddonSchedule(addon); + // 删除addon表插件 + addonMapper.delete(new QueryWrapper().eq("`key`", addon)); + // 执行卸载其它 + AddonInstallJavaTools.uninstallExec(this, addon); + // 是否需要重启服务 + const data: Record = new Record(); + if (!this.config.get('runActive').equalsIgnoreCase("dev")) { + data.put("is_need_restart", 1); + } + return data; + } catch (Exception e) { + throw new BadRequestException(e.getMessage()); + } } /** * uninstallCheck */ async uninstallCheck(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const checkResult: Record = new Record(); + checkResult.put("is_pass", true); + return checkResult; } /** * installResult */ async installResult(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + this.installTask = new Record(); + this.installTask.put("mode", "local"); + this.installTask.put("addon", addon); + if (result) { + this.installTask.put("status", "success"); + const tips: string[] = AddonUpgradeHelper.getAddonInfo(); + this.installTask.put("tips", tips); + this.installCheck = false; + log.warn("安装成功..........................................."); + } else { + this.installTask.put("status", "fail"); + this.installTask.put("failReason", "jar包加载错误."); + const tips: string[] = AddonUpgradeHelper.getAddonInfo(); + this.installTask.put("tips", tips); + log.warn("执行回滚操作<---------------------begin--------------------->"); + if (!this.config.get('runActive').equalsIgnoreCase("dev")) { + // 生产环境进一步卸载 + this.rollback(addon); + this.installCheck = false; + } + log.warn("执行回滚操作<---------------------ended--------------------->"); + } } /** * cloudInstallLog */ async cloudInstallLog(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const log: Record = cloudBuildService.getBuildLog("install"); + if (log != null) { + const data: JSONArray = log.getByPath("data.0", JSONArray.class); + if (data.size() > 0) { + const last: Record = data.getJSONObject(data.size() - 1); + if (last.getInt("code", 0) === 0) { + this.installTask.put("status", "fail"); + this.installTask.put("failReason", last.getStr("msg")); + cloudBuildService.clearBuildTask(); + return log; + } + if (last.getInt("percent", 0) === 100 && last.getStr("action", "") === "build_success") { + this.handleAddonInstall(); + } + } + } + return log; } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/addon/impl/core-addon-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/addon/impl/core-addon-service-impl.service.ts index 2bda64ee..05e281d6 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/addon/impl/core-addon-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/addon/impl/core-addon-service-impl.service.ts @@ -14,31 +14,52 @@ export class CoreAddonServiceImplService { * getInfoByKey */ async getInfoByKey(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return addonMapper.selectOne(new MPJQueryWrapper().select("*").eq("`key`", key)); } /** * getLocalAddonCount */ async getLocalAddonCount(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const localAddonCount: number = 0; + try { + // 获取本地所有的插件 + const localAddons: string[] = Files.list(Paths.get(this.config.get('webRootDownAddon'))) + .map(path => path.toFile()) + .filter(file => fs.lstatSync(file).isDirectory()) + .collect(Collectors.toList()); + + for (const file of localAddons) { + if (file, "info.json".exists()) { + localAddonCount++; + } + } + } catch (Exception e) { + } + return localAddonCount; } /** * getAddonCountByCondition */ async getAddonCountByCondition(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + const addonCount: number = addonMapper.selectCount(queryWrapper); + return addonCount.intValue(); } /** * set */ async set(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: Addon = addonMapper.selectOne(new QueryWrapper().eq("`key`", addon.getKey())); + + if (model != null) { + addon.setUpdateTime(System.currentTimeMillis() / 1000); + addonMapper.update(addon, new QueryWrapper().eq("`key`", addon.getKey())); + } else { + addon.setInstallTime(System.currentTimeMillis() / 1000); + addonMapper.insert(addon); + } } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/aliapp/impl/core-aliapp-config-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/aliapp/impl/core-aliapp-config-service-impl.service.ts index 5faaedec..7863cad4 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/aliapp/impl/core-aliapp-config-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/aliapp/impl/core-aliapp-config-service-impl.service.ts @@ -14,15 +14,20 @@ export class CoreAliappConfigServiceImplService { * getAliappConfig */ async getAliappConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const coreSysConfigVo: CoreSysConfigVo = coreConfigService.getConfig(siteId, "aliapp"); + const vo: AliappConfigVo = new AliappConfigVo(); + if(ObjectUtil.isNotNull(coreSysConfigVo.getValueJson())) + { + vo = JSONUtil.toBean(coreSysConfigVo.getValueJson(), AliappConfigVo.class); + } + return vo; } /** * setAliappConfig */ async setAliappConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const json: Record = JSONUtil.parseObj(aliappConfigParam); + coreConfigService.setConfig(siteId, "aliapp", json); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/app/impl/core-app-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/app/impl/core-app-service-impl.service.ts index c57397eb..07aa735c 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/app/impl/core-app-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/app/impl/core-app-service-impl.service.ts @@ -14,7 +14,12 @@ export class CoreAppServiceImplService { * initAppBasic */ async initAppBasic(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + log.info("initAppBasic() begin"); + // 1、初始化系统数据库schema + + // 2、初始化系统菜单 + + // 3、初始化系统默认用户和角色 + log.info("initAppBasic() ended"); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/app/impl/core-async-task-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/app/impl/core-async-task-service-impl.service.ts index 98b6ca1e..189e5ad6 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/app/impl/core-async-task-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/app/impl/core-async-task-service-impl.service.ts @@ -14,15 +14,27 @@ export class CoreAsyncTaskServiceImplService { * executeAsyncTask */ async executeAsyncTask(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + log.warn("我是异步执行的..............."); + try { + Thread.sleep(3 * 1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + log.warn("异步执行完成了..............."); + return Result.success(); } /** * execute */ async execute(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + log.warn("我是同步执行的..............."); + try { + Thread.sleep(3 * 1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + log.warn("同步执行完成了..............."); + return Result.success(); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/app/impl/core-queue-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/app/impl/core-queue-service-impl.service.ts index aba14d97..363be263 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/app/impl/core-queue-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/app/impl/core-queue-service-impl.service.ts @@ -14,15 +14,29 @@ export class CoreQueueServiceImplService { * exec */ async exec(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + console.log("target bean => " + taskArgument.getTargetBean()); + console.log("target method => " + taskArgument.getTargetMethod()); + console.log("method argument => " + taskArgument); + console.log("execute time => " + System.currentTimeMillis()); + try { + Thread.sleep(10 * 1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + return Result.success(); } /** * execUseQueue */ async execUseQueue(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const asyncTask: AsyncTask = AsyncTaskManager.build(ICoreQueueService.class) + .setMethodName("exec").addMethodParameter("param", coreQueueExecParam); + // const result: boolean = AsyncTaskManager.delayExecute(asyncTask); + const result: boolean = AsyncTaskQueueManager.delayExecute(asyncTask); + if (result) { + return Result.success(); + } + return Result.fail("队列已满."); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/captcha/impl/core-captcha-img-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/captcha/impl/core-captcha-img-service-impl.service.ts index 82f54bcb..de8442f1 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/captcha/impl/core-captcha-img-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/captcha/impl/core-captcha-img-service-impl.service.ts @@ -14,23 +14,47 @@ export class CoreCaptchaImgServiceImplService { * create */ async create(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const captchaVO: CaptchaVO = new CaptchaVO(); + captchaVO.setCaptchaType(captchaType); + const responseModel: ResponseModel = captchaService.get(captchaVO); + const coreCaptchaInfoVo: CoreCaptchaInfoVo = new CoreCaptchaInfoVo(); + if(responseModel.isSuccess()){ + const jsonObject: Record = JSONUtil.parseObj(responseModel.getRepData()); + coreCaptchaInfoVo.setToken(jsonObject.getStr("token")); + coreCaptchaInfoVo.setJigsawImageBase64(jsonObject.getStr("jigsawImageBase64")); + coreCaptchaInfoVo.setOriginalImageBase64(jsonObject.getStr("originalImageBase64")); + coreCaptchaInfoVo.setSecretKey(jsonObject.getStr("secretKey")); + }else{ + throw new UnauthorizedException(responseModel.getRepMsg()); + } + return coreCaptchaInfoVo; } /** * check */ async check(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + if(ObjectUtil.isNull(coreCaptchaValiDateParam.getCaptchaType()) || ObjectUtil.isNull(coreCaptchaValiDateParam.getCaptchaCode()) || ObjectUtil.isNull(coreCaptchaValiDateParam.getCaptchaKey())){ + throw new UnauthorizedException("缺少参数"); + } + const captchaVO: CaptchaVO = new CaptchaVO(); + captchaVO.setCaptchaType(coreCaptchaValiDateParam.getCaptchaType()); + captchaVO.setToken(coreCaptchaValiDateParam.getCaptchaKey()); + captchaVO.setPointJson(coreCaptchaValiDateParam.getCaptchaCode()); + const responseModel: ResponseModel = captchaService.check(captchaVO); + if(!responseModel.isSuccess()){ + throw new UnauthorizedException(responseModel.getRepMsg()); + } + return true; } /** * verification */ async verification(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const responseModel: ResponseModel = captchaService.verification(captchaVO); + if(!responseModel.isSuccess()){ + throw new UnauthorizedException(responseModel.getRepMsg()); + } } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/captcha/impl/default-captcha-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/captcha/impl/default-captcha-service-impl.service.ts index 564744f3..29b7a2f3 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/captcha/impl/default-captcha-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/captcha/impl/default-captcha-service-impl.service.ts @@ -14,47 +14,75 @@ export class DefaultCaptchaServiceImplService { * captchaType */ async captchaType(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return "redis"; } /** * init */ async init(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + for (const s of CaptchaServiceFactory.instances.keySet()) { + if (!this.captchaType() === s) { + this.getService(s).init(config); + } + } } /** * destroy */ async destroy(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + for (const s of CaptchaServiceFactory.instances.keySet()) { + if (!this.captchaType() === s) { + this.getService(s).destroy(config); + } + } } /** * get */ async get(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + if (captchaVO == null) { + return RepCodeEnum.NULL_ERROR.parseError("captchaVO"); + } else { + return (!captchaVO.getCaptchaType( || captchaVO.getCaptchaType(.trim() === '')) ? RepCodeEnum.NULL_ERROR.parseError("类型") : this.getService(captchaVO.getCaptchaType()).get(captchaVO); + } } /** * check */ async check(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + if (captchaVO == null) { + return RepCodeEnum.NULL_ERROR.parseError("captchaVO"); + } else if ((!captchaVO.getCaptchaType( || captchaVO.getCaptchaType(.trim() === ''))) { + return RepCodeEnum.NULL_ERROR.parseError("类型"); + } else { + return (!captchaVO.getToken( || captchaVO.getToken(.trim() === '')) ? RepCodeEnum.NULL_ERROR.parseError("token") : this.getService(captchaVO.getCaptchaType()).check(captchaVO); + } } /** * verification */ async verification(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + if (captchaVO == null) { + return RepCodeEnum.NULL_ERROR.parseError("captchaVO"); + } else if ((!captchaVO.getCaptchaVerification( || captchaVO.getCaptchaVerification(.trim() === ''))) { + return RepCodeEnum.NULL_ERROR.parseError("二次校验参数"); + } else { + try { + const codeKey: string = String.format(REDIS_SECOND_CAPTCHA_KEY, captchaVO.getCaptchaVerification()); + if (!CaptchaServiceFactory.getCache(cacheType).exists(codeKey)) { + return ResponseModel.errorMsg(RepCodeEnum.API_CAPTCHA_INVALID); + } + CaptchaServiceFactory.getCache(cacheType).delete(codeKey); + } catch (Exception var3) { + this.logger.error("验证码坐标解析失败", var3); + return ResponseModel.errorMsg(var3.getMessage()); + } + return ResponseModel.success(); + } } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/channel/impl/core-app-cloud-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/channel/impl/core-app-cloud-service-impl.service.ts index 20998969..6bedc5d0 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/channel/impl/core-app-cloud-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/channel/impl/core-app-cloud-service-impl.service.ts @@ -14,23 +14,159 @@ export class CoreAppCloudServiceImplService { * appCloudBuid */ async appCloudBuid(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const appConfig: AppConfigVo = coreAppService.getConfig(param.getSiteId()); + + if (ObjectUtil.isEmpty(appConfig.getAppName())) throw new BadRequestException("请先配置应用名称"); + if (ObjectUtil.isEmpty(appConfig.getUniAppId())) throw new BadRequestException("请先配置应用ID"); + if (ObjectUtil.isEmpty(appConfig.getAndroidAppKey())) throw new BadRequestException("请先配置应用密钥"); + if (ObjectUtil.isEmpty(appConfig.getApplicationId())) throw new BadRequestException("请先配置应用包名"); + + const taskKey: string = String.valueOf(System.currentTimeMillis() / 1000); + + const tempDir: string = this.config.get('webRootDownRuntime') + "app_build/" + taskKey + "/"; + const packageDir: string = tempDir + "package/"; + FileTools.createDirs(packageDir); + + handleUniapp(packageDir + "uni-app/", param, appConfig); + + const wapUrl: string = coreSysConfigService.getSceneDomain(param.getSiteId()).getWapUrl(); + + const mapConfig: SysMapVo = coreSysConfigService.getMap(param.getSiteId()); + + const build: Record = new Record(); + build.set("app_name", appConfig.getAppName()); + build.set("uni_app_id", appConfig.getUniAppId()); + build.set("wechat_app_id", ObjectUtil.defaultIfNull(appConfig.getWechatAppId(), "")); + build.set("wechat_app_secret", ObjectUtil.defaultIfNull(appConfig.getWechatAppSecret(), "")); + build.set("android_app_key", appConfig.getAndroidAppKey()); + build.set("application_id", appConfig.getApplicationId()); + build.set("privacy_agreement", wapUrl + "/app/pages/auth/agreement?key=privacy&="); + build.set("service_agreement", wapUrl + "/app/pages/auth/agreement?key=service&="); + build.set("qq_map_key", mapConfig.getKey()); + build.set("amap_key", ""); + build.set("version_name", param.getVersionName()); + build.set("version_code", param.getVersionCode()); + build.putByPath("cert.type", param.getCert().getType()); + build.putByPath("cert.file", param.getCert().getFile()); + build.putByPath("cert.key_alias", param.getCert().getKeyAlias()); + build.putByPath("cert.key_password", param.getCert().getKeyPassword()); + build.putByPath("cert.store_password", param.getCert().getStorePassword()); + + try { + // 写入build.json文件 + FileUtils.writeStringToFile(packageDir, "build.json", build.toString(), "UTF-8"); + + // 拷贝证书文件 + if (param.getCert().getType() === "private"){ + const certFile: string = this.config.get('webRootDownResource', param.getCert().getFile()); + if (!fs.existsSync(certFile)) throw new BadRequestException("证书文件不存在"); + + FileUtils.copyFile(certFile, packageDir, "cert.jks"); + } + + // 拷贝icon文件 + const iconFile: string = this.config.get('webRootDownResource', param.getBuild().getIcon()); + if (!fs.existsSync(iconFile)) throw new BadRequestException("icon文件不存在"); + FileUtils.copyFile(iconFile, packageDir, "drawable.zip"); + + // 将临时目录下文件生成压缩包 + const zipFile: string = ZipUtil.zip(packageDir, tempDir + "app.zip"); + + const instance: NiucloudUtils = NiucloudUtils.getInstance(); + + const actionQuery: Record = {}; + actionQuery.put("data[product_key]", instance.getProductKey()); + const actionToken: Record = niucloudService.getActionToken("appbuild", actionQuery); + + const query: Record = {}; + query.put("authorize_code", instance.getCode()); + query.put("timestamp", taskKey); + query.put("token", actionToken == null ? "" : actionToken.getStr("token")); + + const response: HttpResponse = new NiucloudUtils.Cloud().build("cloud/appbuild").query(query) + .func(i => { + i.form("file", zipFile, "app.zip"); + }) + .method(Method.POST).execute(); + + const res: Record = JSONUtil.parseObj(response.body()); + + if (!res.getInt("code", 0) === 1) throw new BadRequestException(res.getStr("msg")); + + return taskKey; + } catch (Exception e) { + throw new BadRequestException(e.getMessage()); + } } /** * getAppCompileLog */ async getAppCompileLog(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const instance: NiucloudUtils = NiucloudUtils.getInstance(); + + const query: Record = {}; + query.put("authorize_code", instance.getCode()); + query.put("timestamp", key); + + const response: HttpResponse = new NiucloudUtils.Cloud().build("cloud/get_appbuild_logs").query(query).method(Method.GET).execute(); + try { + const vo: AppCompileLogVo = new AppCompileLogVo(); + const log: Record = JSONUtil.parseObj(response.body()); + vo.setBuildLog(log); + + if (log != null) { + const data: JSONArray = ObjectUtil.defaultIfNull(log.getByPath("data.0", JSONArray.class), new JSONArray()); + if (data.size() > 0) { + const last: Record = data.getJSONObject(data.size() - 1); + if (last.getInt("code", -1) === 0) { + vo.setStatus("fail"); + vo.setFailReason(last.getStr("msg", "")); + return vo; + } + if (last.getInt("percent", 0) === 100) { + buildSuccess(key, vo); + } + } + } + + return vo; + } catch (Exception e) { + return null; + } } /** * generateSignCert */ async generateSignCert(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const query: Record = {}; + query.put("key_alias", param.getKeyAlias()); + query.put("key_password", param.getKeyPassword()); + query.put("store_password", param.getStorePassword()); + query.put("limit", param.getLimit()); + query.put("dname", "CN=" + param.getCn() + ", OU=" + param.getOu() + ", O=" + param.getO() + ", L=" + param.getL() + ", ST=" + param.getSt() + ", C=" + param.getC()); + + const response: HttpResponse = new NiucloudUtils.Cloud().build("cloud/getcert").query(query).method(Method.GET).execute(); + + if (response.header("Content-Type") === "application/json") { + const content: Record = JSONUtil.parseObj(response.body()); + if (content.getInt("code", -1) == 0) { + throw new BadRequestException(ObjectUtil.defaultIfBlank(content.getStr("msg", ""), "获取证书失败")); + } + } + + const tempDir: string = this.config.get('webRootDownResource') + "upload/download/cert/"; + FileTools.createDirs(tempDir); + + try { + const file: string = tempDir + param.getKeyAlias( + ".zip"); + const fos: FileOutputStream = new FileOutputStream(file, true); + fos.write(response.bodyBytes()); + return "upload/download/cert/" + param.getKeyAlias() + ".zip"; + } catch (Exception e) { + e.printStackTrace(); + throw new BadRequestException(e.getMessage()); + } } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/channel/impl/core-app-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/channel/impl/core-app-service-impl.service.ts index abe77b6e..e1cea1e2 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/channel/impl/core-app-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/channel/impl/core-app-service-impl.service.ts @@ -14,15 +14,17 @@ export class CoreAppServiceImplService { * getConfig */ async getConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const config: CoreSysConfigVo = coreConfigService.getConfig(siteId, ConfigKeyEnum.path.basename(APP)); + if (config == null || config.getValueJson() == null) { + return new AppConfigVo(); + } + return JSONUtil.toBean(config.getValueJson(), AppConfigVo.class); } /** * setConfig */ async setConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + coreConfigService.setConfig(siteId, ConfigKeyEnum.path.basename(APP), JSONUtil.parseObj(param)); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/channel/impl/core-h5-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/channel/impl/core-h5-service-impl.service.ts index 75bced4d..9066f1dd 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/channel/impl/core-h5-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/channel/impl/core-h5-service-impl.service.ts @@ -14,15 +14,20 @@ export class CoreH5ServiceImplService { * getH5 */ async getH5(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const coreSysConfigVo: CoreSysConfigVo = coreConfigService.getConfig(siteId, "h5"); + const vo: H5ConfigVo = new H5ConfigVo(); + if(ObjectUtil.isNotNull(coreSysConfigVo.getValueJson())) + { + vo = JSONUtil.toBean(coreSysConfigVo.getValueJson(), H5ConfigVo.class); + } + return vo; } /** * setH5 */ async setH5(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const json: Record = JSONUtil.parseObj(param); + coreConfigService.setConfig(RequestUtils.siteId(), "h5", json); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/channel/impl/core-pc-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/channel/impl/core-pc-service-impl.service.ts index a050a6d6..d411edcc 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/channel/impl/core-pc-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/channel/impl/core-pc-service-impl.service.ts @@ -14,15 +14,20 @@ export class CorePcServiceImplService { * getPc */ async getPc(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const coreSysConfigVo: CoreSysConfigVo = coreConfigService.getConfig(siteId, "pc"); + const vo: PcConfigVo = new PcConfigVo(); + if(ObjectUtil.isNotNull(coreSysConfigVo.getValueJson())) + { + vo = JSONUtil.toBean(coreSysConfigVo.getValueJson(), PcConfigVo.class); + } + return vo; } /** * setPc */ async setPc(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const json: Record = JSONUtil.parseObj(param); + coreConfigService.setConfig(RequestUtils.siteId(), "pc", json); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/diy/impl/core-diy-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/diy/impl/core-diy-service-impl.service.ts index 8ba875be..3436d257 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/diy/impl/core-diy-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/diy/impl/core-diy-service-impl.service.ts @@ -14,23 +14,65 @@ export class CoreDiyServiceImplService { * getThemeColorDict */ async getThemeColorDict(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return ThemeColorEnum.getThemeColor(); } /** * getDefaultThemeColor */ async getDefaultThemeColor(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return ThemeColorEnum.getAddonThemeColor(addon); } /** * initDefaultDiyTheme */ async initDefaultDiyTheme(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const siteCache: SiteInfoVo = coreSiteService.getSiteCache(siteId); + const themeColorList: JSONArray = ThemeColorEnum.getThemeColor(); + + if (themeColorList == null || themeColorList.length === 0) { + return; + } + + const diyThemes: DiyTheme[] = []; + + // 处理主题配置 + themeColorList.forEach(item => { + const themeColor: Record = JSONUtil.parseObj(item); + const themeType: string = themeColor.getStr("theme_type"); + const colors: JSONArray = themeColor.getJSONArray("theme_color"); + + if (colors == null || colors.length === 0) { + return; + } + + // 处理应用主题 + if ("app_theme" === themeType) { + addAppThemes(diyThemes, siteId, "app", "app", colors); + return; + } + + // 处理其他应用和插件主题 + siteCache.getApps().stream() + .filter(app => (themeType + "_theme") === app.getKey()) + .forEach(app => { + // 添加应用主题 + addAppThemes(diyThemes, siteId, "app", app.getKey(), colors); + + // 添加关联插件主题 + const addons: Addon[] = addonMapper.selectList( + new LambdaQueryWrapper() + .eq(Addon::getSupportApp, app.getKey())); + + if ((addons && addons.length > 0)) { + addons.forEach(addon => addAppThemes(diyThemes, siteId, "addon", addon.getKey(), colors)); + } + }); + }); + + if ((diyThemes && diyThemes.length > 0)) { + insertNewThemes(diyThemes, siteId); + } } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/diy_form/impl/core-diy-form-config-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/diy_form/impl/core-diy-form-config-service-impl.service.ts index 96f9d174..d70a8a2f 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/diy_form/impl/core-diy-form-config-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/diy_form/impl/core-diy-form-config-service-impl.service.ts @@ -14,47 +14,151 @@ export class CoreDiyFormConfigServiceImplService { * getWriteConfig */ async getWriteConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + queryWrapper.eq("site_id", siteId).eq("form_id", formId); + const writeConfig: DiyFormWriteConfig = diyFormWriteConfigMapper.selectOne(queryWrapper); + if (ObjectUtil.isEmpty(writeConfig)) { + return null; + } + const infoVo: DiyFormWriteConfigInfoVo = new DiyFormWriteConfigInfoVo(); + BeanUtil.copyProperties(writeConfig, infoVo); + infoVo.setTimeLimitRule(writeConfig.getTimeLimitRule()); + const timeLimitRule: Record = JSONUtil.parseObj(infoVo.getTimeLimitRule()); + if(timeLimitRule.containsKey("specify_time") && timeLimitRule.getJSONArray("specify_time").size() > 0) + { + const specifyTime: JSONArray = timeLimitRule.getJSONArray("specify_time"); + const specifyTimeVo: JSONArray = new JSONArray(); + specifyTimeVo.add(DateUtils.timestampToString(specifyTime.getLong(0))); + specifyTimeVo.add(DateUtils.timestampToString(specifyTime.getLong(1))); + timeLimitRule.put("specify_time", specifyTimeVo); + } + + if(timeLimitRule.containsKey("open_day_time") && timeLimitRule.getJSONArray("open_day_time").size() > 0) + { + const beginOfDay: number = DateUtil.beginOfDay(DateUtil.date()).getTime() / 1000; + const openDayTime: JSONArray = timeLimitRule.getJSONArray("open_day_time"); + const openDayTimeVo: JSONArray = new JSONArray(); + openDayTimeVo.add(DateUtils.timestampToString( (beginOfDay + openDayTime.getLong(0)), "yyyy-MM-dd")); + openDayTimeVo.add(DateUtils.timestampToString((beginOfDay + openDayTime.getLong(1)), "yyyy-MM-dd")); + timeLimitRule.put("specify_time", openDayTimeVo); + } + return infoVo; } /** * addWriteConfig */ async addWriteConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + if (addParam.getFormId() == null) { + throw new BadRequestException("缺少表单id"); + } + const writeConfig: DiyFormWriteConfig = new DiyFormWriteConfig(); + + BeanUtil.copyProperties(addParam, writeConfig); + writeConfig.setCreateTime(System.currentTimeMillis() / 1000); + writeConfig.setUpdateTime(System.currentTimeMillis() / 1000); + diyFormWriteConfigMapper.insert(writeConfig); } /** * editWriteConfig */ async editWriteConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + queryWrapper.eq("id", editParam.getId()).eq("form_id", editParam.getFormId()).eq("site_id", editParam.getSiteId()); + const existingConfig: DiyFormWriteConfig = diyFormWriteConfigMapper.selectOne(queryWrapper); + if (ObjectUtil.isEmpty(existingConfig)) { + throw new BadRequestException("表单填写配置不存在"); + } + BeanUtil.copyProperties(editParam, existingConfig); + existingConfig.setLabelIds(editParam.getLabelIds().toString()); + existingConfig.setFormWriteRule(editParam.getFormWriteRule().toString()); + existingConfig.setMemberWriteRule(editParam.getMemberWriteRule().toString()); + existingConfig.setLevelIds(editParam.getLevelIds().toString()); + + + const timeLimitRule: Record = editParam.getTimeLimitRule(); + if(timeLimitRule.containsKey("specify_time") && timeLimitRule.getJSONArray("specify_time").size() > 0) + { + const specifyTime: JSONArray = timeLimitRule.getJSONArray("specify_time"); + const specifyTimeVo: JSONArray = new JSONArray(); + specifyTimeVo.add(DateUtils.StringToTimestamp(specifyTime.getStr(0))); + specifyTimeVo.add(DateUtils.StringToTimestamp(specifyTime.getStr(1))); + timeLimitRule.put("specify_time", specifyTimeVo); + } + + if(timeLimitRule.containsKey("open_day_time") && timeLimitRule.getJSONArray("open_day_time").size() > 0) + { + const beginOfDay: number = DateUtil.beginOfDay(DateUtil.date()).getTime() / 1000; + const openDayTime: JSONArray = timeLimitRule.getJSONArray("open_day_time"); + const openDayTimeVo: JSONArray = new JSONArray(); + const startTimeStr: string = DateUtil.format(DateUtil.date(), "yyyy-MM-dd") + " " + openDayTime.getStr(0) + ":00"; + const endTimeStr: string = DateUtil.format(DateUtil.date(), "yyyy-MM-dd") + " " + openDayTime.getStr(1) + ":00"; + openDayTimeVo.add(DateUtils.StringToTimestamp(startTimeStr) - beginOfDay); + openDayTimeVo.add(DateUtils.StringToTimestamp(endTimeStr) - beginOfDay); + timeLimitRule.put("specify_time", openDayTimeVo); + } + existingConfig.setTimeLimitRule(timeLimitRule.toString()); + existingConfig.setUpdateTime(System.currentTimeMillis() / 1000); + diyFormWriteConfigMapper.updateById(existingConfig); } /** * getSubmitConfig */ async getSubmitConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + queryWrapper.eq("site_id", siteId).eq("form_id", formId).last("limit 1"); + const submitConfig: DiyFormSubmitConfig = diyFormSubmitConfigMapper.selectOne(queryWrapper); + + const infoVo: DiyFormSubmitConfigInfoVo = new DiyFormSubmitConfigInfoVo(); + BeanUtil.copyProperties(submitConfig, infoVo); + return infoVo; } /** * addSubmitConfig */ async addSubmitConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + if (addParam.getFormId() == null) { + throw new BadRequestException("缺少表单id"); + } + const submitConfig: DiyFormSubmitConfig = new DiyFormSubmitConfig(); + submitConfig.setSubmitAfterAction(addParam.getSubmitAfterAction()); + submitConfig.setSuccessAfterAction(addParam.getSuccessAfterAction().toString()); + submitConfig.setTimeLimitRule(addParam.getTimeLimitRule().toString()); + submitConfig.setTimeLimitType(addParam.getTimeLimitType()); + submitConfig.setSiteId(addParam.getSiteId()); + submitConfig.setVoucherContentRule(addParam.getVoucherContentRule().toString()); + submitConfig.setTipsText(addParam.getTipsText()); + submitConfig.setTipsType(addParam.getTipsType()); + submitConfig.setFormId(addParam.getFormId()); + submitConfig.setCreateTime(System.currentTimeMillis() / 1000); + submitConfig.setUpdateTime(System.currentTimeMillis() / 1000); + diyFormSubmitConfigMapper.insert(submitConfig); } /** * editSubmitConfig */ async editSubmitConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + queryWrapper.eq("id", editParam.getId()).eq("site_id", editParam.getSiteId()).eq("form_id", editParam.getFormId()); + const existingConfig: DiyFormSubmitConfig = diyFormSubmitConfigMapper.selectOne(queryWrapper); + if (ObjectUtil.isEmpty(existingConfig)) { + throw new BadRequestException("表单提交成功页配置不存在"); + } + existingConfig.setSubmitAfterAction(editParam.getSubmitAfterAction()); + existingConfig.setSuccessAfterAction(editParam.getSuccessAfterAction().toString()); + existingConfig.setTimeLimitRule(editParam.getTimeLimitRule().toString()); + existingConfig.setTimeLimitType(editParam.getTimeLimitType()); + + existingConfig.setVoucherContentRule(editParam.getVoucherContentRule().toString()); + existingConfig.setTipsText(editParam.getTipsText()); + existingConfig.setTipsType(editParam.getTipsType()); + + + existingConfig.setUpdateTime(System.currentTimeMillis() / 1000); + diyFormSubmitConfigMapper.updateById(existingConfig); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/diy_form/impl/core-diy-form-records-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/diy_form/impl/core-diy-form-records-service-impl.service.ts index f10d0805..c02ee378 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/diy_form/impl/core-diy-form-records-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/diy_form/impl/core-diy-form-records-service-impl.service.ts @@ -14,39 +14,258 @@ export class CoreDiyFormRecordsServiceImplService { * page */ async page(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return []; + const page: number = pageParam.getPage(); + const limit: number = pageParam.getLimit(); + + const queryWrapper: MPJQueryWrapper = new MPJQueryWrapper<>(); + + //sql语句 + queryWrapper.select("ndfr.record_id, ndfr.site_id, ndfr.form_id, ndfr.value, ndfr.member_id, ndfr.relate_id, ndfr.create_time, nm.username, nm.member_no, nm.mobile, nm.nickname, nm.headimg") + .setAlias("ndfr") + .leftJoin("?_member nm ON ndfr.member_id = nm.member_id".replace("?_", this.config.get('tablePrefix'))); + + queryWrapper.eq("ndfr.site_id", searchParam.getSiteId()); + if (ObjectUtil.isNotEmpty(searchParam.getFormId())) { + queryWrapper.eq("ndfr.form_id", searchParam.getFormId()); + } + if (ObjectUtil.isNotEmpty(searchParam.getKeyword())) { + queryWrapper.and(i => i.or(j => j.like("nm.nickname", searchParam.getKeyword())) + .or(j => j.like("nm.username", searchParam.getKeyword())) + .or(j => j.like("nm.member_no", searchParam.getKeyword())) + .or(j => j.like("nm.mobile", searchParam.getKeyword())) + ); + } + + queryWrapper.orderByDesc("ndfr.create_time"); + const iPage: IPage = diyFormRecordsMapper.selectJoinPage(new Page<>(page, limit), DiyFormRecordsListVo.class, queryWrapper); + + for (const vo of iPage.getRecords()) { + const list: DiyFormRecordsFields[] = diyFormRecordsFieldsMapper.selectList(new QueryWrapper().eq("record_id", vo.getRecordId())); + + const memberVo: Member = new Member(); + BeanUtils.copyProperties(vo, memberVo); + vo.setMember(memberVo); + if (ObjectUtil.isNotEmpty(list)) { + const map: Record = {}; + for (const item of list) { + const diyFormRecordsFieldsListVo: DiyFormRecordsFieldsListVo = new DiyFormRecordsFieldsListVo(); + BeanUtils.copyProperties(item, diyFormRecordsFieldsListVo); + map.put(item.getFieldKey(), diyFormRecordsFieldsListVo); + } + vo.setRecordsFieldList(map); + } + } + return PageResult.build(iPage); } /** * info */ async info(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: DiyFormRecords = diyFormRecordsMapper.selectOne( + new QueryWrapper() + .eq("record_id", id) + .eq("site_id", RequestUtils.siteId())); + + + Assert.notNull(model, "万能表单填写记录不存在"); + + const vo: DiyFormRecordsInfoVo = new DiyFormRecordsInfoVo(); + BeanUtils.copyProperties(model, vo); + const list: DiyFormRecordsFields[] = diyFormRecordsFieldsMapper.selectList(new QueryWrapper().eq("record_id", vo.getRecordId())); + if (ObjectUtil.isNotEmpty(list)) { + const map: Record = {}; + for (const item of list) { + const diyFormRecordsFieldsListVo: DiyFormRecordsFieldsListVo = new DiyFormRecordsFieldsListVo(); + BeanUtils.copyProperties(item, diyFormRecordsFieldsListVo); + map.put(item.getFieldKey(), diyFormRecordsFieldsListVo); + } + vo.setRecordsFieldList(map); + } + return vo; } /** * add */ async add(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const diyForm: DiyForm = diyFormMapper.selectOne(new QueryWrapper().eq("site_id", addParam.getSiteId()).eq("form_id", addParam.getFormId())); + if (diyForm == null) return null; + + if (diyForm.getStatus() == 0) return null; + + const model: DiyFormRecords = new DiyFormRecords(); + BeanUtils.copyProperties(addParam, model); + model.setCreateTime(System.currentTimeMillis() / 1000); + model.setValue(JSONUtil.toJsonStr(addParam.getValue())); + diyFormRecordsMapper.insert(model); + const list: DiyFormFields[] = diyFormFieldsMapper.selectList(new QueryWrapper().eq("form_id", addParam.getFormId()).eq("site_id", addParam.getSiteId())); + const fieldList: Record = {}; + if (ObjectUtil.isNotEmpty(list)) { + + for (const item of list) { + fieldList.put(item.getFieldKey(), item); + } + } + const recordsFieldsList: DiyFormRecordsFields[] = []; + + if (ObjectUtil.isNotEmpty(addParam.getValue())) { + const components: JSONArray = JSONUtil.parseArray(addParam.getValue()); + for (const componentObj of components) { + const component: Record = JSONUtil.parseObj(componentObj); + // 过滤非表单组件和表单提交按钮组件 + if (!"diy_form" === component.getStr("componentType") || "FormSubmit" === component.getStr("componentName") || component.getBool("isHidden")) { + continue; + } + + const field: Record = component.getJSONObject("field"); + const fieldValue: any = field.get("value"); + const checkFieldValue: any = fieldValue; + if (fieldValue instanceof List) { + // 这里假设 DiyFormRecordsFieldsMapper 有对应的方法,需要根据实际情况修改 + // checkFieldValue = diyFormRecordsFieldsMapper.getRenderValueAttr("", (List) fieldValue, component.get("componentName")); + checkFieldValue = ""; + } + + const formFieldInfo: DiyFormFields = fieldList.get(component.getStr("id")); + if (formFieldInfo != null) { + if (formFieldInfo.getFieldRequired() == 1 && fieldValue == null) { + throw new BadRequestException(field.getOrDefault("name", component.get("componentTitle")) + "不能为空"); + } else if (checkFieldValue == null) { + // 过滤空数据 + continue; + } + + // 检测字段是否重复 + const uniqueQuery: QueryWrapper = new QueryWrapper<>(); + uniqueQuery.eq("site_id", addParam.getSiteId()) + .eq("form_id", addParam.getFormId()) + .eq("field_key", component.get("id")) + .eq("field_type", component.get("componentName")); + const fieldValues: any[] = diyFormRecordsFieldsMapper.selectObjs(uniqueQuery); + if (formFieldInfo.getFieldUnique() == 1 && fieldValues.includes(fieldValue)) { + throw new BadRequestException(field.getOrDefault("name", component.get("componentTitle")) + "不能重复"); + } + } else if (checkFieldValue == null) { + // 过滤空数据 + continue; + } + + if (fieldValue instanceof List) { + // 这里假设使用 JSON 工具类,需要根据实际情况引入 + fieldValue = JSONUtil.parseArray(fieldValue).toString(); + } + + const recordsField: DiyFormRecordsFields = new DiyFormRecordsFields(); + recordsField.setSiteId(addParam.getSiteId()); + recordsField.setFormId(addParam.getFormId()); + recordsField.setRecordId(model.getRecordId()); + recordsField.setMemberId(addParam.getMemberId()); + recordsField.setFieldKey(component.get("id")); + recordsField.setFieldType(component.get("componentName")); + recordsField.setFieldName(field.getOrDefault("name", "")); + recordsField.setFieldValue(fieldValue.toString()); + recordsField.setFieldRequired((Boolean) field.get("required") ? 1 : 0); + recordsField.setFieldHidden((Boolean) component.get("isHidden") ? 1 : 0); + recordsField.setFieldUnique(component.containsKey("unique") && (Boolean) component.get("unique") ? 1 : 0); + recordsField.setPrivacyProtection(component.containsKey("privacyProtection") && (Boolean) component.get("privacyProtection") ? 1 : 0); + recordsField.setCreateTime(System.currentTimeMillis() / 1000); + recordsField.setUpdateTime(System.currentTimeMillis() / 1000); + recordsFieldsList.add(recordsField); + } + } + + if (!recordsFieldsList.length === 0) { + diyFormRecordsFieldsMapper.insert(recordsFieldsList); + + // 累计填写数量 + diyFormMapper.update(new UpdateWrapper().eq("form_id", addParam.getFormId()).setSql(" write_num = write_num + 1")); + + for (const field of recordsFieldsList) { + // 字段累计填写数量 + diyFormFieldsMapper.update(new UpdateWrapper().eq("form_id", addParam.getFormId()).eq("field_key", field.getFieldKey()).eq("site_id", addParam.getSiteId()).setSql(" write_num = write_num + 1")); + } + } + return model.getRecordId(); } /** * del */ async del(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + diyFormRecordsMapper.delete(new QueryWrapper().eq("record_id", id).eq("site_id", siteId)); } /** * edit */ async edit(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + // 验证表单状态 + const formInfo: DiyForm = diyFormMapper.selectOne(new LambdaQueryWrapper() + .select(DiyForm::getFormId, DiyForm::getStatus) + .eq(DiyForm::getFormId, param.getFormId()) + .last("LIMIT 1")); + + if (formInfo == null) { + return; + } + if (formInfo.getStatus() == 0) { + return; + } + + // 更新主记录 + diyFormRecordsMapper.update(null, new LambdaUpdateWrapper() + .eq(DiyFormRecords::getRecordId, param.getRecordId()) + .set(DiyFormRecords::getValue, JSONUtil.toJsonStr(param.getValue()))); + + // 获取字段配置 + const formFieldMap: Record = diyFormFieldsMapper.selectList( + new LambdaQueryWrapper() + .select(DiyFormFields::getFieldKey, + DiyFormFields::getFieldRequired, + DiyFormFields::getFieldUnique) + .eq(DiyFormFields::getFormId, param.getFormId())) + .stream() + .collect(Collectors.toMap(DiyFormFields::getFieldKey, Function.identity())); + + // 处理字段数据 + const recordsFields: DiyFormRecordsFields[] = []; + if ((param.getValue( && param.getValue(.length > 0))) { + for (const comp of param.getValue()) { + if (!(comp instanceof Record)) continue; + const component: Record = (Record) comp; + + // 过滤无效组件 + const componentType: string = component.getStr("componentType"); + const componentName: string = component.getStr("componentName"); + const isHidden: boolean = component.getBool("isHidden", false); + + if (!"diy_form" === componentType || + "FormSubmit" === componentName || + Boolean.TRUE === isHidden) { + continue; + } + + // 获取字段值 + const field: Record = component.getJSONObject("field"); + const fieldValue: any = field != null ? field.get("value") : null; + const fieldKey: string = component.getStr("id"); + + // 字段验证 + const fieldConfig: DiyFormFields = formFieldMap.get(fieldKey); + if (fieldConfig != null) { + validateField(fieldConfig, fieldValue, component, param); + } else if (fieldValue == null || + (fieldValue instanceof String && StrUtil.isBlank(fieldValue))) { + continue; + } + + // 构建字段记录 + recordsFields.add(buildRecordField(param, component, fieldValue)); + } + } + + // 更新字段记录 + updateRecordFields(param, recordsFields); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/member/impl/core-member-account-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/member/impl/core-member-account-service-impl.service.ts index 39c9de92..2417d201 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/member/impl/core-member-account-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/member/impl/core-member-account-service-impl.service.ts @@ -14,7 +14,50 @@ export class CoreMemberAccountServiceImplService { * addLog */ async addLog(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const memberQuery: QueryWrapper = new QueryWrapper().eq("site_id", siteId).eq("member_id", memberId); + const member: Member = memberMapper.selectOne(memberQuery); + Assert.notNull(member, "会员不存在"); + + const accountData: number = new BigDecimal(data); + const memberWrapper: BeanWrapper = new BeanWrapperImpl(member); + const originalData: number = new BigDecimal(new number(memberWrapper.getPropertyValue(StringUtils.toCamelCase(accountType)).toString())); + + const accountNewData: number = originalData.add(accountData); + if (accountNewData.signum() < 0) throw new BadRequestException("账户余额不足"); + + // 添加账户变更记录 + const model: MemberAccountLog = new MemberAccountLog(); + model.setSiteId(siteId); + model.setMemberId(memberId); + model.setAccountType(accountType); + model.setAccountData(accountData); + model.setAccountSum(accountNewData); + model.setFromType(fromType); + model.setMemo(memo); + model.setRelatedId(relatedId); + model.setCreateTime(System.currentTimeMillis() / 1000); + memberAccountLogMapper.insert(model); + + // 修改会员账户 + const memberModel: Member = new Member(); + memberModel.setMemberId(memberId); + const updateMemberWrapper: BeanWrapper = new BeanWrapperImpl(memberModel); + updateMemberWrapper.setPropertyValue(StringUtils.toCamelCase(accountType), accountNewData); + if (accountData.signum() > 0) { + const originalGetData: number = new BigDecimal(new number(memberWrapper.getPropertyValue(StringUtils.toCamelCase(accountType + "_get")).toString())); + updateMemberWrapper.setPropertyValue(StringUtils.toCamelCase(accountType + "_get"), originalGetData.add(accountData)); + } + memberMapper.updateById(memberModel); + + // 账户变更事件 + const accountEvent: MemberAccountEvent = new MemberAccountEvent(); + accountEvent.setSiteId(siteId); + accountEvent.addAppSign("core"); + accountEvent.setName("MemberAccountEvent"); + accountEvent.setAccountType(accountType); + accountEvent.setAccountData(accountData); + accountEvent.setAccountNewData(accountNewData); + accountEvent.setMemberId(memberId); + EventAndSubscribeOfPublisher.publishAll(accountEvent); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/member/impl/core-member-cash-out-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/member/impl/core-member-cash-out-service-impl.service.ts index eae14bd3..536506ec 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/member/impl/core-member-cash-out-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/member/impl/core-member-cash-out-service-impl.service.ts @@ -14,79 +14,234 @@ export class CoreMemberCashOutServiceImplService { * apply */ async apply(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const member: Member = memberMapper.selectOne(new QueryWrapper() + .eq("member_id", param.getMemberId()) + .eq("site_id", param.getSiteId())); + if (ObjectUtil.isEmpty(member)) throw new BadRequestException("会员不存在"); + + const config: CashOutConfigVo = coreMemberConfigService.getCashOutConfig(param.getSiteId()); + if (config.getIsOpen() === "0") throw new BadRequestException("会员提现业务未开启"); + + const applyMoney: number = param.getApplyMoney(); + if (applyMoney.compareTo(BigDecimal.ZERO) <= 0) throw new BadRequestException("提现金额必须大于0"); + if (param.getAccountType() == AccountTypeEnum.MONEY.getType() && applyMoney.compareTo(member.getMoney()) > 0) throw new BadRequestException("提现金额不能大于账户余额"); + if (param.getAccountType() == AccountTypeEnum.COMMISSION.getType() && applyMoney.compareTo(member.getCommission()) > 0) throw new BadRequestException("提现金额不能大于账户可提现金额"); + if (applyMoney.compareTo(config.getMin()) < 0) throw new BadRequestException("提现金额不能小于最低提现金额"); + if (!config.getTransferType().includes(param.getTransferType())) throw new BadRequestException("当前会员提现方式未启用"); + + const cashoutAccount: MemberCashOutAccount = new MemberCashOutAccount(); + if (!param.getTransferType() === TransferTypeEnum.WECHATPAY.getKey()) { + cashoutAccount = memberCashOutAccountMapper.selectOne(new QueryWrapper() + .eq("member_id", param.getMemberId()) + .eq("site_id", param.getSiteId()) + .eq("account_id", param.getAccountId())); + if (ObjectUtil.isEmpty(cashoutAccount)) throw new BadRequestException("提现账户不存在"); + } + + const serviceMoney: number = applyMoney.multiply(config.getRate()).divide(BigDecimal.valueOf(100), 2, BigDecimal.ROUND_HALF_UP); + + const model: MemberCashOut = new MemberCashOut(); + model.setMemberId(param.getMemberId()); + model.setSiteId(param.getSiteId()); + model.setCashOutNo(CommonUtils.createNo()); + model.setAccountType(param.getAccountType()); + model.setApplyMoney(applyMoney); + model.setServiceMoney(serviceMoney); + model.setMoney(applyMoney.subtract(serviceMoney)); + model.setTransferType(param.getTransferType()); + model.setTransferRealname(ObjectUtil.defaultIfNull(cashoutAccount.getRealname(), "")); + model.setTransferMobile(member.getMobile()); + model.setTransferBank(ObjectUtil.defaultIfNull(cashoutAccount.getBankName(), "")); + model.setTransferAccount(ObjectUtil.defaultIfNull(cashoutAccount.getAccountNo(), "")); + model.setRate(config.getRate()); + model.setTransferPaymentCode(ObjectUtil.defaultIfNull(cashoutAccount.getTransferPaymentCode(), "")); + model.setTransferPayee(ObjectUtil.isNull(param.getTransferPayee()) ? "" : JSONUtil.parseObj(param.getTransferPayee()).toString()); + + this.addCashOutRecord(model, member, config); + return model.getId(); } /** * audit */ async audit(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const cashOut: MemberCashOut = memberCashOutMapper.selectOne( + new QueryWrapper() + .eq("id", id) + .eq("site_id", siteId) + .last("limit 1")); + + Assert.notNull(cashOut, "提现记录不存在"); + + if (!cashOut.getStatus() === MemberCashOutStatusEnum.WAIT_AUDIT.getStatus()) { + throw new BadRequestException("当前提现申请未处于待审核状态"); + } + + switch (action) { + case "agree": + this.agree(siteId, cashOut, param); + break; + case "refuse": + this.refuse(siteId, cashOut, param); + break; + } } /** * agree */ async agree(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + cashOut.setAuditTime(System.currentTimeMillis() / 1000); + cashOut.setStatus(MemberCashOutStatusEnum.WAIT_TRANSFER.getStatus()); + memberCashOutMapper.updateById(cashOut); } /** * transfer */ async transfer(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + Assert.notNull(cashOut, "提现记录不存在"); + if (!cashOut.getStatus() === MemberCashOutStatusEnum.WAIT_TRANSFER.getStatus() && !cashOut.getStatus() === MemberCashOutStatusEnum.TRANSFER_ING.getStatus()) throw new BadRequestException("当前提现申请未处于待转账状态"); + + if (ObjectUtil.isEmpty(cashOut.getTransferNo())) { + const transfer: PayTransfer = new PayTransfer(); + transfer.setSiteId(cashOut.getSiteId()); + transfer.setMainType(PayMainType.MEMBER.getType()); + transfer.setMainId(cashOut.getMemberId()); + transfer.setMoney(cashOut.getMoney()); + transfer.setTradeType("member_cash_out"); + transfer.setRemark(""); + transfer.setExtra(""); + cashOut.setTransferNo(coreTransferService.create(transfer)); + cashOut.setStatus(MemberCashOutStatusEnum.TRANSFER_ING.getStatus()); + memberCashOutMapper.updateById(cashOut); + } + + const data: Record = {}; + data.put("transfer_voucher", ObjectUtil.defaultIfEmpty(param.getTransferVoucher(), "")); + data.put("transfer_remark", ObjectUtil.defaultIfEmpty(param.getTransferRemark(), "")); + + const transferType: string = ObjectUtil.defaultIfNull(param.getTransferType(), cashOut.getTransferType()); + + if (!transferType === "offline") { + data.put("transfer_type", cashOut.getTransferType()); + data.put("transfer_realname", cashOut.getTransferRealname()); + data.put("transfer_mobile", cashOut.getTransferMobile()); + data.put("transfer_bank", cashOut.getTransferBank()); + data.put("transfer_account", cashOut.getTransferAccount()); + data.put("transfer_payment_code", cashOut.getTransferPaymentCode()); + + if (cashOut.getTransferType() === TransferTypeEnum.WECHATPAY.getKey()) { + const transferPayee: Record = new Record(); + transferPayee.put("open_id", param.getOpenId()); + transferPayee.put("channel", param.getChannel()); + data.put("transfer_payee", transferPayee.toString()); + } + } else { + transferType = cashOut.getTransferType(); + } + + return coreTransferService.transfer(cashOut.getSiteId(), cashOut.getTransferNo(), transferType, data); } /** * transferFinish */ async transferFinish(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const cashOut: MemberCashOut = memberCashOutMapper.selectOne(new QueryWrapper().eq("transfer_no", transferNo)); + Assert.notNull(cashOut, "提现记录不存在"); + if (!cashOut.getStatus() === MemberCashOutStatusEnum.WAIT_TRANSFER.getStatus() && !cashOut.getStatus() === MemberCashOutStatusEnum.TRANSFER_ING.getStatus()) throw new BadRequestException("当前提现申请未处于待转账状态"); + + cashOut.setTransferTime(System.currentTimeMillis() / 1000); + cashOut.setStatus(MemberCashOutStatusEnum.TRANSFERED.getStatus()); + memberCashOutMapper.updateById(cashOut); + + this.give(cashOut); } /** * refuse */ async refuse(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + cashOut.setAuditTime(System.currentTimeMillis() / 1000); + cashOut.setStatus(MemberCashOutStatusEnum.REFUSE.getStatus()); + cashOut.setRefuseReason(param.getRefuseReason() == null ? "": param.getRefuseReason()); + memberCashOutMapper.updateById(cashOut); + + this.giveback(cashOut); } /** * give */ async give(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const member: Member = memberMapper.selectById(cashOut.getMemberId()); + + const updateMember: Member = new Member(); + updateMember.setMemberId(member.getMemberId()); + if (cashOut.getAccountType() === AccountTypeEnum.MONEY.getType()) { + updateMember.setMoneyCashOuting(member.getMoneyCashOuting().subtract(cashOut.getApplyMoney())); + } + if (cashOut.getAccountType() === AccountTypeEnum.COMMISSION.getType()) { + updateMember.setCommissionCashOuting(member.getCommissionCashOuting().subtract(cashOut.getApplyMoney())); + } + memberMapper.updateById(updateMember); } /** * giveback */ async giveback(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const member: Member = memberMapper.selectById(cashOut.getMemberId()); + + // 扣除对应账户金额 + coreMemberAccountService.addLog(cashOut.getSiteId(), cashOut.getMemberId(), cashOut.getAccountType(), cashOut.getApplyMoney().doubleValue(), "cash_out", "提现被拒绝,返还零钱", cashOut.getId().toString()); + + const updateMember: Member = new Member(); + updateMember.setMemberId(member.getMemberId()); + if (cashOut.getAccountType() === AccountTypeEnum.MONEY.getType()) { + updateMember.setMoneyCashOuting(member.getMoneyCashOuting().subtract(cashOut.getApplyMoney())); + } + if (cashOut.getAccountType() === AccountTypeEnum.COMMISSION.getType()) { + updateMember.setCommissionCashOuting(member.getCommissionCashOuting().subtract(cashOut.getApplyMoney())); + } + memberMapper.updateById(updateMember); } /** * cancel */ async cancel(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const cashOut: MemberCashOut = memberCashOutMapper.selectOne(new QueryWrapper().eq("id", id).eq("site_id", siteId)); + Assert.notNull(cashOut, "提现记录不存在"); + + number[] status = new number[]{ + MemberCashOutStatusEnum.WAIT_AUDIT.getStatus(), + MemberCashOutStatusEnum.WAIT_TRANSFER.getStatus(), + MemberCashOutStatusEnum.TRANSFER_ING.getStatus() + }; + if (!ObjectUtil.includes(status, cashOut.getStatus())) { + throw new BadRequestException("当前提现申请不支持撤销"); + } + + if (cashOut.getTransferType() === TransferTypeEnum.WECHATPAY.getKey() && cashOut.getStatus() === MemberCashOutStatusEnum.TRANSFER_ING.getStatus()) { + // 微信提现撤销 + coreTransferService.cancel(cashOut.getSiteId(), cashOut.getTransferNo()); + } + + cashOut.setStatus(MemberCashOutStatusEnum.CANCEL.getStatus()); + memberCashOutMapper.updateById(cashOut); + + giveback(cashOut); } /** * checkTransferStatus */ async checkTransferStatus(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const cashOut: MemberCashOut = memberCashOutMapper.selectOne(new QueryWrapper().eq("id", id).eq("site_id", siteId)); + Assert.notNull(cashOut, "提现记录不存在"); + + coreTransferService.check(cashOut.getSiteId(), cashOut.getTransferNo()); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/member/impl/core-member-config-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/member/impl/core-member-config-service-impl.service.ts index 1c6436a1..ae461f61 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/member/impl/core-member-config-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/member/impl/core-member-config-service-impl.service.ts @@ -14,87 +14,88 @@ export class CoreMemberConfigServiceImplService { * getCoreMemberService */ async getCoreMemberService(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + this.coreMemberService = coreMemberService; } /** * getLoginConfig */ async getLoginConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const config: Record = coreConfigService.getConfigValue(siteId, "LOGIN"); + return JSONUtil.toBean(config, LoginConfigVo.class); } /** * setLoginConfig */ async setLoginConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + coreConfigService.setConfig(siteId, "LOGIN", JSONUtil.parseObj(configParam)); } /** * getCashOutConfig */ async getCashOutConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const config: Record = coreConfigService.getConfigValue(siteId, "member_cash_out"); + return JSONUtil.toBean(config, CashOutConfigVo.class); } /** * setCashOutConfig */ async setCashOutConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + coreConfigService.setConfig(siteId, "member_cash_out", JSONUtil.parseObj(configParam)); } /** * getMemberConfig */ async getMemberConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const config: Record = coreConfigService.getConfigValue(siteId, "MEMBER"); + return JSONUtil.toBean(config, MemberConfigVo.class); } /** * setMemberConfig */ async setMemberConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + coreConfigService.setConfig(siteId, "MEMBER", JSONUtil.parseObj(configParam)); } /** * getGrowthRuleConfig */ async getGrowthRuleConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const config: Record = coreConfigService.getConfigValue(siteId, "GROWTH_RULE"); + if (config != null) config = coreMemberService.getGrowthRuleContent(siteId, config, "admin"); + return config; } /** * setGrowthRuleConfig */ async setGrowthRuleConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + coreConfigService.setConfig(siteId, "GROWTH_RULE", configParam); } /** * getPointRuleConfig */ async getPointRuleConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const config: Record = coreConfigService.getConfigValue(siteId, "POINT_RULE"); + if (config != null) { + const grant: Record = config.get("consume") instanceof Record ? config.getJSONObject("grant") : new Record(); + if (grant != null && grant.size() > 0) config.set("grant", coreMemberService.getPointGrantRuleContent(siteId, grant, "admin")); + const consume: Record = config.get("consume") instanceof Record ? config.getJSONObject("consume") : new Record(); + if (consume != null && consume.size() > 0) config.set("consume", coreMemberService.getPointConsumeRuleContent(siteId, consume, "admin")); + } + return config; } /** * setPointRuleConfig */ async setPointRuleConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + coreConfigService.setConfig(siteId, "POINT_RULE", configParam); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/member/impl/core-member-level-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/member/impl/core-member-level-service-impl.service.ts index 9cceaf93..0922ae82 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/member/impl/core-member-level-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/member/impl/core-member-level-service-impl.service.ts @@ -14,7 +14,41 @@ export class CoreMemberLevelServiceImplService { * checkLevelUpgrade */ async checkLevelUpgrade(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + try { + const member: Member = memberMapper.selectOne(new QueryWrapper().select("member_id,growth,member_level").eq("member_id", memberId).eq("site_id", siteId)); + if (member == null) return; + + // 查询达到的等级 + const upgradeQuery: QueryWrapper = new QueryWrapper(); + upgradeQuery.eq("site_id", siteId); + upgradeQuery.le("growth", member.getGrowth()); + if (member.getMemberLevel() > 0) { + const memberLevel: MemberLevel = memberLevelMapper.selectOne(new QueryWrapper().select("growth").eq("level_id", member.getMemberLevel())); + if (memberLevel != null) { + upgradeQuery.gt("growth", memberLevel.getGrowth()); + } + } + upgradeQuery.orderByAsc("growth"); + const upgrade: MemberLevel[] = memberLevelMapper.selectList(upgradeQuery); + + if (ObjectUtil.isNotEmpty(upgrade)) { + const vars: Record = {}; + vars.put("from_type", "level_upgrade"); + vars.put("memo", "会员升级奖励"); + + for (const level of upgrade) { + if (ObjectUtil.isNotEmpty(level.getLevelGifts()) && JSONUtil.isJson(level.getLevelGifts())) { + coreMemberService.memberGiftGrant(siteId, memberId, JSONUtil.parseObj(level.getLevelGifts()), vars); + } + } + + const end: MemberLevel = upgrade.get(upgrade.size() - 1); + member.setMemberLevel(end.getLevelId()); + memberMapper.updateById(member); + } + } catch (Exception e) { + log.info("会员检测升级异常"); + e.printStackTrace(); + } } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/member/impl/core-member-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/member/impl/core-member-service-impl.service.ts index 677f26c0..d9afab36 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/member/impl/core-member-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/member/impl/core-member-service-impl.service.ts @@ -14,103 +14,330 @@ export class CoreMemberServiceImplService { * getMember */ async getMember(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + queryWrapper.eq("site_id", siteId); + queryWrapper.eq("member_id", memberId); + return memberMapper.selectOne(queryWrapper); } /** * createMemberNo */ async createMemberNo(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const site: Site = siteMapper.selectById(siteId); + const memberConfig: MemberConfigVo = coreMemberConfigService.getMemberConfig(siteId); + + const no: string = (site.getMemberNo() + 1) + ""; + const memberNo: string = memberConfig.getPrefix() + (memberConfig.getPrefix().length() > memberConfig.getLength() ? no : StringUtils.leftPad(no, memberConfig.getLength() - memberConfig.getPrefix().length(), "0")); + + const member: Member = memberMapper.selectOne(new QueryWrapper() + .eq("site_id", siteId).eq("member_no", memberNo).last("limit 1")); + + if (member == null) { + return memberNo; + } + + site.setMemberNo(number.parseInt(no)); + siteMapper.updateById(site); + + return this.createMemberNo(siteId); } /** * getMemberCount */ async getMemberCount(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + if (ObjectUtil.isNotEmpty(memberStatSearchParam.getSiteId())) { + queryWrapper.eq("site_id", memberStatSearchParam.getSiteId()); + } + if (ObjectUtil.isNotNull(memberStatSearchParam.getCreateTime())) { + String[] createTime = memberStatSearchParam.getCreateTime(); + const startTime: number = (createTime[0] == "") ? 0 : DateUtils.StringToTimestamp(createTime[0]); + const endTime: number = (createTime[1] == "") ? 0 : DateUtils.StringToTimestamp(createTime[1]); + if (startTime > 0 && endTime > 0) { + queryWrapper.between("create_time", startTime, endTime); + } else if (startTime > 0 && endTime == 0) { + queryWrapper.ge("create_time", startTime); + } else if (startTime == 0 && endTime > 0) { + queryWrapper.le("create_time", endTime); + } + } + if (ObjectUtil.isNotNull(memberStatSearchParam.getSex())) { + queryWrapper.eq("sex", memberStatSearchParam.getSex()); + } + if (ObjectUtil.isNotNull(memberStatSearchParam.getLastVisitTime())) { + String[] lastVisitTime = memberStatSearchParam.getLastVisitTime(); + const startLastVisitTime: number = (lastVisitTime[0] == "") ? 0 : DateUtils.StringToTimestamp(lastVisitTime[0]); + const endLastVisitTime: number = (lastVisitTime[1] == "") ? 0 : DateUtils.StringToTimestamp(lastVisitTime[1]); + if (startLastVisitTime > 0 && endLastVisitTime > 0) { + queryWrapper.between("last_visit_time", startLastVisitTime, endLastVisitTime); + } else if (startLastVisitTime > 0 && endLastVisitTime == 0) { + queryWrapper.ge("last_visit_time", startLastVisitTime); + } else if (startLastVisitTime == 0 && endLastVisitTime > 0) { + queryWrapper.le("last_visit_time", endLastVisitTime); + } + } + const memberCount: number = memberMapper.selectCount(queryWrapper); + return memberCount.intValue(); } /** * getGiftContent */ async getGiftContent(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + if (gifts == null) gifts = new Record(); + + const giftEnum: Record = GiftEnum.getType(); + + for (const key of gifts.keySet()) { + try { + const config: Record = gifts.getJSONObject(key); + const driver: string = giftEnum.getByPath(key + ".content." + scene + ".driver"); + if (config.getInt("is_use") != null && config.getInt("is_use") > 0 && driver != null && !driver.length === 0) { + Class clazz = ClassLoaderUtil.loadClass(driver); + const obj: any = clazz.getDeclaredConstructor().newInstance(); + const method: Method = clazz.getMethod("content", number.class, Record.class, String.class); + Object[] params = {siteId, config, scene}; + const content: any = method.invoke(obj, params); + gifts.putByPath(key + ".content", content); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + return gifts; } /** * getBenefitsContent */ async getBenefitsContent(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + if (benefits == null) benefits = new Record(); + const benefitsEnum: Record = BenefitsEnum.getType(); + + for (const key of benefits.keySet()) { + try { + const config: Record = benefits.getJSONObject(key); + const driver: string = benefitsEnum.getByPath(key + ".content." + scene + ".driver"); + if (config.getInt("is_use") != null && config.getInt("is_use") > 0 && driver != null && !driver.length === 0) { + Class clazz = ClassLoaderUtil.loadClass(driver); + const obj: any = clazz.getDeclaredConstructor().newInstance(); + const method: Method = clazz.getMethod("content", number.class, Record.class, String.class); + Object[] params = {siteId, config, scene}; + const content: any = method.invoke(obj, params); + benefits.putByPath(key + ".content", content); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + return benefits; } /** * getGrowthRuleContent */ async getGrowthRuleContent(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const growthRuleEnum: Record = GrowthRuleEnum.getType(); + + for (const key of rules.keySet()) { + try { + const config: Record = rules.getJSONObject(key); + const driver: string = growthRuleEnum.getByPath(key + ".content." + scene + ".driver"); + if (config.getInt("is_use") != null && config.getInt("is_use") > 0 && driver != null && !driver.length === 0) { + Class clazz = ClassLoaderUtil.loadClass(driver); + const obj: any = clazz.getDeclaredConstructor().newInstance(); + const method: Method = clazz.getMethod("content", number.class, Record.class, String.class); + Object[] params = {siteId, config, scene}; + const content: any = method.invoke(obj, params); + rules.putByPath(key + ".content", content); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + return rules; } /** * getPointGrantRuleContent */ async getPointGrantRuleContent(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const pointRuleEnum: Record = PointRuleEnum.getType().getJSONObject("grant"); + + for (const key of rules.keySet()) { + try { + const config: Record = rules.getJSONObject(key); + const driver: string = pointRuleEnum.getByPath(key + ".content." + scene + ".driver"); + if (config.getInt("is_use") != null && config.getInt("is_use") > 0 && driver != null && !driver.length === 0) { + Class clazz = ClassLoaderUtil.loadClass(driver); + const obj: any = clazz.getDeclaredConstructor().newInstance(); + const method: Method = clazz.getMethod("content", number.class, Record.class, String.class); + Object[] params = {siteId, config, scene}; + const content: any = method.invoke(obj, params); + rules.putByPath(key + ".content", content); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + return rules; } /** * getPointConsumeRuleContent */ async getPointConsumeRuleContent(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const pointRuleEnum: Record = PointRuleEnum.getType().getJSONObject("consume"); + + for (const key of rules.keySet()) { + try { + const config: Record = rules.getJSONObject(key); + const driver: string = pointRuleEnum.getByPath(key + ".content." + scene + ".driver"); + if (config.getInt("is_use") != null && config.getInt("is_use") > 0 && driver != null && !driver.length === 0) { + Class clazz = ClassLoaderUtil.loadClass(driver); + const obj: any = clazz.getDeclaredConstructor().newInstance(); + const method: Method = clazz.getMethod("content", number.class, Record.class, String.class); + Object[] params = {siteId, config, scene}; + const content: any = method.invoke(obj, params); + rules.putByPath(key + ".content", content); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + return rules; } /** * sendGrowth */ async sendGrowth(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const ruleConfig: Record = coreMemberConfigService.getGrowthRuleConfig(siteId); + if (ruleConfig == null) return; + + const config: Record = ruleConfig.getJSONObject(key); + if (config == null || config.getInt("is_use", 0) === 0) return; + + const rule: Record = GrowthRuleEnum.getType().getJSONObject(key); + if (rule == null) return; + + const driver: string = ObjectUtil.defaultIfNull(rule.getByPath("calculate.driver", String.class), ""); + if (driver.length === 0) return; + + try { + Class clazz = ClassLoaderUtil.loadClass(driver); + const obj: any = clazz.getDeclaredConstructor().newInstance(); + const method: Method = clazz.getMethod("calculate", number.class, String.class, Record.class, Map.class); + Object[] params = {siteId, key, config, data}; + const growth: any = method.invoke(obj, params); + + if (growth instanceof number && growth > 0) { + const accountData: number = number.parseDouble(growth.toString()); + coreMemberAccountService.addLog(siteId, memberId, AccountTypeEnum.GROWTH.getType(), accountData, String.valueOf(ObjectUtil.defaultIfNull(data.get("from_type"), "")), String.valueOf(ObjectUtil.defaultIfNull(data.get("memo"), "")), String.valueOf(ObjectUtil.defaultIfNull(data.get("related_id"), ""))); + } + } catch (Exception e) { + console.log("成长值发放异常"); + e.printStackTrace(); + } } /** * sendPoint */ async sendPoint(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const ruleConfig: Record = coreMemberConfigService.getPointRuleConfig(siteId).getJSONObject("grant"); + if (ruleConfig == null) return; + + const config: Record = ruleConfig.getJSONObject(key); + if (config == null || config.getInt("is_use", 0) === 0) return; + + const rule: Record = PointRuleEnum.getType().getJSONObject("grant"); + if (rule == null) return; + + const driver: string = ObjectUtil.defaultIfNull(rule.getByPath(key + ".calculate.driver", String.class), ""); + if (driver.length === 0) return; + + try { + Class clazz = ClassLoaderUtil.loadClass(driver); + const obj: any = clazz.getDeclaredConstructor().newInstance(); + const method: Method = clazz.getMethod("calculate", number.class, String.class, Record.class, Map.class); + Object[] params = {siteId, key, config, data}; + const growth: any = method.invoke(obj, params); + + if (growth instanceof number && growth > 0) { + const accountData: number = number.parseDouble(growth.toString()); + coreMemberAccountService.addLog(siteId, memberId, AccountTypeEnum.POINT.getType(), accountData, String.valueOf(ObjectUtil.defaultIfNull(data.get("from_type"), "")), String.valueOf(ObjectUtil.defaultIfNull(data.get("memo"), "")), String.valueOf(ObjectUtil.defaultIfNull(data.get("related_id"), ""))); + } + } catch (Exception e) { + console.log("积分发放异常"); + e.printStackTrace(); + } } /** * memberGiftGrant */ async memberGiftGrant(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + if (gifts == null) return; + + const giftEnum: Record = GiftEnum.getType(); + + try { + for (const key of gifts.keySet()) { + const config: Record = gifts.getJSONObject(key); + const driver: string = giftEnum.getByPath(key + ".grant.driver"); + if (config.getInt("is_use") != null && config.getInt("is_use") > 0 && driver != null && !driver.length === 0) { + Class clazz = ClassLoaderUtil.loadClass(driver); + const obj: any = clazz.getDeclaredConstructor().newInstance(); + const method: Method = clazz.getMethod("grant", number.class, number.class, Record.class, Map.class); + Object[] params = {siteId, memberId, config, vars}; + method.invoke(obj, params); + } + } + } catch (Exception e) { + e.printStackTrace(); + console.log("会员礼包发放失败"); + } } /** * getInfoByMemberId */ async getInfoByMemberId(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const member: Member = memberMapper.selectOne(new QueryWrapper().eq("site_id", siteId).eq("member_id", memberId)); + return member; } /** * getMemberInfo */ async getMemberInfo(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const member: Member = memberMapper.selectById(memberId); + const result: MemberInfoDto = new MemberInfoDto(); + BeanUtils.copyProperties(member, result); + if((member.getHeadimg( && member.getHeadimg(.trim() !== ''))){ + result.setHeadimgSmall(CommonUtils.thumbImageSmall(member.getSiteId(), member.getHeadimg())); + result.setHeadimgMiddle(CommonUtils.thumbImageMiddle(member.getSiteId(), member.getHeadimg())); + result.setHeadimgBig(CommonUtils.thumbImageBig(member.getSiteId(), member.getHeadimg())); + } + const label: MemberLabelInfoVo = new MemberLabelInfoVo(); + const level: MemberLevelInfoVo = new MemberLevelInfoVo(); + try { + label = memberLabelService.info(memberId); + level = memberLevelService.info(memberId); + } catch (Exception e) { + log.error("获取会员标签或会员等级失败:{}", e.getMessage()); + } finally { + result.setLabelInfo(label); + result.setLevelInfo(level); + } + return result; } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/notice/impl/core-notice-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/notice/impl/core-notice-service-impl.service.ts index 806c9956..8053b29d 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/notice/impl/core-notice-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/notice/impl/core-notice-service-impl.service.ts @@ -14,63 +14,161 @@ export class CoreNoticeServiceImplService { * setCoreSiteService */ async setCoreSiteService(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + this.coreNoticeService = coreNoticeService; } /** * find */ async find(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const queryWrapper: QueryWrapper = new QueryWrapper(); + queryWrapper.eq("site_id", siteId); + queryWrapper.eq("`key`", key); + const sysNotice: SysNotice = sysNoticeMapper.selectOne(queryWrapper); + return sysNotice; } /** * getAddonList */ async getAddonList(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const list: SysNotice[] = sysNoticeMapper.selectList(new QueryWrapper().eq("site_id", siteId)); + const map: Record = {}; + if (ObjectUtil.isNotNull(list)) { + for (const item of list) { + map.put(item.getKey(), item); + } + } + const notice: Record = {}; + for (Map.Entry noticeMap : NoticeEnum.getNotice().entrySet()) { + + const vo: NoticeInfoVo = new NoticeInfoVo(); + BeanUtil.copyProperties(noticeMap.getValue(), vo); + if (map.containsKey(noticeMap.getKey())) { + BeanUtil.copyProperties(map.get(noticeMap.getKey()), vo); + } + + //针对短信,微信公众号,小程序配置 + if (ObjectUtil.isNotEmpty(noticeMap.getValue().getSupport_type_map())) { + for (Map.Entry> supportTypeMap : noticeMap.getValue().getSupport_type_map().entrySet()) { + if (supportTypeMap.getKey() === "sms") { + vo.setSms(supportTypeMap.getValue()); + } + if (supportTypeMap.getKey() === "wechat") { + vo.setWechat(supportTypeMap.getValue()); + } + if (supportTypeMap.getKey() === "weapp") { + vo.setWeapp(supportTypeMap.getValue()); + } + + } + } + notice.put(noticeMap.getKey(), vo); + } + + const addonList: Addon[] = coreSiteService.getSiteAddons(siteId); + const adminAddon: Addon = new Addon(); + adminAddon.setKey("system"); + adminAddon.setTitle("系统"); + addonList.add(0, adminAddon); + const noticeAddonList: AddonNoticeListVo[] = []; + for (const addon of addonList) { + const noticeListVo: AddonNoticeListVo = new AddonNoticeListVo(); + noticeListVo.setKey(addon.getKey()); + noticeListVo.setTitle(addon.getTitle()); + noticeListVo.setNotice([]); + for (Map.Entry noticeMap : notice.entrySet()) { + if (noticeListVo.getKey() === noticeMap.getValue(.getAddon())) { + noticeListVo.getNotice().add(noticeMap.getValue()); + } + } + noticeAddonList.add(noticeListVo); + } + return noticeAddonList; } /** * getInfo */ async getInfo(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + if (!NoticeEnum.getNotice().containsKey(key)) throw new BadRequestException("消息类型不存在"); + + const vo: NoticeInfoVo = new NoticeInfoVo(); + const notice: NoticeEnumListVo = NoticeEnum.getNotice().get(key); + BeanUtil.copyProperties(notice, vo); + + for (const type of notice.getSupport_type_map().keySet()) { + ReflectCallField.setForInstance(vo, type, notice.getSupport_type_map().get(type)); + } + + const model: SysNotice = sysNoticeMapper.selectOne(new QueryWrapper().eq("site_id", siteId).eq("`key`", key)); + if (model != null) { + BeanUtil.copyProperties(model, vo); + } + + return vo; } /** * edit */ async edit(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const queryWrapper: QueryWrapper = new QueryWrapper(); + queryWrapper.eq("`key`", key); + queryWrapper.eq("site_id", siteId); + + const model: SysNotice = sysNoticeMapper.selectOne(queryWrapper); + if (ObjectUtil.isNotEmpty(model)) { + const sysNotice: SysNotice = JSONUtil.toBean(data, SysNotice.class); + sysNoticeMapper.update(sysNotice, queryWrapper); + } else { + const sysNotice: SysNotice = JSONUtil.toBean(data, SysNotice.class); + sysNotice.setSiteId(siteId); + const noticeEnum: NoticeEnumListVo = NoticeEnum.getNotice().get(key); + BeanUtil.copyProperties(noticeEnum, sysNotice); + sysNoticeMapper.insert(sysNotice); + } } /** * send */ async send(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const notice: NoticeInfoVo = getInfo(siteId, key); + if (notice == null) return; + + if (notice.getAsync()) { + coreNoticeService.asyncSend(siteId, notice, data); + } else { + syncSend(siteId, notice, data); + } } /** * syncSend */ async syncSend(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + SendNoticeEventDefiner.const event: SendNoticeEvent = new SendNoticeEventDefiner.SendNoticeEvent(); + event.setSiteId(siteId); + event.addAppSign("core"); + event.setName("SendNoticeEvent"); + event.setKey(notice.getKey()); + event.setNoticeData(NoticeLoader.getDriver(notice.getKey()).noticeData(data)); + event.setNotice(notice); + EventAndSubscribeOfPublisher.publishAndCallback(event); } /** * asyncSend */ async asyncSend(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + SendNoticeEventDefiner.const event: SendNoticeEvent = new SendNoticeEventDefiner.SendNoticeEvent(); + event.setSiteId(siteId); + event.addAppSign("core"); + event.setName("SendNoticeEvent"); + event.setKey(notice.getKey()); + event.setNoticeData(NoticeLoader.getDriver(notice.getKey()).noticeData(data)); + event.setNotice(notice); + EventAndSubscribeOfPublisher.publishAndCallback(event); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/notice/impl/core-notice-sms-log-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/notice/impl/core-notice-sms-log-service-impl.service.ts index 51e736ff..5d2e1c5c 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/notice/impl/core-notice-sms-log-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/notice/impl/core-notice-sms-log-service-impl.service.ts @@ -14,39 +14,44 @@ export class CoreNoticeSmsLogServiceImplService { * list */ async list(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return []; + const page: number = pageParam.getPage(); + const limit: number = pageParam.getLimit(); + + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + queryWrapper.orderByDesc("id"); + + const iPage: IPage = sysNoticeSmsLogMapper.selectPage(new Page<>(page, limit), queryWrapper); + return PageResult.build(page, limit, iPage.getTotal()).setData(iPage.getRecords()); } /** * info */ async info(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: SysNoticeSmsLog = sysNoticeSmsLogMapper.selectOne( + new QueryWrapper() + .eq("id", id)); + return model; } /** * add */ async add(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + sysNoticeSmsLogMapper.insert(addParam); } /** * edit */ async edit(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + sysNoticeSmsLogMapper.updateById(editParam); } /** * del */ async del(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + sysNoticeSmsLogMapper.deleteById(id); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/pay/impl/core-pay-channel-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/pay/impl/core-pay-channel-service-impl.service.ts index 0d6aabb8..9f3b4e03 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/pay/impl/core-pay-channel-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/pay/impl/core-pay-channel-service-impl.service.ts @@ -14,31 +14,69 @@ export class CorePayChannelServiceImplService { * setCorePayService */ async setCorePayService(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + this.corePayService = corePayService; } /** * find */ async find(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const queryWrapper: QueryWrapper = new QueryWrapper(); + queryWrapper.select("config"); + queryWrapper.eq("site_id", siteId); + queryWrapper.eq("type", type); + queryWrapper.eq("channel", channel); + queryWrapper.eq("status", 1); + return payChannelMapper.selectOne(queryWrapper); } /** * getAllowPayTypeByChannel */ async getAllowPayTypeByChannel(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const list: PayTypeVo[] = []; + + const payChannelList: PayChannel[] = payChannelMapper.selectList(new QueryWrapper() + .select("site_id, type, config") + .eq("site_id", siteId) + .eq("status", 1) + .eq("channel", channel)); + + for (const item of payChannelList) { + if (item.getConfig().isEmpty()) continue; + const type: PayTypeVo = corePayService.driver(siteId, channel, item.getType()).filterPayTypeByTradeType(tradeType); + if (type != null) { + type.setConfig(item.getConfig()); + list.add(type); + } + } + + return list; } /** * getConfigByChannelAndType */ async getConfigByChannelAndType(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const payChannel: PayChannel = payChannelMapper.selectOne(new QueryWrapper() + .select("config") + .eq("site_id", siteId) + .eq("channel", channel) + .eq("status", 1) + .eq("type", type)); + + if (payChannel == null || payChannel.getConfig().isEmpty()) return null; + + const config: Record = JSONUtil.parseObj(payChannel.getConfig()); + + if (type === "wechatpay") { + const wechatConfig: WechatConfigVo = coreWechatConfigService.getWechatConfig(siteId); + const weappConfig: WeappConfigVo = coreWeappConfigService.getWeappConfig(siteId); + config.set("mp_app_id", ObjectUtil.defaultIfNull(wechatConfig.getAppId(), "")); + config.set("mini_app_id", ObjectUtil.defaultIfNull(weappConfig.getAppId(), "")); + config.set("app_id", ""); + } + + return config; } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/pay/impl/core-pay-event-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/pay/impl/core-pay-event-service-impl.service.ts index 72ab569f..6bdc8d39 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/pay/impl/core-pay-event-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/pay/impl/core-pay-event-service-impl.service.ts @@ -14,39 +14,108 @@ export class CorePayEventServiceImplService { * list */ async list(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return []; + const page: number = pageParam.getPage(); + const limit: number = pageParam.getLimit(); + + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + queryWrapper.orderByDesc("id"); + + const iPage: IPage = payRefundMapper.selectPage(new Page<>(page, limit), queryWrapper); + const list: PayRefundListVo[] = []; + for (const item of iPage.getRecords()) { + const vo: PayRefundListVo = new PayRefundListVo(); + BeanUtils.copyProperties(item, vo); + list.add(vo); + } + return PageResult.build(page, limit, iPage.getTotal()).setData(list); } /** * info */ async info(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: PayRefund = payRefundMapper.selectOne( + new QueryWrapper() + .eq("id", id) + .last("limit 1")); + + Assert.notNull(model, "数据不存在"); + + const vo: PayRefundInfoVo = new PayRefundInfoVo(); + BeanUtils.copyProperties(model, vo); + return vo; } /** * add */ async add(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: PayRefund = new PayRefund(); + model.setSiteId(addParam.getSiteId()); + model.setRefundNo(addParam.getRefundNo()); + model.setOutTradeNo(addParam.getOutTradeNo()); + model.setType(addParam.getType()); + model.setChannel(addParam.getChannel()); + model.setMoney(addParam.getMoney()); + model.setReason(addParam.getReason()); + model.setStatus(addParam.getStatus()); + model.setCreateTime(System.currentTimeMillis() / 1000); + model.setRefundTime(addParam.getRefundTime()); + model.setCloseTime(addParam.getCloseTime()); + model.setFailReason(addParam.getFailReason()); + model.setVoucher(addParam.getVoucher()); + model.setTradeType(addParam.getTradeType()); + model.setTradeId(addParam.getTradeId()); + model.setRefundType(addParam.getRefundType()); + model.setMainType(addParam.getMainType()); + model.setMainId(addParam.getMainId()); + model.setPayRefundNo(addParam.getPayRefundNo()); + payRefundMapper.insert(model); } /** * edit */ async edit(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: PayRefund = payRefundMapper.selectOne( + new QueryWrapper() + .eq("id", id) + .last("limit 1")); + + Assert.notNull(model, "数据不存在!"); + model.setId(id); + model.setSiteId(editParam.getSiteId()); + model.setRefundNo(editParam.getRefundNo()); + model.setOutTradeNo(editParam.getOutTradeNo()); + model.setType(editParam.getType()); + model.setChannel(editParam.getChannel()); + model.setMoney(editParam.getMoney()); + model.setReason(editParam.getReason()); + model.setStatus(editParam.getStatus()); + model.setRefundTime(editParam.getRefundTime()); + model.setCloseTime(editParam.getCloseTime()); + model.setFailReason(editParam.getFailReason()); + model.setVoucher(editParam.getVoucher()); + model.setTradeType(editParam.getTradeType()); + model.setTradeId(editParam.getTradeId()); + model.setRefundType(editParam.getRefundType()); + model.setMainType(editParam.getMainType()); + model.setMainId(editParam.getMainId()); + model.setPayRefundNo(editParam.getPayRefundNo()); + payRefundMapper.updateById(model); } /** * del */ async del(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: PayRefund = payRefundMapper.selectOne( + new QueryWrapper() + .eq("id", id) + .last("limit 1")); + + Assert.notNull(model, "数据不存在!"); + + payRefundMapper.delete(new QueryWrapper().eq("id", id)); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/pay/impl/core-pay-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/pay/impl/core-pay-service-impl.service.ts index 46a594c2..2ff273dd 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/pay/impl/core-pay-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/pay/impl/core-pay-service-impl.service.ts @@ -14,127 +14,273 @@ export class CorePayServiceImplService { * pay */ async pay(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const pay: Pay = this.checkOrCreate(param.getSiteId(), param.getTradeType(), param.getTradeId()); + if (pay.getBody().length() > 15) { + pay.setBody(pay.getBody().substring(0, 15) + "..."); + } + param.setPay(pay); + param.setNotifyUrl(buildNotifyUrl(param.getSiteId(), param.getChannel(), param.getType(), "pay")); + + const driver: BasePay = this.driver(param.getSiteId(), param.getChannel(), param.getType()); + + const json: Record = {}; + json.put("openid", param.getOpenid()); + pay.setJson(JSONUtil.toJsonStr(json)); + this.payMapper.updateById(pay); + + return driver.pay(param); } /** * asyncNotify */ async asyncNotify(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return this.driver(param.getSiteId(), param.getChannel(), param.getType()).asyncNotify(param, request, response); } /** * payNotify */ async payNotify(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const pay: Pay = this.findPayInfoByOutTradeNo(param.getSiteId(), param.getOutTradeNo()); + if (pay == null) throw new BadRequestException("未获取到支付单据"); + if (pay.getStatus() === PayStatusEnum.STATUS_FINISH.getCode()) throw new BadRequestException("单据已支付"); + if (pay.getStatus() === PayStatusEnum.STATUS_CANCLE.getCode()) throw new BadRequestException("当前支付已取消"); + + // 支付成功 + if (param.getPayStatus().getStatus() === OnliepayStatusEnum.SUCCESS.getStatus()) { + this.paySuccess(pay, param); + } + // 支付关闭 + if (param.getPayStatus().getStatus() === OnliepayStatusEnum.CLOSED.getStatus()) { + this.payClose(param.getSiteId(), pay); + } } /** * buildNotifyUrl */ async buildNotifyUrl(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + String[] param = {siteId.toString(), channel, type, action}; + const baseUrl: string = ""; + if (RequestUtils.handler() != null) { + baseUrl = RequestUtils.getDomain(true); + cached.put("payBaseurl", baseUrl); + } else if (cached.get("payBaseurl") != null) { + baseUrl = cached.get("payBaseurl"); + } else { + throw new BadRequestException("build notify url error"); + } + return baseUrl + "/api/pay/notify/" + String.join("/", param); } /** * checkOrCreate */ async checkOrCreate(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const pay: Pay = this.findPayInfoByTrade(siteId, tradeType, tradeId); + if (pay == null) { + return this.createByTrade(siteId, tradeType, tradeId); + } + if (pay.getStatus() === PayStatusEnum.STATUS_FINISH.getCode()) throw new BadRequestException("当前支付已完成"); + if (pay.getStatus() === PayStatusEnum.STATUS_ING.getCode() || pay.getStatus() === PayStatusEnum.STATUS_CANCLE.getCode()) { + if (pay.getStatus() === PayStatusEnum.STATUS_ING.getCode()) { + this.close(siteId, pay); + } + return this.createByTrade(siteId, tradeType, tradeId); + } + return pay; } /** * driver */ async driver(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const config: Record = ObjectUtil.defaultIfNull(corePayChannelService.getConfigByChannelAndType(siteId, channel, type), new Record()); + return PayLoader.getDriver(type).init(config); } /** * getInfoByTrade */ async getInfoByTrade(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const pay: Pay = findPayInfoByTrade(siteId, tradeType, tradeId); + + if (pay == null) { + pay = createByTrade(siteId, tradeType, tradeId); + } + + const vo: GetInfoByTradeVo = new GetInfoByTradeVo(); + BeanUtil.copyProperties(pay, vo); + + const payTypeList: PayTypeVo[] = corePayChannelService.getAllowPayTypeByChannel(siteId, channel, tradeType); + vo.setPayTypeList(payTypeList); + + if (ObjectUtil.isNotEmpty(payTypeList) && ObjectUtil === scene, "friendspay") { + payTypeList.stream() + .filter(pt => pt.getKey() === "friendspay") + .findFirst() + .ifPresent(payTypeVo => vo.setConfig(JSONUtil.parseObj(payTypeVo.getConfig()))); + vo.setPayTypeList(payTypeList.stream().filter(pt => !pt.getKey() === "friendspay").toList()); + } + + return vo; } /** * findPayInfoByTrade */ async findPayInfoByTrade(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return payMapper.selectOne(new QueryWrapper() + .eq("site_id", siteId) + .eq("trade_type", tradeType) + .eq("trade_id", tradeId) + .ne("status", PayStatusEnum.STATUS_CANCLE.getCode()) + ); } /** * findPayInfoByOutTradeNo */ async findPayInfoByOutTradeNo(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return payMapper.selectOne(new QueryWrapper() + .eq("site_id", siteId) + .eq("out_trade_no", outTradeNo) + ); } /** * createByTrade */ async createByTrade(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + PayCreateEventDefiner.const event: PayCreateEvent = new PayCreateEventDefiner.PayCreateEvent(); + event.setSiteId(siteId); + event.addAppSign("core"); + event.setName("PayCreateEvent"); + event.setTradeType(tradeType); + event.setTradeId(tradeId); + const eventData: PayCreateEventDefiner.PayCreateEventResult[] = EventAndSubscribeOfPublisher.publishAndCallback(event); + + if (eventData.size() == 0) throw new BadRequestException("无效的交易类型"); + PayCreateEventDefiner.const data: PayCreateEventResult = eventData.get(0); + + const model: Pay = new Pay(); + BeanUtil.copyProperties(data, model); + model.setSiteId(siteId); + model.setTradeType(tradeType); + model.setTradeId(tradeId); + model.setOutTradeNo(createOutTradeNo()); + model.setCreateTime(System.currentTimeMillis() / 1000); + model.setChannel(RequestUtils.channel()); + payMapper.insert(model); + + return this.findPayInfoByOutTradeNo(siteId, model.getOutTradeNo()); } /** * paySuccess */ async paySuccess(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + BeanUtil.copyProperties(param, pay); + pay.setStatus(PayStatusEnum.STATUS_FINISH.getCode()); + pay.setPayTime(System.currentTimeMillis() / 1000); + + payMapper.updateById(pay); + + const event: PaySuccessEvent = new PaySuccessEvent(); + event.setSiteId(param.getSiteId()); + event.addAppSign("core"); + event.setName("PaySuccessEvent"); + event.setTradeType(pay.getTradeType()); + event.setTradeId(pay.getTradeId()); + event.setPay(pay); + EventAndSubscribeOfPublisher.publishAll(event); + + const printParam: SysPrinterPrintTicketParam = new SysPrinterPrintTicketParam(); + printParam.setSiteId(pay.getSiteId()); + printParam.setType("shopGoodsOrder"); + printParam.setTrigger("pay_after"); + SysPrinterPrintTicketParam.const business: Business = new SysPrinterPrintTicketParam.Business(); + business.setOrderId(pay.getTradeId()); + printParam.setBusiness(business); + corePrinterService.printTicket(printParam); } /** * payClose */ async payClose(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + pay.setStatus(PayStatusEnum.STATUS_CANCLE.getCode()); + pay.setCancelTime(System.currentTimeMillis() / 1000); + payMapper.updateById(pay); + + const event: PayCloseEvent = new PayCloseEvent(); + event.setSiteId(siteId); + event.addAppSign("core"); + event.setName("PayCloseEvent"); + event.setTradeType(pay.getTradeType()); + event.setTradeId(pay.getTradeId()); + EventAndSubscribeOfPublisher.publishAll(event); } /** * close */ async close(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const pay: Pay = this.findPayInfoByOutTradeNo(siteId, outTradeNo); + if (pay == null) throw new BadRequestException("无效的支付交易号"); + if (pay.getStatus() === PayStatusEnum.STATUS_CANCLE.getCode()) return; + if (!pay.getStatus() === PayStatusEnum.STATUS_ING.getCode() && !pay.getStatus() === PayStatusEnum.STATUS_WAIT.getCode()) { + throw new BadRequestException("只有待支付时可以关闭"); + } + + if (pay.getStatus() === PayStatusEnum.STATUS_ING.getCode() && !pay.getType().isEmpty()) { + this.driver(siteId, pay.getChannel(), pay.getType()).close(pay); + } + + this.payClose(siteId, pay); } /** * closeByTrade */ async closeByTrade(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const pay: Pay = findPayInfoByTrade(siteId, tradeType, tradeId); + if (pay == null) return; + + if (pay.getStatus() === PayStatusEnum.STATUS_ING.getCode() || pay.getStatus() === PayStatusEnum.STATUS_WAIT.getCode()) { + this.close(siteId, pay); + } } /** * getPayTypeByTrade */ async getPayTypeByTrade(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return corePayChannelService.getAllowPayTypeByChannel(siteId, channel.getCode(), tradeType); } /** * create */ async create(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + // 生成订单号 + const outTradeNo: string = com.niu.core.common.utils.CommonUtils.createNo(); + // 创建支付对象 + const pay: Pay = new Pay(); + pay.setSiteId(siteId); + pay.setMoney(money); + pay.setTradeType(tradeType); + pay.setTradeId(tradeId); + pay.setBody(body); + pay.setOutTradeNo(outTradeNo); + pay.setMainId(mainId); + pay.setFromMainId(mainId); + pay.setMainType(mainType); + + // 保存到数据库 + payMapper.insert(pay); + + return pay; } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/pay/impl/core-refund-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/pay/impl/core-refund-service-impl.service.ts index 708bc90e..46c29926 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/pay/impl/core-refund-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/pay/impl/core-refund-service-impl.service.ts @@ -14,47 +14,123 @@ export class CoreRefundServiceImplService { * create */ async create(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const pay: Pay = payMapper.selectOne(new QueryWrapper().eq("site_id", param.getSiteId()).eq("out_trade_no", param.getOutTradeNo())); + if (pay == null) throw new BadRequestException("无效的支付交易号"); + if (param.getMoney().compareTo(new BigDecimal(0)) <= 0) throw new BadRequestException("退款金额需大于0元"); + + const model: PayRefund = new PayRefund(); + model.setSiteId(param.getSiteId()); + model.setMoney(param.getMoney()); + model.setType(pay.getType()); + model.setChannel(pay.getChannel()); + model.setOutTradeNo(pay.getOutTradeNo()); + model.setRefundNo(createRefundNo()); + model.setReason(param.getReason()); + model.setTradeType(param.getTradeType()); + model.setTradeId(param.getTradeId()); + model.setStatus(RefundStatusEnum.WAIT.getStatus()); + model.setCreateTime(System.currentTimeMillis() / 1000); + + payRefundMapper.insert(model); + return model.getRefundNo(); } /** * refund */ async refund(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const refund: PayRefund = this.findPayInfoByOutTradeNo(param.getSiteId(), param.getRefundNo()); + if (refund == null) throw new BadRequestException("无效的退款单据"); + + const pay: Pay = payMapper.selectOne(new QueryWrapper().eq("site_id", refund.getSiteId()).eq("out_trade_no", refund.getOutTradeNo())); + if (pay == null) throw new BadRequestException("无效的支付交易号"); + + if (param.getRefundType() === RefundTypeEnum.BACK.getKey()) { + const refundParam: RefundParam = new RefundParam(); + refundParam.setSiteId(param.getSiteId()); + refundParam.setRefundNo(param.getRefundNo()); + refundParam.setOutTradeNo(refund.getOutTradeNo()); + refundParam.setMoney(refund.getMoney()); + refundParam.setTotal(pay.getMoney()); + refundParam.setNotifyUrl(corePayService.buildNotifyUrl(param.getSiteId(), refund.getChannel(), refund.getType(), "refund")); + corePayService.driver(param.getSiteId(), refund.getChannel(), refund.getType()).refund(refundParam); + } else if (param.getRefundType() === RefundTypeEnum.OFFLINE.getKey()) { + refund.setVoucher(param.getVoucher()); + this.payRefundMapper.updateById(refund); + const notifyParam: RefundNotifyParam = new RefundNotifyParam(); + notifyParam.setRefundNo(param.getRefundNo()); + notifyParam.setSiteId(param.getSiteId()); + notifyParam.setOutTradeNo(refund.getOutTradeNo()); + notifyParam.setType(param.getRefundType()); + notifyParam.setRefundStatus(RefundTransferStatusEnum.SUCCESS); + refundNotify(notifyParam); + } } /** * findPayInfoByOutTradeNo */ async findPayInfoByOutTradeNo(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return payRefundMapper.selectOne(new QueryWrapper() + .eq("site_id", siteId) + .eq("refund_no", refundNo) + ); } /** * refundNotify */ async refundNotify(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const refund: PayRefund = findPayInfoByOutTradeNo(param.getSiteId(), param.getRefundNo()); + if (refund == null) throw new BadRequestException("退款单据不存在"); + if (!refund.getStatus() === RefundStatusEnum.WAIT.getStatus() && !refund.getStatus() === RefundStatusEnum.DEALING.getStatus()) { + throw new BadRequestException("退款状态已发生变化"); + } + + refund.setRefundType(param.getType()); + + // 退款成功 + if (param.getRefundStatus().getStatus() === RefundTransferStatusEnum.SUCCESS.getStatus()) { + this.refundSuccess(param.getSiteId(), refund); + } + // 退款失败 + if (param.getRefundStatus().getStatus() === RefundTransferStatusEnum.ABNORMAL.getStatus()) { + this.refundFail(param.getSiteId(), refund); + } } /** * refundSuccess */ async refundSuccess(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + refund.setStatus(RefundStatusEnum.SUCCESS.getStatus()); + refund.setRefundTime(System.currentTimeMillis() / 1000); + payRefundMapper.updateById(refund); + + const event: RefundSuccessEvent = new RefundSuccessEvent(); + event.setSiteId(siteId); + event.addAppSign("core"); + event.setTradeType(refund.getTradeType()); + event.setTradeId(refund.getTradeId()); + event.setRefund(refund); + event.setName("RefundSuccessEvent"); + EventAndSubscribeOfPublisher.publishAll(event); } /** * refundFail */ async refundFail(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + refund.setStatus(RefundStatusEnum.FAIL.getStatus()); + payRefundMapper.updateById(refund); + + const event: RefundFailEvent = new RefundFailEvent(); + event.setSiteId(siteId); + event.addAppSign("core"); + event.setTradeType(refund.getTradeType()); + event.setTradeId(refund.getTradeId()); + event.setRefund(refund); + event.setName("RefundFailEvent"); + EventAndSubscribeOfPublisher.publishAll(event); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/pay/impl/core-transfer-scene-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/pay/impl/core-transfer-scene-service-impl.service.ts index 0e2776ed..5640e1b6 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/pay/impl/core-transfer-scene-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/pay/impl/core-transfer-scene-service-impl.service.ts @@ -14,31 +14,57 @@ export class CoreTransferSceneServiceImplService { * getWechatTransferSceneConfig */ async getWechatTransferSceneConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const config: Record = coreConfigService.getConfigValue(siteId, ConfigKeyEnum.path.basename(WECHAT_TRANSFER_SCENE_CONFIG)); + if (ObjectUtil.isNull(config)) return new Record(); + return config; } /** * setWechatTransferSceneConfig */ async setWechatTransferSceneConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + coreConfigService.setConfig(siteId, ConfigKeyEnum.path.basename(WECHAT_TRANSFER_SCENE_CONFIG), data); } /** * setTradeScene */ async setTradeScene(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const tradeScene: PayTransferScene = payTransferSceneMapper.selectOne(new QueryWrapper().eq("site_id", siteId).eq("type", type)); + + const model: PayTransferScene = new PayTransferScene(); + model.setSiteId(siteId); + model.setType(type); + model.setPerception(param.getPerception()); + model.setScene(param.getScene()); + model.setInfos(param.getInfos().toString()); + + if (tradeScene == null) { + model.setCreateTime(System.currentTimeMillis() / 1000); + payTransferSceneMapper.insert(model); + } else { + model.setId(tradeScene.getId()); + payTransferSceneMapper.updateById(model); + } } /** * getSceneInfoByType */ async getSceneInfoByType(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const tradeScene: PayTransferScene = payTransferSceneMapper.selectOne(new QueryWrapper().eq("site_id", siteId).eq("type", type)); + + const vo: TransferSceneInfo = new TransferSceneInfo(); + if (tradeScene == null) { + const transferScene: Record = JsonModuleLoader.build().mergeResultElement(RequestUtils.siteId(), "pay/wechat_transfer_scene.json"); + vo = JSONUtil.toBean(transferScene.getJSONObject(type), TransferSceneInfo.class); + } else { + BeanUtil.copyProperties(tradeScene, vo); + } + + const config: Record = getWechatTransferSceneConfig(siteId); + vo.setSceneId(config.getStr(vo.getScene(), "")); + + return vo; } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/pay/impl/core-transfer-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/pay/impl/core-transfer-service-impl.service.ts index 75f5969a..4a170986 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/pay/impl/core-transfer-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/pay/impl/core-transfer-service-impl.service.ts @@ -14,47 +14,128 @@ export class CoreTransferServiceImplService { * create */ async create(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + model.setTransferNo(createTransferNo()); + model.setTransferStatus(TransferStatusEnum.WAIT.getStatus()); + model.setCreateTime(System.currentTimeMillis() / 1000); + payTransferMapper.insert(model); + return model.getTransferNo(); } /** * findTransferByTransferNo */ async findTransferByTransferNo(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return payTransferMapper.selectOne(new QueryWrapper() + .eq("site_id", siteId) + .eq("transfer_no", transferNo)); } /** * transfer */ async transfer(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const transfer: PayTransfer = findTransferByTransferNo(siteId, transferNo); + if (transfer == null) throw new BadRequestException("无效的转账单据"); + if (!transfer.getTransferStatus() === TransferStatusEnum.WAIT.getStatus() && !transfer.getTransferStatus() === TransferStatusEnum.FAIL.getStatus()) { + throw new BadRequestException("当前转账未处于待转账状态"); + } + + transfer.setTransferType(transferType); + transfer.setTransferRemark(data.getOrDefault("transfer_remark", "")); + transfer.setTransferVoucher(data.getOrDefault("transfer_voucher", "")); + transfer.setTransferRealname(data.getOrDefault("transfer_realname", "")); + transfer.setTransferBank(data.getOrDefault("transfer_bank", "")); + transfer.setTransferMobile(data.getOrDefault("transfer_mobile", "")); + transfer.setTransferAccount(data.getOrDefault("transfer_account", "")); + transfer.setOpenid(data.getOrDefault("openid", "")); + transfer.setTransferPayee(data.getOrDefault("transfer_payee", "")); + transfer.setTransferPaymentCode(data.getOrDefault("transfer_payment_code", "")); + payTransferMapper.updateById(transfer); + + const transferTypeEnum: Record = TransferTypeEnum.getMap().get(transferType); + if (transferTypeEnum == null) throw new BadRequestException("不支持的转账方式"); + + if ((Boolean) transferTypeEnum.get("is_online")) { + const param: TransferParam = new TransferParam(); + param.setTransfer(transfer); + param.setNotifyUrl(corePayService.buildNotifyUrl(siteId, "transfer", transferType, "transfer")); + return corePayService.driver(siteId, "transfer", transferType).transfer(param); + } + this.success(transfer); + return null; } /** * transferNotify */ async transferNotify(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const transfer: PayTransfer = findTransferByTransferNo(param.getSiteId(), param.getTransferNo()); + if (transfer == null) throw new BadRequestException("无效的转账单据"); + if (!transfer.getTransferStatus() === TransferStatusEnum.WAIT.getStatus() && !transfer.getTransferStatus() === TransferStatusEnum.FAIL.getStatus()) { + throw new BadRequestException("当前转账未处于待转账状态"); + } + + if (param.getTransferStatus().getStatus() === TransferStatusEnum.SUCCESS.getStatus()) { + this.success(transfer); + } else if (param.getTransferStatus().getStatus() === TransferStatusEnum.FAIL.getStatus()) { + transfer.setTransferFailReason(param.getFailReason()); + this.fail(transfer); + } else { + transfer.setTransferStatus(param.getTransferStatus().getStatus()); + this.dealing(transfer); + } } /** * cancel */ async cancel(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const transfer: PayTransfer = findTransferByTransferNo(siteId, transferNo); + if (transfer == null) throw new BadRequestException("无效的转账单据"); + + String[] status = new String[]{ + TransferStatusEnum.WAIT.getStatus(), + TransferStatusEnum.DEALING.getStatus(), + TransferStatusEnum.FAIL.getStatus(), + TransferStatusEnum.WAIT_USER.getStatus(), + TransferStatusEnum.WAIT_USER_ING.getStatus(), + TransferStatusEnum.FAIL_ING.getStatus() + }; + if (!ObjectUtil.includes(status, transfer.getTransferStatus())) { + throw new BadRequestException("转账状态已发生变化"); + } + + corePayService.driver(siteId, "transfer", transfer.getTransferType()).transferCancel(transferNo); } /** * check */ async check(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const transfer: PayTransfer = findTransferByTransferNo(siteId, transferNo); + if (transfer == null) throw new BadRequestException("无效的转账单据"); + + String[] status = new String[]{ + TransferStatusEnum.WAIT.getStatus(), + TransferStatusEnum.DEALING.getStatus(), + TransferStatusEnum.FAIL.getStatus(), + TransferStatusEnum.WAIT_USER.getStatus(), + TransferStatusEnum.WAIT_USER_ING.getStatus(), + TransferStatusEnum.FAIL_ING.getStatus() + }; + if (!ObjectUtil.includes(status, transfer.getTransferStatus())) { + throw new BadRequestException("只有待转账和转账中的订单可以校验"); + } + + const transferResult: TransferQueryVo = corePayService.driver(siteId, "transfer", transfer.getTransferType()).transferQuery(transferNo); + if (transferResult == null) throw new BadRequestException("查询不到转账信息"); + + const param: TransferNotifyParam = new TransferNotifyParam(); + param.setSiteId(siteId); + param.setTransferNo(transferNo); + param.setTransferStatus(transferResult.getTransferSatus()); + param.setFailReason(ObjectUtil.defaultIfNull(transferResult.getFailReason(), "")); + + transferNotify(param); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/poster/impl/core-poster-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/poster/impl/core-poster-service-impl.service.ts index 7a26a1be..65273ddd 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/poster/impl/core-poster-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/poster/impl/core-poster-service-impl.service.ts @@ -14,31 +14,108 @@ export class CorePosterServiceImplService { * get */ async get(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const query: QueryWrapper = new QueryWrapper<>(); + query.eq("site_id", param.getSiteId()); + query.eq("type", param.getType()); + query.eq("status", 1); + query.last("limit 1"); + if (ObjectUtil.isNotEmpty(param.getId()) && param.getId() > 0) { + query.eq("id", param.getId()); + } else { + query.eq("is_default", 1); + } + const model: SysPoster = sysPosterMapper.selectOne(query); + + try { + // 海报模板 + const poster: Record = new Record(); + if (model == null) { + const template: JSONArray = template("", param.getType()); + if (template.size() > 0) { + poster = template.getJSONObject(0).getJSONObject("data"); + } + } else { + poster = JSONUtil.parseObj(model.getValue()); + } + + // 获取海报数据 + GetPosterDataEventDefiner.const event: GetPosterDataEvent = new GetPosterDataEventDefiner.GetPosterDataEvent(); + event.setSiteId(param.getSiteId()); + event.addAppSign("core"); + event.setName("GetPosterDataEvent"); + event.setType(param.getType()); + event.setParam(param.getParam()); + event.setChannel(param.getChannel()); + const eventData: GetPosterDataEventDefiner.GetPosterDataResult[] = EventAndSubscribeOfPublisher.publishAndCallback(event); + if (eventData.size() == 0) throw new BadRequestException("未获取到海报数据"); + + GetPosterDataEventDefiner.const posterData: GetPosterDataResult = eventData.get(0); + + const dir: string = "upload/poster/" + param.getSiteId() + "/"; + const posterName: string = "poster_" + SecureUtil.md5(poster.toString()) + "_" + SecureUtil.md5(JSONUtil.parseObj(posterData).toString()) + "_" + param.getChannel() + ".png"; + + if (this.config.get('webRootDownResource', dir + posterName).exists()) { + return dir + posterName; + } + + // 绘制海报 + create(param.getSiteId(), poster, posterData.getData(), dir, posterName); + return dir + posterName; + } catch (Exception e) { + console.log("海报生成错误"); + e.printStackTrace(); + if (param.getIsThrowException()) throw new BadRequestException(e.getMessage()); + return ""; + } } /** * template */ async template(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const template: final JSONArray = new JSONArray(); + if (ObjectUtil.isNotEmpty(addon)) { + const coreTemplate: JSONArray = JsonModuleLoader.build().findResultSet("code", "poster/template.json"); + coreTemplate.stream().forEach(e => template.add(e)); + + const addonTemplate: JSONArray = JsonModuleLoader.build().findResultSet(addon, "poster/template.json"); + addonTemplate.stream().forEach(e => template.add(e)); + } else { + const all: JSONArray = JsonModuleLoader.build().mergeResultSet("poster/template.json"); + all.stream().forEach(e => template.add(e)); + } + + if (ObjectUtil.isNotEmpty(type) && template.size() > 0) { + return CollUtil.filter(template, i => { + const item: Record = (Record) i; + return item.getStr("type", "") === type; + }); + } + + return template; } /** * add */ async add(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const sysPoster: SysPoster = new SysPoster(); + BeanUtils.copyProperties(param, sysPoster); + sysPosterMapper.insert(sysPoster); } /** * getDefaultPosterIdByType */ async getDefaultPosterIdByType(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const queryWrapper: QueryWrapper = new QueryWrapper<>(); + queryWrapper.eq("site_id", siteId) + .eq("type", type) + .eq("addon", addon) + .eq("is_default", 1) + .eq("status", 1); + + const poster: SysPoster = sysPosterMapper.selectOne(queryWrapper); + return poster != null ? poster.getId() : 0; } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/schedule/impl/core-schedule-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/schedule/impl/core-schedule-service-impl.service.ts index 53f97f39..91a8a52a 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/schedule/impl/core-schedule-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/schedule/impl/core-schedule-service-impl.service.ts @@ -14,39 +14,118 @@ export class CoreScheduleServiceImplService { * installSystemSchedule */ async installSystemSchedule(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const jsonModuleLoader: JsonModuleLoader = new JsonModuleLoader(); + const schedule: JSONArray = jsonModuleLoader.getResultSet("core", "schedule.json"); + + if (ObjectUtil.isNotEmpty(schedule)) { + const scheduleList: SysSchedule[] = sysScheduleMapper.selectList(new QueryWrapper().eq("addon", "").select("id,`key`")); + const scheduleMap: Record = scheduleList.stream().collect(Collectors.toMap(SysSchedule::getKey, i => i)); + + const list: SysSchedule[] = []; + + for (const i of number = 0; i < schedule.size(); i++) { + const item: Record = schedule.getJSONObject(i); + const key: string = item.getStr("key"); + if (scheduleMap.get(key) == null) { + const sysScheduleVo: SysSchedule = JSONUtil.toBean(item, SysSchedule.class); + sysScheduleVo.setAddon(""); + sysScheduleVo.setStatus(1); + list.add(sysScheduleVo); + } + } + + if (list.size() > 0) { + for (const sysScheduleVo of list) { + try { + QuartzJobManager.stopJob(sysScheduleVo.getKey()); + QuartzJobManager.startJob(sysScheduleVo); + } catch (Exception e) { + } + } + super.saveBatch(list); + } + } } /** * uninstallSystemSchedule */ async uninstallSystemSchedule(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + sysScheduleMapper.delete(new QueryWrapper().eq("addon", "")); } /** * installAddonSchedule */ async installAddonSchedule(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + Map> addonModule = AddonModuleContext.getAddonModuleMap(); + const schedule: JSONArray = null; + if (addonModule.get(addon) != null) { + const jsonModuleLoader: JsonModuleLoader = new JsonModuleLoader(); + schedule = jsonModuleLoader.getResultSet(addon, "schedule.json"); + } else { + const file: string = this.config.get('webRootDownAddon' + addon + "/java/src/main/resources/"+ addon +"/loader/schedule.json"); + if (fs.existsSync(file)) { + try { + const content: string = FileUtils.readFileToString(file); + if (ObjectUtil.isNotEmpty(content)) { + schedule = JSONUtil.parseArray(content); + } + } catch (Exception e) { + } + } + } + + if (ObjectUtil.isNotEmpty(schedule)) { + const scheduleList: SysSchedule[] = sysScheduleMapper.selectList(new QueryWrapper().eq("addon", addon).select("id,`key`")); + const scheduleMap: Record = scheduleList.stream().collect(Collectors.toMap(SysSchedule::getKey, i => i)); + + const list: SysSchedule[] = []; + + for (const i of number = 0; i < schedule.size(); i++) { + const item: Record = schedule.getJSONObject(i); + const key: string = item.getStr("key"); + if (scheduleMap.get(key) == null) { + const sysScheduleVo: SysSchedule = JSONUtil.toBean(item, SysSchedule.class); + sysScheduleVo.setAddon(addon); + sysScheduleVo.setStatus(1); + list.add(sysScheduleVo); + } + } + + if (list.size() > 0) { + for (const sysScheduleVo of list) { + try { + QuartzJobManager.stopJob(sysScheduleVo.getKey()); + QuartzJobManager.startJob(sysScheduleVo); + } catch (Exception e) { + } + } + super.saveBatch(list); + } + } } /** * uninstallAddonSchedule */ async uninstallAddonSchedule(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + sysScheduleMapper.delete(new QueryWrapper().eq("addon", addon)); } /** * resetSchedule */ async resetSchedule(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + try { + sysScheduleMapper.delete(new QueryWrapper()); + installSystemSchedule(); + const addonList: Addon[] = addonMapper.selectList(new LambdaQueryWrapper().eq(Addon::getStatus, 1)); + addonList.forEach(addon => { + installAddonSchedule(addon.getKey()); + }); + } catch (Exception e) { + throw new BadRequestException(e.getMessage()); + } } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/site/impl/core-site-account-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/site/impl/core-site-account-service-impl.service.ts index 389a3171..b75cabb1 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/site/impl/core-site-account-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/site/impl/core-site-account-service-impl.service.ts @@ -14,23 +14,41 @@ export class CoreSiteAccountServiceImplService { * addPayLog */ async addPayLog(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: SiteAccountLog = new SiteAccountLog(); + model.setSiteId(pay.getSiteId()); + model.setType("pay"); + model.setMoney(pay.getMoney()); + model.setTradeNo(pay.getOutTradeNo()); + model.setCreateTime(System.currentTimeMillis() / 1000); + siteAccountLogMapper.insert(model); + return model.getId(); } /** * addRefundLog */ async addRefundLog(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: SiteAccountLog = new SiteAccountLog(); + model.setSiteId(refund.getSiteId()); + model.setType("refund"); + model.setMoney(refund.getMoney().multiply(new BigDecimal("-1"))); + model.setTradeNo(refund.getRefundNo()); + model.setCreateTime(System.currentTimeMillis() / 1000); + siteAccountLogMapper.insert(model); + return model.getId(); } /** * addTransferLog */ async addTransferLog(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: SiteAccountLog = new SiteAccountLog(); + model.setSiteId(transfer.getSiteId()); + model.setType("transfer"); + model.setMoney(transfer.getMoney().multiply(new BigDecimal("-1"))); + model.setTradeNo(transfer.getTransferNo()); + model.setCreateTime(System.currentTimeMillis() / 1000); + siteAccountLogMapper.insert(model); + return model.getId(); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/site/impl/core-site-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/site/impl/core-site-service-impl.service.ts index fa76d95c..1f45f8ad 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/site/impl/core-site-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/site/impl/core-site-service-impl.service.ts @@ -14,63 +14,168 @@ export class CoreSiteServiceImplService { * getAddonKeysBySiteId */ async getAddonKeysBySiteId(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return cached.rememberObject(useCache, cacheTagName + "_" + siteId, Arrays.asList("getAddonKeysBySiteId", siteId), uniqueKey => { + + const siteInfo: Site = siteMapper.selectById(siteId); + if (ObjectUtil.isNull(siteInfo)) { + return []; + } + //查询站点分组 + const siteGroup: SiteGroup = siteGroupMapper.selectById(siteInfo.getGroupId()); + const siteAddonJson: JSONArray = new JSONArray(); + if (!siteInfo.getAddons() === "") { + const addonJson: JSONArray = JSONUtil.parseArray(siteInfo.getAddons()); + siteAddonJson.addAll(addonJson); + } + if (!siteInfo.getApp() === "") { + const appJson: JSONArray = JSONUtil.parseArray(siteInfo.getApp()); + siteAddonJson.addAll(appJson); + } + if (ObjectUtil.isNotNull(siteGroup)) { + if (!siteGroup.getApp() === "") { + const groupAppJson: JSONArray = JSONUtil.parseArray(siteGroup.getApp()); + siteAddonJson.addAll(groupAppJson); + } + if (!siteGroup.getAddon() === "") { + const groupAddonJson: JSONArray = JSONUtil.parseArray(siteGroup.getAddon()); + siteAddonJson.addAll(groupAddonJson); + } + } + //去重 + const list: string[] = JSONUtil.toList(siteAddonJson, String.class); + return CollectionUtil.distinct(list); + }); } /** * getSiteCache */ async getSiteCache(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const siteCache: SiteInfoCacheVo = cached.rememberObject(useCache, cacheTagName + "_" + siteId, Arrays.asList("getSiteCache", siteId), uniqueKey => { + MPJQueryWrapper siteMPJQueryWrapper = new MPJQueryWrapper<>(); + siteMPJQueryWrapper.select("ns.site_id, ns.site_name, ns.group_id, ns.keywords, ns.app_type, ns.logo, ns.`desc`, ns.status, ns.latitude, ns.longitude, ns.province_id, ns.city_id, ns.district_id, ns.address, ns.full_address, ns.phone, ns.business_hours, ns.create_time, ns.expire_time, ns.front_end_name, ns.front_end_logo, ns.front_end_icon, ns.icon, ns.member_no, ns.app, ns.addons, ns.initalled_addon, ns.site_domain, nsg.group_name") + .setAlias("ns") + .leftJoin("?_site_group nsg ON ns.group_id = nsg.group_id".replace("?_", this.config.get('tablePrefix'))); + siteMPJQueryWrapper.eq("ns.site_id", siteId); + + return siteMapper.selectJoinOne(SiteInfoCacheVo.class, siteMPJQueryWrapper); + + }); + const siteInfoVo: SiteInfoVo = new SiteInfoVo(); + if (ObjectUtil.isNotEmpty(siteCache)) { + BeanUtil.copyProperties(siteCache, siteInfoVo); + siteInfoVo.setAddonKeys(getAddonKeysBySiteId(siteInfoVo.getSiteId())); + if (siteInfoVo.getAddonKeys().size() != 0) { + siteInfoVo.setSiteAddons(addonService.getAddonListByKeys(siteInfoVo.getAddonKeys(), "")); + siteInfoVo.setApps(addonService.getAddonListByKeys(siteInfoVo.getAddonKeys(), AddonActionEnum.APP.getCode())); + }else{ + siteInfoVo.setSiteAddons([]); + siteInfoVo.setApps([]); + } + const sysUserRole: SysUserRole = sysUserRoleMapper.selectOne(new QueryWrapper().select("uid").eq("site_id", siteId).eq("is_admin", 1)); + if (ObjectUtil.isNotEmpty(sysUserRole)) { + siteInfoVo.setUid(sysUserRole.getUid()); + } + } + return siteInfoVo; } /** * getSiteAddons */ async getSiteAddons(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return addonMapper.selectList(new QueryWrapper().in("`key`", getAddonKeysBySiteId(siteId))); } /** * siteAddonIsInit */ async siteAddonIsInit(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const count: number = siteAddonInitRecordMapper.selectCount(new QueryWrapper().eq("site_id", siteId).eq("addon", addon)); + const count: return = = 1 ? true : false; } /** * addSiteAddonInitRecord */ async addSiteAddonInitRecord(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: SiteAddonInitRecord = new SiteAddonInitRecord(); + model.setSiteId(siteId); + model.setAddon(addon); + siteAddonInitRecordMapper.insert(model); } /** * siteExpireClose */ async siteExpireClose(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: Site = new Site(); + model.setStatus(SiteStatusEnum.EXPIRE.getCode()); + siteMapper.update(model, new QueryWrapper() + .gt("expire_time", 0) + .lt("expire_time", System.currentTimeMillis() / 1000) + .ne("status", SiteStatusEnum.EXPIRE.getCode()) + ); } /** * clearSiteCache */ async clearSiteCache(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + cached.tag(cacheTagName + "_" + siteId).clear(); } /** * siteInitBySiteId */ async siteInitBySiteId(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const userIds: number[] = []; + try { + for (const table of tables) { + if (!isTableExists(table)) { + continue; + } + + if ("nc_sys_user_role" === table) { + const queryWrapper: LambdaQueryWrapper = new LambdaQueryWrapper() + .eq(SysUserRole::getSiteId, siteId) + .eq(SysUserRole::getIsAdmin, 0) + .select(SysUserRole::getUid); + + userIds = sysUserRoleMapper.selectList(queryWrapper).stream() + .map(SysUserRole::getUid) + .collect(Collectors.toList()); + + if (!userIds.length === 0) { + sysUserRoleMapper.delete(queryWrapper); + } + } + else if ("nc_sys_user" === table) { + if (!userIds.length === 0) { + sysUserMapper.deleteByIds(userIds); + } + } + else { + jdbcTemplate.update("DELETE FROM " + table + " const site_id: WHERE = ?", siteId); + } + } + + const site: Site = siteMapper.selectById(siteId); + const siteGroup: SiteGroup = siteGroupMapper.selectById(site.getGroupId()); + + const event: SiteAddAfterEvent = new SiteAddAfterEvent(); + event.setSiteId(siteId); + event.addAppSign("core"); + event.setName("SiteAddAfterEvent"); + event.setSite(site); + event.setSiteGroup(siteGroup); + EventAndSubscribeOfPublisher.publishAll(event); + + // 清除缓存 + cached.getAllKeys().stream().forEach(key => cached.remove(key)); + return true; + } catch (Exception e) { + throw new BadRequestException("站点初始化失败: " + e.getMessage()); + } } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/sms/impl/core-sms-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/sms/impl/core-sms-service-impl.service.ts index 8326b083..6d8cdbd8 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/sms/impl/core-sms-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/sms/impl/core-sms-service-impl.service.ts @@ -14,7 +14,30 @@ export class CoreSmsServiceImplService { * send */ async send(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const config: Record = this.getDefaultSmsConfig(siteId); + + const model: SysNoticeSmsLog = new SysNoticeSmsLog(); + model.setSiteId(siteId); + model.setMobile(noticeData.getMobile()); + model.setSmsType(config.getStr("sms_type")); + model.setKey(notice.getKey()); + model.setContent(notice.getSms().getStr("content", "")); + model.setStatus(SmsStatusEnum.SENDING.getStatus()); + model.setCreateTime(System.currentTimeMillis() / 1000); + model.setParams(JSONUtil.parse(noticeData.getVars()).toString()); + sysNoticeSmsLogMapper.insert(model); + + const smsDriver: BaseSms = SmsLoader.getDriver(config.getStr("sms_type"), config); + const result: SendResultVo = smsDriver.send(notice, noticeData); + + const updateModel: SysNoticeSmsLog = new SysNoticeSmsLog(); + updateModel.setId(model.getId()); + updateModel.setStatus(result.getStatus().getStatus()); + updateModel.setResult(ObjectUtil.defaultIfNull(result.getFailReason(), "")); + sysNoticeSmsLogMapper.updateById(updateModel); + + if (result.getStatus().getStatus() === SmsStatusEnum.FAIL.getStatus()) { + throw new BadRequestException(updateModel.getResult()); + } } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/sys/impl/core-agreement-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/sys/impl/core-agreement-service-impl.service.ts index cb7fa8a1..f8a9439f 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/sys/impl/core-agreement-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/sys/impl/core-agreement-service-impl.service.ts @@ -14,15 +14,39 @@ export class CoreAgreementServiceImplService { * getAgreement */ async getAgreement(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: SysAgreement = sysAgreementMapper.selectOne(new QueryWrapper().eq("agreement_key", key).eq("site_id", siteId).last(" limit 1")); + if(ObjectUtil.isNull(model)) + { + const defaultModel: SysAgreement = new SysAgreement(); + defaultModel.setSiteId(siteId); + defaultModel.setAgreementKey(key); + defaultModel.setContent(""); + defaultModel.setTitle(""); + return defaultModel; + } + return model; } /** * setAgreement */ async setAgreement(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: SysAgreement = sysAgreementMapper.selectOne(new QueryWrapper().eq("agreement_key", key).eq("site_id", siteId).last(" limit 1")); + if(ObjectUtil.isNull(model)){ + const addModel: SysAgreement = new SysAgreement(); + addModel.setSiteId(siteId); + addModel.setAgreementKey(key); + addModel.setTitle(title); + addModel.setContent(content); + addModel.setCreateTime(System.currentTimeMillis() / 1000); + addModel.setUpdateTime(System.currentTimeMillis() / 1000); + sysAgreementMapper.insert(addModel); + }else{ + model.setUpdateTime(System.currentTimeMillis() / 1000); + model.setTitle(title); + model.setContent(content); + sysAgreementMapper.updateById(model); + + } } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/sys/impl/core-config-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/sys/impl/core-config-service-impl.service.ts index f1283a79..a111293a 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/sys/impl/core-config-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/sys/impl/core-config-service-impl.service.ts @@ -14,39 +14,96 @@ export class CoreConfigServiceImplService { * getConfig */ async getConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: SysConfig = sysConfigMapper.selectOne(new QueryWrapper().eq("config_key", key).eq("site_id", siteId).last(" limit 1")); + const vo: CoreSysConfigVo = new CoreSysConfigVo(); + if (ObjectUtil.isNotNull(model)) { + BeanUtils.copyProperties(model, vo); + if (!model.getValue() === "") { + vo.setValueJson(JSONUtil.parse(model.getValue())); + } + } + return vo; } /** * getConfigValue */ async getConfigValue(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const jsonObject: any = cached.rememberObject(useCache, cacheTagName, Arrays.asList("getConfigValue", siteId, key), uniqueKey => { + + SysConfig model = sysConfigMapper.selectOne(new QueryWrapper().eq("config_key", key).eq("site_id", siteId).last(" limit 1")); + if (ObjectUtil.isNotNull(model)) { + if (!model.getValue() === "") { + return model.getValue(); + }else{ + return ""; + } + } + return ""; + }); + if(ObjectUtil.isNotEmpty(jsonObject)){ + return JSONUtil.parseObj(jsonObject); + }else{ + return new Record(); + } } /** * getConfigArrayValue */ async getConfigArrayValue(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const jsonObject: any = cached.rememberObject(useCache, cacheTagName, Arrays.asList("getConfigArrayValue", siteId, key), uniqueKey => { + SysConfig model = sysConfigMapper.selectOne(new QueryWrapper().eq("config_key", key).eq("site_id", siteId).last(" limit 1")); + if (ObjectUtil.isNotNull(model)) { + if (!model.getValue() === "") { + return model.getValue(); + }else{ + return ""; + } + } + return ""; + }); + + if(ObjectUtil.isNotEmpty(jsonObject)){ + return JSONUtil.parseArray(jsonObject.toString()); + }else{ + return new JSONArray(); + } } /** * setConfig */ async setConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: SysConfig = sysConfigMapper.selectOne( + new QueryWrapper() + .eq("config_key", key) + .eq("site_id", siteId) + .last("limit 1")); + if (ObjectUtil.isNull(model)) { + const addModel: SysConfig = new SysConfig(); + //添加数据 + addModel.setSiteId(siteId); + addModel.setConfigKey(key); + addModel.setStatus(1); + addModel.setUpdateTime(System.currentTimeMillis() / 1000); + addModel.setAddon(""); + addModel.setValue(valueJson.toString()); + addModel.setCreateTime(System.currentTimeMillis() / 1000); + sysConfigMapper.insert(addModel); + cached.tag(cacheTagName).clear(); + } else { + cached.tag(cacheTagName).clear(); + model.setUpdateTime(System.currentTimeMillis() / 1000); + model.setValue(valueJson.toString()); + sysConfigMapper.update(model, new QueryWrapper().eq("config_key", key).eq("site_id", siteId)); + } } /** * cacheClear */ async cacheClear(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + cached.tag(cacheTagName).clear(); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/sys/impl/core-export-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/sys/impl/core-export-service-impl.service.ts index 72b6c7b5..038a2a87 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/sys/impl/core-export-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/sys/impl/core-export-service-impl.service.ts @@ -14,47 +14,115 @@ export class CoreExportServiceImplService { * add */ async add(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + sysExportMapper.insert(sysExport); } /** * edit */ async edit(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const sysExport: SysExport = sysExportMapper.selectById(exportId); + + Assert.notNull(sysExport, "数据不存在"); + + sysExport.setExportKey(sysExportParam.getExportKey()); + sysExport.setExportNum(sysExportParam.getExportNum()); + sysExport.setFailReason(sysExportParam.getFailReason()); + sysExport.setFilePath(sysExportParam.getFilePath()); + sysExport.setFailReason(sysExportParam.getFailReason()); + sysExportMapper.updateById(sysExport); } /** * getExportDataColumn */ async getExportDataColumn(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const exportDataColumn: JSONArray = JsonModuleLoader.build().mergeResultSet("export/ExportType.json"); + if (ObjectUtil.isNotNull(type) && ObjectUtil.isNotEmpty(type)) { + const typeColumn: JSONArray = new JSONArray(); + for (const obj of exportDataColumn) { + const jsonObject: Record = (Record) obj; + const setString: Set = jsonObject.keySet(); + for (const key of setString) { + if (key === type) { + const values: Record = jsonObject.getJSONObject(key); + typeColumn = values.getJSONArray("column"); + } + } + } + return typeColumn; + } + return exportDataColumn; } /** * getExportData */ async getExportData(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + ExportDataEventDefiner.const exportDataEvent: ExportDataEvent = new ExportDataEventDefiner.ExportDataEvent(); + exportDataEvent.setSiteId(siteId); + exportDataEvent.setType(type); + exportDataEvent.setWhere(where); + exportDataEvent.setPageParam(pageParam); + const resultList: ExportDataEventDefiner.ExportDataEventResult[] = EventAndSubscribeOfPublisher.publishAndCallback(exportDataEvent); + const exportResult: JSONArray = new JSONArray(); + for (ExportDataEventDefiner.ExportDataEventResult itemResult : resultList) { + if (ObjectUtil.isNotEmpty(itemResult.getResultData())) { + exportResult.addAll(itemResult.getResultData()); + } + } + return exportResult; } /** * export */ async export(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const exportDynamic: ExportDynamic = new ExportDynamic(); + const fileName: string = dataType + "_" + DateUtils.currTime() + ".xlsx"; + const relativePath: string = "upload/export/"; + exportDynamic.setFileName(fileName); + const filePath: string = this.config.get('webRootDownResource') + relativePath; + exportDynamic.setFilePath(filePath); + const headsList: ExportHeads[] = new ArrayList<>(CollectionUtil.size(headColumn)); + const keyList: string[] = new ArrayList<>(CollectionUtil.size(headColumn)); + for (const headObj of headColumn) { + const itemObject: Record = (Record) headObj; + const itemKey: string = itemObject.keySet().stream().iterator().next(); + const itemValue: Record = itemObject.getJSONObject(itemKey); + const titleHead: string = itemValue.getStr("name"); + const exportHeads: ExportHeads = new ExportHeads(); + exportHeads.setLabel(titleHead); + headsList.add(exportHeads); + keyList.add(itemKey); + } + exportDynamic.setHeads(headsList); + const datas: any[][] = new ArrayList<>(CollectionUtil.size(valueData)); + for (const itemObj of valueData) { + const itemJsonObject: Record = (Record) itemObj; + const itemDatas: any[] = []; + for (const itemKey of keyList) { + itemDatas.add(itemJsonObject.getStr(itemKey, "")); + } + datas.add(itemDatas); + } + exportDynamic.setDatas(datas); + exportDynamic.setRelativePath(relativePath); + BusinessExcelUtil.exportBusinessExcel(exportId, exportDynamic); } /** * deleteExportFile */ async deleteExportFile(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return; + const path: string = this.config.get('webRootDownResource') + filePath; + if (!FileUtil.exist(path)) { + return; + } + + const del: boolean = FileUtil.del(path); + if (!del && log.isInfoEnabled()) { + log.info("报表删除失败"); + } } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/sys/impl/core-menu-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/sys/impl/core-menu-service-impl.service.ts index fe740d81..5f8ce13b 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/sys/impl/core-menu-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/sys/impl/core-menu-service-impl.service.ts @@ -14,31 +14,73 @@ export class CoreMenuServiceImplService { * refreshAddonMenu */ async refreshAddonMenu(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + this.deleteMenu(addon, false); + + const adminMenu: Record = JsonModuleLoader.build().getResultElement(addon, "menu/admin.json"); + if(ObjectUtil.isNotEmpty(adminMenu)){ + if (adminMenu.getJSONArray("menu") != null) { + const adminMenuBeanList: SysMenu[] = this.menuTreeToList(TreeUtils.treeToList(adminMenu.getJSONArray("menu"), "parent_key", "", "menu_key", "children"), addon, "admin"); + super.saveBatch(adminMenuBeanList); + } + } + const siteMenu: Record = JsonModuleLoader.build().getResultElement(addon, "menu/site.json"); + if(ObjectUtil.isNotEmpty(siteMenu)){ + if (siteMenu.getJSONArray("menu") != null) { + const siteMenuBeanList: SysMenu[] = this.menuTreeToList(TreeUtils.treeToList(siteMenu.getJSONArray("menu"), "parent_key", "", "menu_key", "children"), addon, "site"); + super.saveBatch(siteMenuBeanList); + } + } + + //清理缓存 + cached.tag(CacheTagEnum.MENU_CACHE.getTagName()).clear(); } /** * installAddonMenu */ async installAddonMenu(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + this.deleteMenu(addon, false); + + const menuDir: string = this.config.get('webRootDownAddon') + addon + "/menu/"; + const adminMenu: string = menuDir + "admin.json"; + const siteMenu: string = menuDir + "site.json"; + + if (fs.existsSync(adminMenu)) { + const jsonString: string = JsonLoadUtils.loadJsonString(adminMenu); + const menuList: Record[] = TreeUtils.treeToList(JSONUtil.parseObj(jsonString).getJSONArray("menu"), "parent_key", "", "menu_key", "children"); + const adminMenuBeanList: SysMenu[] = this.menuTreeToList(menuList, addon, "admin"); + super.saveBatch(adminMenuBeanList); + } + if (fs.existsSync(siteMenu)) { + const jsonString: string = JsonLoadUtils.loadJsonString(siteMenu); + const menuList: Record[] = TreeUtils.treeToList(JSONUtil.parseObj(jsonString).getJSONArray("menu"), "parent_key", "", "menu_key", "children"); + const siteMenuBeanList: SysMenu[] = this.menuTreeToList(menuList, addon, "site"); + super.saveBatch(siteMenuBeanList); + } + + //清理缓存 + cached.tag(CacheTagEnum.MENU_CACHE.getTagName()).clear(); } /** * deleteMenu */ async deleteMenu(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return; + const queryWrapper: QueryWrapper = new QueryWrapper() + .eq("addon", addon); + if (!isAll) queryWrapper.eq("source", "system"); + + sysMenuMapper.delete(queryWrapper); } /** * refreshAllAddonMenu */ async refreshAllAddonMenu(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + //查询所有的插件 + const addonList: Addon[] = addonMapper.selectList(new QueryWrapper()); + for (const addon of addonList) { + this.refreshAddonMenu(addon.getKey()); + } } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/sys/impl/core-printer-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/sys/impl/core-printer-service-impl.service.ts index 4bee2a06..c22831ef 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/sys/impl/core-printer-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/sys/impl/core-printer-service-impl.service.ts @@ -14,63 +14,115 @@ export class CorePrinterServiceImplService { * setYlyTokenConfig */ async setYlyTokenConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + coreConfigService.setConfig(RequestUtils.siteId(), "PRINTER_YLY_TOKEN", config); } /** * getYlyTokenConfig */ async getYlyTokenConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const config: CoreSysConfigVo = coreConfigService.getConfig(RequestUtils.siteId(), "PRINTER_YLY_TOKEN"); + if (ObjectUtil.isEmpty(config)) { + const valueJsonObject: Record = new Record(); + valueJsonObject.set("access_token", "") + .set("end_time", "0"); + return valueJsonObject; + } + + return JSONUtil.parseObj(config.getValueJson()); } /** * getYlyToken */ async getYlyToken(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return getYlyToken(id, secret, false); } /** * addPrinterYly */ async addPrinterYly(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + getSdk(param.getOpenId(), param.getApikey()) + .addPrinter(param.getPrinterCode(), param.getPrinterKey()); } /** * deletePrinterYly */ async deletePrinterYly(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return; + getSdk(printer.getOpenId(), printer.getApikey()) + .printerDeletePrinter(printer.getPrinterCode()); } /** * printTicket */ async printTicket(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const event: SysPrinterPrintTicketEvent = new SysPrinterPrintTicketEvent(); + event.setSiteId(param.getSiteId()); + event.setParam(param); + event.setAuthority(false); + const results: SysPrinterPrintTicketResult[] = CallbackPublisher.publishReturnList(event) + .stream() + .map(result => (SysPrinterPrintTicketResult) result) + .toList(); + + const vo: SysPrinterPrintTicketVo = new SysPrinterPrintTicketVo(); + const error: Optional = results.stream().filter(result => result.getCode() != 0).findFirst(); + if (error.isPresent()) { + const result: SysPrinterPrintTicketResult = error.get(); + vo.setCode(result.getCode()); + vo.setMessage(result.getMessage()); + return vo; + } + + const items: SysPrinterPrintTicketResult.Item[] = results.stream() + .flatMap(result => result.getData().stream()) + .collect(Collectors.toList()); + if (ObjectUtil.isEmpty(items)) { + vo.setCode(-1); + vo.setMessage("未找到小票模板内容"); + return vo; + } + + try { + for (SysPrinterPrintTicketResult.Item item : items) { + if (ObjectUtil.isEmpty(item.getPrinterInfo())) { + continue; + } + + const printer: SysPrinter = item.getPrinterInfo(); + if (printer == null) { + continue; + } + + if (Objects.requireNonNull(SysPrinterBrandEnum.getEnumByBrand(printer.getBrand())) == SysPrinterBrandEnum.YI_LIAN_YUN) { + const sdk: YlyPrinterSdk = getSdk(printer.getOpenId(), printer.getApikey()); + sdk.printIndex(printer.getPrinterCode(), item.getContent(), String.valueOf(item.getOriginId())); + } + } + } catch (Exception e) { + log.error(e.getMessage()); + vo.setCode(-1); + vo.setMessage(e.getMessage()); + } + + return vo; } /** * refreshToken */ async refreshToken(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return getYlyToken(printer.getOpenId(), printer.getPrinterKey(), true); } /** * printIndex */ async printIndex(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const sdk: YlyPrinterSdk = getSdk(printer.getOpenId(), printer.getApikey()); + sdk.printIndex(printer.getPrinterCode(), content, originId); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/sys/impl/core-scan-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/sys/impl/core-scan-service-impl.service.ts index 8093ed75..273ca7d8 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/sys/impl/core-scan-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/sys/impl/core-scan-service-impl.service.ts @@ -14,15 +14,25 @@ export class CoreScanServiceImplService { * scan */ async scan(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const key: string = RandomUtil.randomString(32); + data.set("status", "wait"); + data.set("is_scan", false); + data.set("action", action); + data.set("expire", DateUtils.timestampToString(System.currentTimeMillis() / 1000 + expire)); + cached.put("scan_" + key, data.toString(), expire); + return key; } /** * actionByScan */ async actionByScan(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const cache: string = cached.get("scan_" + key); + if (ObjectUtil.isNotNull(cache) && !cache.length === 0) { + const cacheData: Record = JSONUtil.parseObj(cache); + cacheData.set("is_scan", true); + cacheData = JsonModuleLoader.deepMerge(cacheData, data); + cached.put("scan_" + key, cacheData.toString()); + } } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/sys/impl/core-sys-config-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/sys/impl/core-sys-config-service-impl.service.ts index c6efff83..45e236ef 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/sys/impl/core-sys-config-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/sys/impl/core-sys-config-service-impl.service.ts @@ -14,135 +14,173 @@ export class CoreSysConfigServiceImplService { * getWebSite */ async getWebSite(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: Site = siteMapper.selectOne(new QueryWrapper().eq("site_id", siteId).last("limit 1")); + Assert.notNull(model, "站点不存在"); + + const vo: SysWebsiteVo = new SysWebsiteVo(); + BeanUtils.copyProperties(model, vo); + + const sysService: SysServiceVo = getService(siteId); + if (sysService != null) BeanUtils.copyProperties(sysService, vo); + + return vo; } /** * setWebSite */ async setWebSite(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: Site = new Site(); + model.setSiteId(siteId); + BeanUtils.copyProperties(configParam, model); + siteMapper.updateById(model); + coreSiteService.clearSiteCache(siteId); + + const service: Record = new Record(); + service.set("wechat_code", configParam.getWechatCode()); + service.set("enterprise_wechat", configParam.getEnterpriseWechat()); + service.set("tel", configParam.getTel()); + service.set("site_login_logo", configParam.getSiteLoginLogo()); + service.set("site_login_bg_img", configParam.getSiteLoginBgImg()); + coreConfigService.setConfig(siteId, "SERVICE_INFO", service); } /** * getService */ async getService(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const config: Record = coreConfigService.getConfigValue(siteId, "SERVICE_INFO"); + return JSONUtil.toBean(config, SysServiceVo.class); } /** * getCopyRight */ async getCopyRight(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const config: Record = coreConfigService.getConfigValue(siteId, "COPYRIGHT"); + return JSONUtil.toBean(config, SysCopyRightVo.class); } /** * setCopyRight */ async setCopyRight(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const json: Record = JSONUtil.parseObj(configParam); + coreConfigService.setConfig(RequestUtils.siteId(), "COPYRIGHT", json); } /** * getMap */ async getMap(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const config: Record = coreConfigService.getConfigValue(siteId, "MAPKEY"); + return JSONUtil.toBean(config, SysMapVo.class); } /** * setMap */ async setMap(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const json: Record = JSONUtil.parseObj(configParam); + coreConfigService.setConfig(RequestUtils.siteId(), "MAPKEY", json); + + if (RequestUtils.defaultSiteId() === siteId) { + this.mapKeyChange(configParam.getKey()); + } } /** * removeComments */ async removeComments(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return; + // 匹配多行注释的正则表达式 + const pattern: Pattern = Pattern.compile("/\\*.*?\\*/", Pattern.DOTALL); + const matcher: Matcher = pattern.matcher(json); + // 将匹配到的注释替换为空字符串 + const result: string = matcher.replaceAll(""); + return result; } /** * getDeveloperToken */ async getDeveloperToken(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const config: Record = coreConfigService.getConfigValue(RequestUtils.defaultSiteId(), "DEVELOPER_TOKEN"); + return JSONUtil.toBean(config, SysDeveloperTokenVo.class); } /** * setDeveloperToken */ async setDeveloperToken(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const json: Record = JSONUtil.parseObj(configParam); + coreConfigService.setConfig(RequestUtils.defaultSiteId(), "DEVELOPER_TOKEN", json); } /** * getLayout */ async getLayout(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const config: Record = coreConfigService.getConfigValue(siteId, "LAYOUT_SETTING"); + const config: return = = null ? new Record() : config; } /** * setLayout */ async setLayout(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const config: Record = this.getLayout(siteId); + config.set(configParam.getStr("key"), configParam.getStr("value")); + coreConfigService.setConfig(siteId, "LAYOUT_SETTING", config); } /** * getThemeColor */ async getThemeColor(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const config: Record = coreConfigService.getConfigValue(siteId, "THEMECOLOR_SETTING"); + const config: return = = null ? new Record() : config; } /** * setThemeColor */ async setThemeColor(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const config: Record = this.getThemeColor(siteId); + config.set(configParam.getStr("key"), configParam.getStr("value")); + coreConfigService.setConfig(siteId, "THEMECOLOR_SETTING", config); } /** * getLogin */ async getLogin(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const config: Record = coreConfigService.getConfigValue(siteId, "admin_login"); + return JSONUtil.toBean(config, SysLoginConfigVo.class); } /** * setLogin */ async setLogin(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const json: Record = JSONUtil.parseObj(configParam); + coreConfigService.setConfig(RequestUtils.siteId(), "admin_login", json); } /** * getSceneDomain */ async getSceneDomain(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const wapDomain: string = ObjectUtil.isNotEmpty(this.config.get('wapDomain')) ? this.config.get('wapDomain').replace("#/$#", "") : RequestUtils.getRequestSecure() + "://" + RequestUtils.getRequestDomain(); + + const siteInfoVo: SiteInfoVo = coreSiteService.getSiteCache(siteId); + const siteDomain: string = siteInfoVo.getSiteDomain(); + if (!siteDomain.length === 0) siteDomain = RequestUtils.getRequestSecure() + "://" + siteDomain; + + const sceneDomainVo: SceneDomainVo = new SceneDomainVo(); + sceneDomainVo.setWapDomain(wapDomain); + sceneDomainVo.setWapUrl(ObjectUtil.isNotEmpty(siteDomain) ? siteDomain + "/wap" : wapDomain + "/wap/" + siteId); + sceneDomainVo.setWebUrl(ObjectUtil.isNotEmpty(siteDomain) ? siteDomain + "/web" : wapDomain + "/web/" + siteId); + return sceneDomainVo; } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/sys/impl/core-upload-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/sys/impl/core-upload-service-impl.service.ts index 6a94be57..e57a1d2e 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/sys/impl/core-upload-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/sys/impl/core-upload-service-impl.service.ts @@ -14,23 +14,83 @@ export class CoreUploadServiceImplService { * upload */ async upload(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + // 上传相对目录 + attachmentUploadParam.setDir(this.rootPath + "/" + attachmentUploadParam.getDir()); + // 校验上传文件 + this.validate(attachmentUploadParam); + // 生成新的文件名 + this.generateNewName(attachmentUploadParam); + + const configObject: Record = null; + // 获取站点的上传配置 + if (ObjectUtil.isNotEmpty(attachmentUploadParam.getStorageType())) { + configObject = coreStorageService.getStorageByType(attachmentUploadParam.getSiteId(), attachmentUploadParam.getStorageType()); + } else { + configObject = coreStorageService.getDefaultStorage(attachmentUploadParam.getSiteId()); + if (configObject == null || StringUtil.isEmpty(configObject.getStr("storage_type"))){ + configObject = coreStorageService.getDefaultStorage(RequestUtils.defaultSiteId()); + } + } + + // 根据配置初始化 + const uploadProvider: IUploadProvider = UploadProviderFactory.createAndInit(configObject.getStr("storage_type", StorageEnum.LOCAL.getCode()), configObject.getJSONObject("config_params")); + // 构建上传参数 + const uploadModel: UploadModel = new UploadModel(); + uploadModel.setUploadFile(attachmentUploadParam.getFile()); + uploadModel.setUploadType(attachmentUploadParam.getAttType()); + uploadModel.setUploadFilePath(attachmentUploadParam.getDir()); + uploadModel.setUploadFileName(attachmentUploadParam.getNewFilename()); + // 上传操作 + const uploadModelResult: UploadModelResult = uploadProvider.upload(uploadModel); + // Service返回结果 + const attachmentUploadVo: AttachmentUploadVo = new AttachmentUploadVo(); + // 是否上传到相册 + if (attachmentUploadParam.getIsAttachment() === 1) { + const newSysAttachment: SysAttachment = this.buildSysAttachment(attachmentUploadParam, uploadModelResult); + newSysAttachment.setUrl(uploadProvider.getAccessUrl(uploadModelResult.getAccessUrl())); + sysAttachmentMapper.insert(newSysAttachment); + attachmentUploadVo.setUrl(uploadProvider.getAccessUrl(uploadModelResult.getAccessUrl())); + attachmentUploadVo.setAttId(newSysAttachment.getAttId()); + } else { + attachmentUploadVo.setUrl(uploadProvider.getAccessUrl(uploadModelResult.getAccessUrl())); + } + return attachmentUploadVo; } /** * delete */ async delete(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return; + // 获取站点的上传配置 + const coreConfigService: ICoreConfigService = SpringContext.bean(ICoreConfigService.class); + const rootJSONObject: Record = coreConfigService.getConfigValue(siteId, "STORAGE"); + const defaultValue: string = storageType; + const configObject: Record = rootJSONObject.getJSONObject(defaultValue); + // 根据配置初始化 + const uploadProvider: IUploadProvider = UploadProviderFactory.createAndInit(defaultValue, configObject); + const deleteModel: DeleteModel = new DeleteModel(); + deleteModel.setFilePath(path); + const deleteModelResult: DeleteModelResult = uploadProvider.delete(deleteModel); + if (deleteModelResult.isResult()) { + // 删除成功 -> 忽略 + } } /** * thumb */ async thumb(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + // 获取站点的上传配置 + const coreConfigService: ICoreConfigService = SpringContext.bean(ICoreConfigService.class); + const rootJSONObject: Record = coreConfigService.getConfigValue(siteId, "STORAGE"); + const defaultValue: string = rootJSONObject.getStr("default", StorageEnum.LOCAL.getCode()); + const configObject: Record = rootJSONObject.getJSONObject(defaultValue); + // 根据配置初始化 + const uploadProvider: IUploadProvider = UploadProviderFactory.createAndInit(defaultValue, configObject); + + const model: ThumbModel = new ThumbModel(); + model.setType(type); + model.setFilePath(path); + return uploadProvider.thumb(model); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/upload/impl/core-base64-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/upload/impl/core-base64-service-impl.service.ts index 6b7a1900..424e5da4 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/upload/impl/core-base64-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/upload/impl/core-base64-service-impl.service.ts @@ -14,7 +14,18 @@ export class CoreBase64ServiceImplService { * image */ async image(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + // 获取站点的上传配置 + const coreConfigService: ICoreConfigService = SpringContext.bean(ICoreConfigService.class); + const rootJSONObject: Record = coreConfigService.getConfigValue(siteId, "STORAGE"); + const defaultValue: string = rootJSONObject.getStr("default", StorageEnum.LOCAL.getCode()); + const configObject: Record = rootJSONObject.getJSONObject(defaultValue); + // 根据配置初始化 + const uploadProvider: IUploadProvider = UploadProviderFactory.createAndInit(defaultValue, configObject); + + const base64Model: Base64Model = new Base64Model(); + base64Model.setContent(content); + base64Model.setUploadFilePath("attachment/image/" + siteId + "/" + DateFormatUtils.getUploadFormat() + "/"); + base64Model.setUploadFileName(SecureUtil.md5(content) + ".jpg"); + return uploadProvider.getAccessUrl(uploadProvider.base64(base64Model)); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/upload/impl/core-fetch-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/upload/impl/core-fetch-service-impl.service.ts index fc526408..795d0323 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/upload/impl/core-fetch-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/upload/impl/core-fetch-service-impl.service.ts @@ -14,7 +14,21 @@ export class CoreFetchServiceImplService { * image */ async image(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + // 获取站点的上传配置 + const coreConfigService: ICoreConfigService = SpringContext.bean(ICoreConfigService.class); + const rootJSONObject: Record = coreConfigService.getConfigValue(siteId, "STORAGE"); + const defaultValue: string = rootJSONObject.getStr("default", StorageEnum.LOCAL.getCode()); + const configObject: Record = rootJSONObject.getJSONObject(defaultValue); + // 根据配置初始化 + const uploadProvider: IUploadProvider = UploadProviderFactory.createAndInit(defaultValue, configObject); + + const ext: string = ObjectUtil.defaultIfEmpty(url.split("\\.")[1], "jpg"); + + const fetchModel: FetchModel = new FetchModel(); + fetchModel.setUrl(url); + fetchModel.setUploadFilePath("attachment/image/" + siteId + "/" + DateFormatUtils.getUploadFormat() + "/"); + fetchModel.setUploadFileName(SecureUtil.md5(url) + "." + ext); + + return uploadProvider.getAccessUrl(uploadProvider.fetch(fetchModel)); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/upload/impl/core-storage-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/upload/impl/core-storage-service-impl.service.ts index 9b4f9fa1..542e9a82 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/upload/impl/core-storage-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/upload/impl/core-storage-service-impl.service.ts @@ -14,31 +14,81 @@ export class CoreStorageServiceImplService { * getStorageList */ async getStorageList(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + /** + * 获取配置 + */ + const storageConfig: Record = getStorageConfig(siteId); + + const storageTypeList: Record = UploadLoader.getType(); + const coreStorAgeConfigVoList: CoreStorAgeConfigVo[] = []; + for (const key of storageTypeList.keySet()) { + const storageValues: Record = JSONUtil.parseObj(storageTypeList.get(key)); + const coreStorAgeConfigVo: CoreStorAgeConfigVo = new CoreStorAgeConfigVo(); + coreStorAgeConfigVo.setStorageType(key); + coreStorAgeConfigVo.setIsUse(key === storageConfig.get("default") ? StorageEnum.ON.getCode() : StorageEnum.OFF.getCode()); + coreStorAgeConfigVo.setName(storageValues.get("name").toString()); + coreStorAgeConfigVo.setComponent(storageValues.get("component").toString()); + const params: Record = new Record(); + if (ObjectUtil.isNotNull(storageValues.get("params"))) { + const valuesParams: Record = JSONUtil.parseObj(storageValues.get("params")); + const configParams: Record = new Record(); + if (ObjectUtil.isNotNull(storageConfig.get(key))) { + configParams = JSONUtil.parseObj(storageConfig.get(key)); + } + for (const paramsKey of valuesParams.keySet()) { + const itemParam: Record = new Record(); + const paramsValues: string = valuesParams.get(paramsKey).toString(); + itemParam.set("name", paramsValues); + itemParam.set("value", configParams.get(paramsKey)); + params.set(paramsKey, itemParam); + } + params.set("config_params", configParams); + } + coreStorAgeConfigVo.setParams(params); + coreStorAgeConfigVoList.add(coreStorAgeConfigVo); + } + return coreStorAgeConfigVoList; } /** * getStorageConfig */ async getStorageConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const jsonObject: Record = coreConfigService.getConfigValue(siteId, "STORAGE"); + if (ObjectUtil.isNull(jsonObject) || ObjectUtil.isEmpty(jsonObject)) { + jsonObject = new Record(); + jsonObject.set("default", FileEnum.LOCAL.getCode()); + } + return jsonObject; } /** * getDefaultStorage */ async getDefaultStorage(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const storageList: CoreStorAgeConfigVo[] = this.getStorageList(siteId); + const config: Record = new Record(); + for (const item of storageList) { + if (item.getIsUse() === StorageEnum.ON.getCode()) { + config = item.getParams(); + config.put("storage_type", item.getStorageType()); + } + } + return config; } /** * getStorageByType */ async getStorageByType(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const storageList: CoreStorAgeConfigVo[] = this.getStorageList(siteId); + const config: Record = new Record(); + for (const item of storageList) { + if (item.getIsUse() === StorageEnum.ON.getCode() && item.getStorageType() === StorageType) { + config = item.getParams(); + config.put("storage_type", item.getStorageType()); + } + } + return config; } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/user/impl/core-user-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/user/impl/core-user-service-impl.service.ts index 0d866345..01aaaa6d 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/user/impl/core-user-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/user/impl/core-user-service-impl.service.ts @@ -14,7 +14,10 @@ export class CoreUserServiceImplService { * getUserInfo */ async getUserInfo(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const sysUser: SysUser = sysUserMapper.selectById(uid); + const result: UserInfoDto = new UserInfoDto(); + BeanUtils.copyProperties(sysUser, result); + result.setRole(userRoleService.getUserRole(RequestUtils.siteId(), uid)); + return result; } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/weapp/impl/core-weapp-cloud-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/weapp/impl/core-weapp-cloud-service-impl.service.ts index a7cf3558..84a5f0cc 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/weapp/impl/core-weapp-cloud-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/weapp/impl/core-weapp-cloud-service-impl.service.ts @@ -14,23 +14,92 @@ export class CoreWeappCloudServiceImplService { * uploadWeapp */ async uploadWeapp(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const taskKey: string = String.valueOf(System.currentTimeMillis() / 1000); + + const tempDir: string = this.config.get('webRootDownRuntime') + "weapp_build/" + taskKey + "/"; + const packageDir: string = tempDir + "package/"; + FileTools.createDirs(packageDir); + + // 整理编译文件 + const compileAddon: Addon = addonMapper.selectOne(new QueryWrapper().select("`key`").like("compile", "weapp").last("limit 1")); + if (compileAddon == null) { + handleUniapp(packageDir + "uni-app/", param); + } else { + handleCompileWeapp(packageDir + "uni-app/", compileAddon.getKey(), param); + } + + try { + FileUtils.copyFile(this.config.get('webRootDownResource' + param.getUploadPrivateKey()), packageDir + "private.key"); + } catch (Exception e) { + throw new BadRequestException(e.getMessage()); + } + + const zipFile: string = ZipUtil.zip(packageDir, tempDir + "build.zip"); + + const instance: NiucloudUtils = NiucloudUtils.getInstance(); + + const actionQuery: Record = {}; + actionQuery.put("data[product_key]", instance.getProductKey()); + const actionToken: Record = niucloudService.getActionToken("weappbuild", actionQuery); + + const query: Record = {}; + query.put("authorize_code", instance.getCode()); + query.put("compile", compileAddon != null ? 1 : 0); + query.put("appid", param.getAppId()); + query.put("version", param.getVersion()); + query.put("desc", param.getDesc()); + query.put("do", 1); + query.put("timestamp", taskKey); + query.put("token", actionToken == null ? "" : actionToken.getStr("token")); + + const response: HttpResponse = new NiucloudUtils.Cloud().useThirdBuild().build("cloud/weapp").query(query) + .func(i => { + i.form("file", zipFile, "build.zip"); + }) + .method(Method.POST).execute(); + + const res: Record = JSONUtil.parseObj(response.body()); + + if (!res.getInt("code", 0) === 1) throw new BadRequestException(res.getStr("msg")); + + return taskKey; } /** * getWeappCompileLog */ async getWeappCompileLog(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const instance: NiucloudUtils = NiucloudUtils.getInstance(); + + const query: Record = {}; + query.put("authorize_code", instance.getCode()); + query.put("timestamp", key); + + const response: HttpResponse = new NiucloudUtils.Cloud().useThirdBuild().build("cloud/get_weapp_logs").query(query).method(Method.GET).execute(); + try { + const res: Record = JSONUtil.parseObj(response.body()); + return res; + } catch (Exception e) { + return null; + } } /** * getWeappPreviewImage */ async getWeappPreviewImage(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + try { + const instance: NiucloudUtils = NiucloudUtils.getInstance(); + + const query: Record = {}; + query.put("authorize_code", instance.getCode()); + + const response: HttpResponse = new NiucloudUtils.Cloud().useThirdBuild().build("cloud/get_weapp_preview").query(query).execute(); + if (JSONUtil.isJson(response.body()) && JSONUtil.parseObj(response.body()).getInt("code") === "0") return ""; + if (checkImageType(response.bodyStream()) === "unknown") return ""; + return "data:image/"+ checkImageType(response.bodyStream()) +";base64," + Base64.getEncoder().encodeToString(response.bodyBytes()); + } catch (Exception e) { + return ""; + } } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/weapp/impl/core-weapp-config-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/weapp/impl/core-weapp-config-service-impl.service.ts index 7dd70a1e..516302ad 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/weapp/impl/core-weapp-config-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/weapp/impl/core-weapp-config-service-impl.service.ts @@ -14,31 +14,35 @@ export class CoreWeappConfigServiceImplService { * getWeappConfig */ async getWeappConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const coreSysConfigVo: CoreSysConfigVo = coreConfigService.getConfig(siteId, ConfigKeyEnum.path.basename(WEAPP)); + const vo: WeappConfigVo = new WeappConfigVo(); + if(ObjectUtil.isNotNull(coreSysConfigVo.getValueJson())) + { + vo = JSONUtil.toBean(coreSysConfigVo.getValueJson(), WeappConfigVo.class); + } + return vo; } /** * setWeappConfig */ async setWeappConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + coreConfigService.setConfig(siteId, ConfigKeyEnum.path.basename(WEAPP), JSONUtil.parseObj(weappConfigParam)); } /** * getWeappAuthorizationInfo */ async getWeappAuthorizationInfo(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const config: Record = coreConfigService.getConfigValue(siteId, ConfigKeyEnum.path.basename(WEAPP_AUTHORIZATION_INFO)); + if (config == null) return null; + return JSONUtil.toBean(config, WxOpenAuthorizerInfoResult.class); } /** * setWeappAuthorizationInfo */ async setWeappAuthorizationInfo(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + coreConfigService.setConfig(siteId, ConfigKeyEnum.path.basename(WEAPP_AUTHORIZATION_INFO), JSONUtil.parseObj(weappAuthorizationInfo)); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/weapp/impl/core-weapp-delivery-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/weapp/impl/core-weapp-delivery-service-impl.service.ts index 7eaa57da..9cbdb5a7 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/weapp/impl/core-weapp-delivery-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/weapp/impl/core-weapp-delivery-service-impl.service.ts @@ -14,39 +14,152 @@ export class CoreWeappDeliveryServiceImplService { * getIsTradeManaged */ async getIsTradeManaged(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const vo: IsTradeManagedVo = new IsTradeManagedVo(); + try { + const miniapp: WxMaService = WechatUtils.miniapp(siteId); + const appid: string = miniapp.getWxMaConfig().getAppid(); + const res: WxMaOrderShippingIsTradeManagedResponse = miniapp.getWxMaOrderShippingService().isTradeManaged(appid); + if (!res.getTradeManaged()) { + console.log("小程序未开通发货信息管理服务" + res.getErrMsg()); + } + vo.setIsTradeManaged(res.getTradeManaged()); + } catch (Exception e) { + } + return vo; } /** * setMsgJumpPath */ async setMsgJumpPath(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + try { + const config: Record = getConfig(siteId, type); + if (ObjectUtils.isEmpty(config)) { + const path: string = "app/pages/weapp/order_shipping"; + const response: WxMaOrderShippingInfoBaseResponse = WechatUtils.miniapp(siteId).getWxMaOrderShippingService().setMsgJumpPath(path); + if (response.getErrCode() == 0) { + setConfig(siteId, type, path); + } + return response; + } + + const response: WxMaOrderShippingInfoBaseResponse = new WxMaOrderShippingInfoBaseResponse(); + response.setErrCode(0); + return response; + } catch (Exception e) { + const response: WxMaOrderShippingInfoBaseResponse = new WxMaOrderShippingInfoBaseResponse(); + response.setErrCode(1); + response.setErrMsg(e.getMessage()); + return response; + } } /** * uploadShippingInfo */ async uploadShippingInfo(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + try { + log.info("PINTUAN-开始上传微信发货信息 - siteId: {}, data: {}", siteId, shippingData); + + // 获取微信支付配置 + const payChannel: PayChannel = payChannelMapper.selectOne(new LambdaQueryWrapper() + .eq(PayChannel::getSiteId, siteId) + .eq(PayChannel::getType, CertEnum.WECHATPAY.getCode()) + .eq(PayChannel::getChannel, CertEnum.WEAPP.getCode())); + + const mchId: string = ""; + if (payChannel != null && !ObjectUtils.isEmpty(payChannel.getConfig())) { + const config: string = payChannel.getConfig(); + const jsonObject: Record = JSONUtil.parseObj(config); + mchId = jsonObject.getStr("mch_id"); + } + + // 构建微信发货信息对象 + const shippingInfo: WxMaOrderShippingInfoUploadRequest = new WxMaOrderShippingInfoUploadRequest(); + + // 订单信息 + const orderKey: OrderKeyBean = new OrderKeyBean(); + orderKey.setOrderNumberType(1); + orderKey.setMchId(mchId); + orderKey.setOutTradeNo(shippingData.getOutTradeNo()); + shippingInfo.setOrderKey(orderKey); + + // 物流信息 + shippingInfo.setLogisticsType(shippingData.getLogisticsType()); + shippingInfo.setDeliveryMode(shippingData.getDeliveryMode()); + + // 处理发货列表 + const wxShippingList: ShippingListBean[] = []; + + for (WeappUploadShippingParam.UploadShippingParam item : shippingData.getShippingList()) { + const shipping: ShippingListBean = new ShippingListBean(); + BeanUtils.copyProperties(item, shipping); + + WeappUploadShippingParam.const contact: ContactInfo = item.getContact(); + if (contact != null) { + const wxContact: ContactBean = new ContactBean(); + BeanUtils.copyProperties(contact, wxContact); + shipping.setContact(wxContact); + } + + wxShippingList.add(shipping); + } + shippingInfo.setShippingList(wxShippingList); + + // 上传时间 + shippingInfo.setUploadTime(OffsetDateTime.now().format(DateTimeFormatter.ISO_OFFSET_DATE_TIME)); + + // 付款人信息 + const payer: PayerBean = new PayerBean(); + payer.setOpenid(shippingData.getWeappOpenid()); + shippingInfo.setPayer(payer); + + // 发货完成标识 + shippingInfo.setIsAllDelivered(shippingData.getIsAllDelivered()); + + log.info("PINTUAN-发货信息录入接口参数: {}", JSONUtil.toJsonStr(shippingInfo)); + + // 微信订单录入有时差,延时3秒执行 + try { + Thread.sleep(3000); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + + // 使用微信SDK调用const response: API + WxMaOrderShippingInfoBaseResponse = WechatUtils.miniapp(siteId) + .getWxMaOrderShippingService() + .upload(shippingInfo); + + log.info("PINTUAN-发货信息录入接口返回结果: {}", JSONUtil.toJsonStr(response)); + + return response; + + } catch (Exception e) { + const errorMsg: string = String.format("uploadShippingInfo报错: %s, File: %s, line: %d", + e.getMessage(), e.getStackTrace()[0].getFileName(), e.getStackTrace()[0].getLineNumber()); + log.error(errorMsg, e); + + const errorResult: WxMaOrderShippingInfoBaseResponse = new WxMaOrderShippingInfoBaseResponse(); + errorResult.setErrCode(1); + errorResult.setErrMsg(errorMsg); + return errorResult; + } } /** * getConfig */ async getConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + return coreConfigService.getConfigValue(siteId, "WEAPP_ORDER_SHIPPING_CONFIG_" + type); } /** * setConfig */ async setConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const value: Record = new Record(); + value.put("path", path); + coreConfigService.setConfig(siteId, "WEAPP_ORDER_SHIPPING_CONFIG_" + type, value); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/weapp/impl/core-weapp-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/weapp/impl/core-weapp-service-impl.service.ts index 0e76b61a..981d3e9a 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/weapp/impl/core-weapp-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/weapp/impl/core-weapp-service-impl.service.ts @@ -14,15 +14,50 @@ export class CoreWeappServiceImplService { * qrcodeBytes */ async qrcodeBytes(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + try { + const scene: string[] = []; + for (const key of data.keySet()) { + scene.add(key + "-" + data.get(key).toString()); + } + + return WechatUtils.miniapp(siteId).getQrcodeService().createWxaCodeUnlimitBytes( + String.join("&", scene), + page, + false, + "release", + width, + false, + null, + false + ); + } catch (Exception e) { + throw new BadRequestException(e.getMessage()); + } } /** * qrcodeFile */ async qrcodeFile(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + try { + const scene: string[] = []; + for (const key of data.keySet()) { + scene.add(key + "-" + data.get(key).toString()); + } + + return WechatUtils.miniapp(siteId).getQrcodeService().createWxaCodeUnlimit( + String.join("&", scene), + page, + filePath, + false, + "release", + width, + false, + null, + false + ); + } catch (Exception e) { + throw new BadRequestException(e.getMessage()); + } } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/wechat/impl/core-wechat-config-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/wechat/impl/core-wechat-config-service-impl.service.ts index b3390d29..9b2b8aaf 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/wechat/impl/core-wechat-config-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/wechat/impl/core-wechat-config-service-impl.service.ts @@ -14,31 +14,35 @@ export class CoreWechatConfigServiceImplService { * getWechatConfig */ async getWechatConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const coreSysConfigVo: CoreSysConfigVo = coreConfigService.getConfig(siteId, ConfigKeyEnum.path.basename(WECHAT)); + const vo: WechatConfigVo = new WechatConfigVo(); + if(ObjectUtil.isNotNull(coreSysConfigVo.getValueJson())) + { + vo = JSONUtil.toBean(coreSysConfigVo.getValueJson(), WechatConfigVo.class); + } + return vo; } /** * setWechatConfig */ async setWechatConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + coreConfigService.setConfig(siteId, ConfigKeyEnum.path.basename(WECHAT), JSONUtil.parseObj(wechatConfigParam)); } /** * setWechatAuthorizationInfo */ async setWechatAuthorizationInfo(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + coreConfigService.setConfig(siteId, ConfigKeyEnum.path.basename(WECHAT_AUTHORIZATION_INFO), JSONUtil.parseObj(wechatAuthorizationInfo)); } /** * getWechatAuthorizationInfo */ async getWechatAuthorizationInfo(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const config: Record = coreConfigService.getConfigValue(siteId, ConfigKeyEnum.path.basename(WECHAT_AUTHORIZATION_INFO)); + if (config == null) return null; + return JSONUtil.toBean(config, WxOpenAuthorizerInfoResult.class); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/wechat/impl/core-wechat-reply-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/wechat/impl/core-wechat-reply-service-impl.service.ts index e5139cbb..09fb5355 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/wechat/impl/core-wechat-reply-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/wechat/impl/core-wechat-reply-service-impl.service.ts @@ -14,15 +14,29 @@ export class CoreWechatReplyServiceImplService { * getDefault */ async getDefault(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: WechatReply = wechatReplyMapper.selectOne(new QueryWrapper() + .eq("reply_type", WechatReplyTypeEnum.REPLY_DEFAULT.getType()) + .eq("site_id", siteId)); + + if (!ObjectUtil.isNotNull(model)) return null; + + const vo: WechatReplyInfoVo = new WechatReplyInfoVo(); + BeanUtils.copyProperties(model, vo); + return vo; } /** * getSubscribe */ async getSubscribe(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const model: WechatReply = wechatReplyMapper.selectOne(new QueryWrapper() + .eq("reply_type", WechatReplyTypeEnum.REPLY_SUBSCRIBE.getType()) + .eq("site_id", siteId)); + + if (!ObjectUtil.isNotNull(model)) return null; + + const vo: WechatReplyInfoVo = new WechatReplyInfoVo(); + BeanUtils.copyProperties(model, vo); + return vo; } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/wxoplatform/impl/core-oplatform-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/wxoplatform/impl/core-oplatform-service-impl.service.ts index dfcac3ac..97bcf984 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/wxoplatform/impl/core-oplatform-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/wxoplatform/impl/core-oplatform-service-impl.service.ts @@ -14,7 +14,8 @@ export class CoreOplatformServiceImplService { * getSiteIdByAuthorizerAppid */ async getSiteIdByAuthorizerAppid(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + String[] configKey = new String[]{ ConfigKeyEnum.path.basename(WECHAT), ConfigKeyEnum.path.basename(WEAPP), ConfigKeyEnum.path.basename(WEAPP_AUTHORIZATION_INFO), ConfigKeyEnum.path.basename(WECHAT_AUTHORIZATION_INFO)}; + const config: SysConfig = sysConfigMapper.selectOne(new QueryWrapper().like("value", appid).in("config_key", configKey).last("limit 1")); + const config: return = = null ? 0 : config.getSiteId(); } } diff --git a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/wxoplatform/impl/core-oplatform-static-config-service-impl.service.ts b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/wxoplatform/impl/core-oplatform-static-config-service-impl.service.ts index 58941528..3754c17c 100644 --- a/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/wxoplatform/impl/core-oplatform-static-config-service-impl.service.ts +++ b/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/core/wxoplatform/impl/core-oplatform-static-config-service-impl.service.ts @@ -14,23 +14,40 @@ export class CoreOplatformStaticConfigServiceImplService { * getOplatformStaticInfo */ async getOplatformStaticInfo(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const coreOplatformStaticConfigVo: CoreOplatformStaticConfigVo = new CoreOplatformStaticConfigVo(); + coreOplatformStaticConfigVo.setAuthServeUrl(RequestUtils.getDomain(true) + "/adminapi/wxoplatform/server"); + coreOplatformStaticConfigVo.setMessageServeUrl(RequestUtils.getDomain(true) + "/adminapi/wxoplatform/message/$APPID$"); + coreOplatformStaticConfigVo.setAuthLaunchDomain(RequestUtils.getDomain(false)); + coreOplatformStaticConfigVo.setWechatAuthDomain(RequestUtils.getDomain(false)); + try { + coreOplatformStaticConfigVo.setUploadIp(InetAddress.getByName("java.oss.niucloud.com").getHostAddress()); + } catch (Exception e) { + coreOplatformStaticConfigVo.setUploadIp(""); + } + return coreOplatformStaticConfigVo; } /** * setOplatformConfig */ async setOplatformConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const jsonObject: Record = new Record(); + jsonObject.set("app_id", oplatformConfigParam.getAppId()); + jsonObject.set("app_secret", oplatformConfigParam.getAppSecret()); + jsonObject.set("token", oplatformConfigParam.getToken()); + jsonObject.set("aes_key", oplatformConfigParam.getAesKey()); + jsonObject.set("develop_app_id", oplatformConfigParam.getDevelopAppId()); + jsonObject.set("develop_upload_private_key", oplatformConfigParam.getDevelopUploadPrivateKey()); + coreConfigService.setConfig(RequestUtils.defaultSiteId(), ConfigKeyEnum.path.basename(WXOPLATFORM), jsonObject); } /** * getWxOplatformConfig */ async getWxOplatformConfig(...args: any[]): Promise { - // TODO: 实现业务逻辑 - return null; + const vo: OplatformConfigVo = new OplatformConfigVo(); + const config: Record = coreConfigService.getConfigValue(RequestUtils.defaultSiteId(), ConfigKeyEnum.path.basename(WXOPLATFORM)); + if (ObjectUtil.isNotEmpty(config)) vo = JSONUtil.toBean(config, OplatformConfigVo.class); + return vo; } }