Bläddra i källkod

✨ feat(credit-balance-module-mt): 集成飞鹅打印模块并优化打印触发逻辑

- 在credit-balance-module-mt的package.json中添加@d8d/feie-printer-module-mt依赖
- 在支付成功回调中触发打印任务,添加错误处理机制确保打印失败不影响支付流程
- 重构PrintTriggerService,移除构造函数中的feieConfig参数,改为内部动态获取配置
- 重构mini-payment-mt中的PaymentMtService,移除冗余的getFeieApiConfig和triggerPaymentSuccessEvent方法
- 统一使用PrintTriggerService的简化构造函数,优化代码结构
- 更新pnpm-lock.yaml以反映依赖变更
yourname 2 veckor sedan
förälder
incheckning
05ec5c59dd

+ 1 - 0
packages/credit-balance-module-mt/package.json

@@ -56,6 +56,7 @@
     "@d8d/delivery-address-module-mt": "workspace:*",
     "@d8d/geo-areas-mt": "workspace:*",
     "@d8d/goods-module-mt": "workspace:*",
+    "@d8d/feie-printer-module-mt": "workspace:*",
     "@hono/zod-openapi": "^1.0.2",
     "typeorm": "^0.3.20",
     "zod": "^4.1.12"

+ 16 - 0
packages/credit-balance-module-mt/src/routes/payment.mt.ts

@@ -183,6 +183,22 @@ const paymentRoutes = new OpenAPIHono<AuthContext>()
 
       await queryRunner.commitTransaction();
 
+      // 触发打印任务(在事务提交后)
+      try {
+        const { PrintTriggerService } = await import('@d8d/feie-printer-module-mt');
+        const printTriggerService = new PrintTriggerService(AppDataSource);
+        await printTriggerService.handleOrderPaymentSuccess(user.tenantId, orderId);
+        console.debug(`[租户${user.tenantId}] 打印任务触发成功,订单ID: ${orderId}`);
+      } catch (error) {
+        const errorMessage = error instanceof Error ? error.message : '未知错误';
+        if (errorMessage.includes('Cannot find package') || errorMessage.includes('ERR_MODULE_NOT_FOUND')) {
+          console.debug(`[租户${user.tenantId}] 飞鹅打印模块未安装,跳过打印任务,订单ID: ${orderId}`);
+        } else {
+          console.warn(`[租户${user.tenantId}] 触发打印任务失败,订单ID: ${orderId}:`, error);
+        }
+        // 不抛出错误,打印失败不影响支付流程
+      }
+
       const responseData = await parseWithAwait(CreditBalanceSchema, balance);
       return c.json(responseData, 200);
     } catch (error) {

+ 28 - 13
packages/feie-printer-module-mt/src/services/print-trigger.service.ts

@@ -5,28 +5,34 @@ import { DelaySchedulerService } from './delay-scheduler.service';
 import { FeieApiConfig, PrintType, PrintStatus, CancelReason } from '../types/feie.types';
 import { FeieConfigMt } from '../entities/feie-config.mt.entity';
 import { OrderMt } from '@d8d/orders-module-mt';
+import { getFeieApiConfig } from '../routes/utils/feie-config.util';
 
 /**
  * 打印触发服务
  * 负责处理订单支付成功等事件触发的打印任务
  */
 export class PrintTriggerService {
-  private printTaskService: PrintTaskService;
-  private printerService: PrinterService;
   private dataSource: DataSource;
-  private feieConfig: FeieApiConfig;
   private configRepository: any;
   private orderRepository: any;
 
-  constructor(dataSource: DataSource, feieConfig: FeieApiConfig) {
+  constructor(dataSource: DataSource) {
     this.dataSource = dataSource;
-    this.feieConfig = feieConfig;
-    this.printTaskService = new PrintTaskService(dataSource, feieConfig);
-    this.printerService = new PrinterService(dataSource, feieConfig);
     this.configRepository = dataSource.getRepository(FeieConfigMt);
     this.orderRepository = dataSource.getRepository(OrderMt);
   }
 
+  /**
+   * 获取飞鹅API配置(内部方法)
+   */
+  private async getFeieConfig(tenantId: number): Promise<FeieApiConfig> {
+    const config = await getFeieApiConfig(tenantId, this.dataSource);
+    if (!config) {
+      throw new Error(`[租户${tenantId}] 飞鹅API配置未找到或不完整`);
+    }
+    return config;
+  }
+
   /**
    * 处理订单支付成功事件
    * @param tenantId 租户ID
@@ -40,6 +46,9 @@ export class PrintTriggerService {
     try {
       console.debug(`[租户${tenantId}] 处理订单支付成功事件,订单ID: ${orderId}`);
 
+      // 获取飞鹅API配置
+      const feieConfig = await this.getFeieConfig(tenantId);
+
       // 1. 获取完整的订单信息
       const fullOrderInfo = await this.getFullOrderInfo(tenantId, orderId);
       if (!fullOrderInfo) {
@@ -51,7 +60,8 @@ export class PrintTriggerService {
       const delaySeconds = await this.getAntiRefundDelaySeconds(tenantId);
 
       // 3. 获取默认打印机
-      const defaultPrinter = await this.printerService.getDefaultPrinter(tenantId);
+      const printerService = new PrinterService(this.dataSource, feieConfig);
+      const defaultPrinter = await printerService.getDefaultPrinter(tenantId);
       if (!defaultPrinter) {
         console.warn(`[租户${tenantId}] 未找到默认打印机,跳过打印任务`);
         return;
@@ -61,7 +71,8 @@ export class PrintTriggerService {
       const printContent = await this.generateReceiptContent(tenantId, fullOrderInfo);
 
       // 5. 创建延迟打印任务
-      await this.printTaskService.createPrintTask(tenantId, {
+      const printTaskService = new PrintTaskService(this.dataSource, feieConfig);
+      await printTaskService.createPrintTask(tenantId, {
         orderId,
         printerSn: defaultPrinter.printerSn,
         content: printContent,
@@ -79,7 +90,7 @@ export class PrintTriggerService {
 
         try {
           // 动态创建DelaySchedulerService实例
-          const delaySchedulerService = new DelaySchedulerService(this.dataSource, this.feieConfig, tenantId);
+          const delaySchedulerService = new DelaySchedulerService(this.dataSource, feieConfig, tenantId);
 
           // 检查并启动调度器
           const status = delaySchedulerService.getStatus();
@@ -103,7 +114,7 @@ export class PrintTriggerService {
         // 对于有延迟的任务,也启动调度器(如果未运行)
         try {
           console.debug(`[租户${tenantId}] 检查并启动延迟调度器...`);
-          const delaySchedulerService = new DelaySchedulerService(this.dataSource, this.feieConfig, tenantId);
+          const delaySchedulerService = new DelaySchedulerService(this.dataSource, feieConfig, tenantId);
 
           // 检查调度器状态
           const status = delaySchedulerService.getStatus();
@@ -136,8 +147,12 @@ export class PrintTriggerService {
     try {
       console.debug(`[租户${tenantId}] 处理订单退款事件,订单ID: ${orderId}`);
 
+      // 获取飞鹅API配置
+      const feieConfig = await this.getFeieConfig(tenantId);
+      const printTaskService = new PrintTaskService(this.dataSource, feieConfig);
+
       // 1. 查找关联的打印任务
-      const { tasks: printTasks } = await this.printTaskService.getPrintTasks(tenantId, {
+      const { tasks: printTasks } = await printTaskService.getPrintTasks(tenantId, {
         orderId,
         printStatus: PrintStatus.PENDING // 先查询PENDING状态的任务
       });
@@ -149,7 +164,7 @@ export class PrintTriggerService {
 
       // 2. 取消所有关联的打印任务
       for (const task of printTasks) {
-        await this.printTaskService.cancelPrintTask(tenantId, task.taskId, CancelReason.REFUND);
+        await printTaskService.cancelPrintTask(tenantId, task.taskId, CancelReason.REFUND);
         console.debug(`[租户${tenantId}] 打印任务已取消,任务ID: ${task.taskId}, 订单ID: ${orderId}`);
       }
 

+ 3 - 77
packages/mini-payment-mt/src/services/payment.mt.service.ts

@@ -208,47 +208,6 @@ export class PaymentMtService extends GenericCrudService<PaymentMtEntity> {
   }
 
 
-  /**
-   * 获取飞鹅API配置
-   */
-  private async getFeieApiConfig(tenantId: number): Promise<any> {
-    try {
-      console.debug(`[租户${tenantId}] 获取飞鹅API配置`);
-
-      // 从 system_config_mt 表获取飞鹅API配置
-      const configKeys = [
-        'feie.api.user',      // 飞鹅API用户
-        'feie.api.ukey',      // 飞鹅API密钥
-        'feie.api.base_url',  // 飞鹅API基础URL
-        'feie.api.timeout',   // API超时时间
-        'feie.api.max_retries' // 最大重试次数
-      ];
-
-      const configs = await this.systemConfigService.getConfigsByKeys(configKeys, tenantId);
-
-      // 检查必要的配置项
-      const user = configs['feie.api.user'];
-      const ukey = configs['feie.api.ukey'];
-
-      if (!user || !ukey) {
-        console.warn(`[租户${tenantId}] 飞鹅API配置不完整,缺少user或ukey`);
-        return null;
-      }
-
-      // 返回配置结构
-      return {
-        user,
-        ukey,
-        baseUrl: configs['feie.api.base_url'] || 'http://api.feieyun.cn/Api/Open/',
-        timeout: parseInt(configs['feie.api.timeout'] || '10000', 10),
-        maxRetries: parseInt(configs['feie.api.max_retries'] || '3', 10)
-      };
-    } catch (error) {
-      console.warn(`[租户${tenantId}] 获取飞鹅API配置失败:`, error);
-      return null;
-    }
-  }
-
   /**
    * 触发打印任务
    * 使用飞鹅打印模块创建延迟打印任务
@@ -261,15 +220,8 @@ export class PaymentMtService extends GenericCrudService<PaymentMtEntity> {
       // 动态导入飞鹅打印模块,避免循环依赖
       const { PrintTriggerService } = await import('@d8d/feie-printer-module-mt');
 
-      // 获取飞鹅API配置
-      const feieConfig = await this.getFeieApiConfig(tenantId);
-      if (!feieConfig) {
-        console.debug(`[租户${tenantId}] 飞鹅API配置未找到,跳过打印任务`);
-        return;
-      }
-
       // 创建打印触发服务并处理订单支付成功事件
-      const printTriggerService = new PrintTriggerService(this.dataSource, feieConfig);
+      const printTriggerService = new PrintTriggerService(this.dataSource);
       await printTriggerService.handleOrderPaymentSuccess(tenantId, orderId);
 
       console.debug(`[租户${tenantId}] 打印任务触发成功,订单ID: ${orderId}`);
@@ -295,15 +247,8 @@ export class PaymentMtService extends GenericCrudService<PaymentMtEntity> {
       // 动态导入飞鹅打印模块,避免循环依赖
       const { PrintTriggerService } = await import('@d8d/feie-printer-module-mt');
 
-      // 获取飞鹅API配置
-      const feieConfig = await this.getFeieApiConfig(tenantId);
-      if (!feieConfig) {
-        console.debug(`[租户${tenantId}] 飞鹅API配置未找到,跳过取消打印任务`);
-        return;
-      }
-
       // 创建打印触发服务
-      const printTriggerService = new PrintTriggerService(this.dataSource, feieConfig);
+      const printTriggerService = new PrintTriggerService(this.dataSource);
 
       // 处理订单退款事件
       await printTriggerService.handleOrderRefund(tenantId, orderId);
@@ -323,25 +268,6 @@ export class PaymentMtService extends GenericCrudService<PaymentMtEntity> {
   }
 
 
-  /**
-   * 触发支付成功事件
-   * 创建延迟打印任务
-   * 注意:此方法主要用于测试,正常情况下支付回调会自动触发
-   */
-  async triggerPaymentSuccessEvent(tenantId: number, orderId: number): Promise<void> {
-    try {
-      console.debug(`[租户${tenantId}] 触发支付成功事件,订单ID: ${orderId}`);
-
-      // 尝试触发打印(如果飞鹅打印模块可用)
-      await this.triggerPrintTask(tenantId, orderId);
-
-    } catch (error) {
-      console.error(`[租户${tenantId}] 触发支付成功事件失败,订单ID: ${orderId}:`, error);
-      // 为了调试,抛出错误以便在API响应中看到
-      throw new Error(`触发支付成功事件失败: ${error instanceof Error ? error.message : '未知错误'}`);
-    }
-  }
-
   /**
    * 触发退款事件
    * 取消关联的打印任务
@@ -476,7 +402,7 @@ export class PaymentMtService extends GenericCrudService<PaymentMtEntity> {
         console.debug(`[租户${payment.tenantId}] 订单状态更新为已支付,订单ID: ${payment.externalOrderId}`);
  
         // 触发支付成功事件,创建延迟打印任务
-        await this.triggerPaymentSuccessEvent(payment.tenantId, payment.externalOrderId);
+        await this.triggerPrintTask(payment.tenantId, payment.externalOrderId);
 
       } else if (payment.paymentStatus === PaymentStatus.FAILED) {
         // 支付失败,更新订单状态为支付失败 (4),支付类型为微信支付 (4)

+ 3 - 0
pnpm-lock.yaml

@@ -1413,6 +1413,9 @@ importers:
       '@d8d/delivery-address-module-mt':
         specifier: workspace:*
         version: link:../delivery-address-module-mt
+      '@d8d/feie-printer-module-mt':
+        specifier: workspace:*
+        version: link:../feie-printer-module-mt
       '@d8d/geo-areas-mt':
         specifier: workspace:*
         version: link:../geo-areas-mt