@be-link/ecommerce-promotion-service-node-sdk 0.1.25 → 0.1.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/enum.d.ts +67 -0
- package/enum.js +76 -0
- package/index.d.ts +2 -0
- package/index.js +3 -1
- package/modules/BaseService.d.ts +1 -1
- package/modules/BaseService.js +1 -1
- package/modules/award/types.d.ts +29 -2
- package/modules/pricingCalculation/types.d.ts +6 -0
- package/modules/task/service.d.ts +12 -0
- package/modules/task/service.js +69 -0
- package/modules/task/types.d.ts +205 -0
- package/modules/task/types.js +2 -0
- package/package.json +2 -2
- package/utils/http.d.ts +0 -22
- package/utils/http.js +38 -140
package/enum.d.ts
CHANGED
|
@@ -414,4 +414,71 @@ export declare namespace ENUM {
|
|
|
414
414
|
OTHER = "OTHER"
|
|
415
415
|
}
|
|
416
416
|
}
|
|
417
|
+
namespace TASK_ENUM {
|
|
418
|
+
/** 任务状态 */
|
|
419
|
+
enum TASK_STATUS {
|
|
420
|
+
/** 待处理 */
|
|
421
|
+
PENDING = "PENDING",
|
|
422
|
+
/** 处理中 */
|
|
423
|
+
PROCESSING = "PROCESSING",
|
|
424
|
+
/** 已完成 */
|
|
425
|
+
COMPLETED = "COMPLETED",
|
|
426
|
+
/** 已撤回 */
|
|
427
|
+
CANCELLED = "CANCELLED",
|
|
428
|
+
/** 失败 */
|
|
429
|
+
FAILED = "FAILED"
|
|
430
|
+
}
|
|
431
|
+
/** 任务状态中文 */
|
|
432
|
+
enum TASK_STATUS_CHINESE {
|
|
433
|
+
PENDING = "\u5F85\u5904\u7406",
|
|
434
|
+
PROCESSING = "\u5904\u7406\u4E2D",
|
|
435
|
+
COMPLETED = "\u5DF2\u5B8C\u6210",
|
|
436
|
+
CANCELLED = "\u5DF2\u64A4\u56DE"
|
|
437
|
+
}
|
|
438
|
+
/** 变动类型 */
|
|
439
|
+
enum CHANGE_TYPE {
|
|
440
|
+
/** 增加积分 */
|
|
441
|
+
ADD_POINTS = "ADD_POINTS",
|
|
442
|
+
/** 扣减积分 */
|
|
443
|
+
DEDUCT_POINTS = "DEDUCT_POINTS",
|
|
444
|
+
/** 发放优惠券 */
|
|
445
|
+
ISSUE_COUPON = "ISSUE_COUPON",
|
|
446
|
+
/** 作废优惠券 */
|
|
447
|
+
ABANDON_COUPON = "ABANDON_COUPON"
|
|
448
|
+
}
|
|
449
|
+
/** 变动类型中文 */
|
|
450
|
+
enum CHANGE_TYPE_CHINESE {
|
|
451
|
+
ADD_POINTS = "\u589E\u52A0\u79EF\u5206",
|
|
452
|
+
DEDUCT_POINTS = "\u6263\u51CF\u79EF\u5206",
|
|
453
|
+
ISSUE_COUPON = "\u53D1\u653E\u4F18\u60E0\u5238",
|
|
454
|
+
ABANDON_COUPON = "\u4F5C\u5E9F\u4F18\u60E0\u5238"
|
|
455
|
+
}
|
|
456
|
+
/** 资产类型 */
|
|
457
|
+
enum ASSET_TYPE {
|
|
458
|
+
/** 积分 */
|
|
459
|
+
POINTS = "POINTS",
|
|
460
|
+
/** 优惠券 */
|
|
461
|
+
COUPON = "COUPON"
|
|
462
|
+
}
|
|
463
|
+
/** 资产类型中文 */
|
|
464
|
+
enum ASSET_TYPE_CHINESE {
|
|
465
|
+
POINTS = "\u79EF\u5206",
|
|
466
|
+
COUPON = "\u4F18\u60E0\u5238"
|
|
467
|
+
}
|
|
468
|
+
/** 明细处理状态 */
|
|
469
|
+
enum DETAIL_STATUS {
|
|
470
|
+
/** 待处理 */
|
|
471
|
+
PENDING = "PENDING",
|
|
472
|
+
/** 成功 */
|
|
473
|
+
SUCCESS = "SUCCESS",
|
|
474
|
+
/** 失败 */
|
|
475
|
+
FAILED = "FAILED"
|
|
476
|
+
}
|
|
477
|
+
/** 明细处理状态中文 */
|
|
478
|
+
enum DETAIL_STATUS_CHINESE {
|
|
479
|
+
PENDING = "\u5F85\u5904\u7406",
|
|
480
|
+
SUCCESS = "\u6210\u529F",
|
|
481
|
+
FAILED = "\u5931\u8D25"
|
|
482
|
+
}
|
|
483
|
+
}
|
|
417
484
|
}
|
package/enum.js
CHANGED
|
@@ -469,4 +469,80 @@ var ENUM;
|
|
|
469
469
|
ExchangeType["OTHER"] = "OTHER";
|
|
470
470
|
})(ExchangeType = POINT_MALL.ExchangeType || (POINT_MALL.ExchangeType = {}));
|
|
471
471
|
})(POINT_MALL = ENUM.POINT_MALL || (ENUM.POINT_MALL = {}));
|
|
472
|
+
let TASK_ENUM;
|
|
473
|
+
(function (TASK_ENUM) {
|
|
474
|
+
/** 任务状态 */
|
|
475
|
+
let TASK_STATUS;
|
|
476
|
+
(function (TASK_STATUS) {
|
|
477
|
+
/** 待处理 */
|
|
478
|
+
TASK_STATUS["PENDING"] = "PENDING";
|
|
479
|
+
/** 处理中 */
|
|
480
|
+
TASK_STATUS["PROCESSING"] = "PROCESSING";
|
|
481
|
+
/** 已完成 */
|
|
482
|
+
TASK_STATUS["COMPLETED"] = "COMPLETED";
|
|
483
|
+
/** 已撤回 */
|
|
484
|
+
TASK_STATUS["CANCELLED"] = "CANCELLED";
|
|
485
|
+
/** 失败 */
|
|
486
|
+
TASK_STATUS["FAILED"] = "FAILED";
|
|
487
|
+
})(TASK_STATUS = TASK_ENUM.TASK_STATUS || (TASK_ENUM.TASK_STATUS = {}));
|
|
488
|
+
/** 任务状态中文 */
|
|
489
|
+
let TASK_STATUS_CHINESE;
|
|
490
|
+
(function (TASK_STATUS_CHINESE) {
|
|
491
|
+
TASK_STATUS_CHINESE["PENDING"] = "\u5F85\u5904\u7406";
|
|
492
|
+
TASK_STATUS_CHINESE["PROCESSING"] = "\u5904\u7406\u4E2D";
|
|
493
|
+
TASK_STATUS_CHINESE["COMPLETED"] = "\u5DF2\u5B8C\u6210";
|
|
494
|
+
TASK_STATUS_CHINESE["CANCELLED"] = "\u5DF2\u64A4\u56DE";
|
|
495
|
+
})(TASK_STATUS_CHINESE = TASK_ENUM.TASK_STATUS_CHINESE || (TASK_ENUM.TASK_STATUS_CHINESE = {}));
|
|
496
|
+
/** 变动类型 */
|
|
497
|
+
let CHANGE_TYPE;
|
|
498
|
+
(function (CHANGE_TYPE) {
|
|
499
|
+
/** 增加积分 */
|
|
500
|
+
CHANGE_TYPE["ADD_POINTS"] = "ADD_POINTS";
|
|
501
|
+
/** 扣减积分 */
|
|
502
|
+
CHANGE_TYPE["DEDUCT_POINTS"] = "DEDUCT_POINTS";
|
|
503
|
+
/** 发放优惠券 */
|
|
504
|
+
CHANGE_TYPE["ISSUE_COUPON"] = "ISSUE_COUPON";
|
|
505
|
+
/** 作废优惠券 */
|
|
506
|
+
CHANGE_TYPE["ABANDON_COUPON"] = "ABANDON_COUPON";
|
|
507
|
+
})(CHANGE_TYPE = TASK_ENUM.CHANGE_TYPE || (TASK_ENUM.CHANGE_TYPE = {}));
|
|
508
|
+
/** 变动类型中文 */
|
|
509
|
+
let CHANGE_TYPE_CHINESE;
|
|
510
|
+
(function (CHANGE_TYPE_CHINESE) {
|
|
511
|
+
CHANGE_TYPE_CHINESE["ADD_POINTS"] = "\u589E\u52A0\u79EF\u5206";
|
|
512
|
+
CHANGE_TYPE_CHINESE["DEDUCT_POINTS"] = "\u6263\u51CF\u79EF\u5206";
|
|
513
|
+
CHANGE_TYPE_CHINESE["ISSUE_COUPON"] = "\u53D1\u653E\u4F18\u60E0\u5238";
|
|
514
|
+
CHANGE_TYPE_CHINESE["ABANDON_COUPON"] = "\u4F5C\u5E9F\u4F18\u60E0\u5238";
|
|
515
|
+
})(CHANGE_TYPE_CHINESE = TASK_ENUM.CHANGE_TYPE_CHINESE || (TASK_ENUM.CHANGE_TYPE_CHINESE = {}));
|
|
516
|
+
/** 资产类型 */
|
|
517
|
+
let ASSET_TYPE;
|
|
518
|
+
(function (ASSET_TYPE) {
|
|
519
|
+
/** 积分 */
|
|
520
|
+
ASSET_TYPE["POINTS"] = "POINTS";
|
|
521
|
+
/** 优惠券 */
|
|
522
|
+
ASSET_TYPE["COUPON"] = "COUPON";
|
|
523
|
+
})(ASSET_TYPE = TASK_ENUM.ASSET_TYPE || (TASK_ENUM.ASSET_TYPE = {}));
|
|
524
|
+
/** 资产类型中文 */
|
|
525
|
+
let ASSET_TYPE_CHINESE;
|
|
526
|
+
(function (ASSET_TYPE_CHINESE) {
|
|
527
|
+
ASSET_TYPE_CHINESE["POINTS"] = "\u79EF\u5206";
|
|
528
|
+
ASSET_TYPE_CHINESE["COUPON"] = "\u4F18\u60E0\u5238";
|
|
529
|
+
})(ASSET_TYPE_CHINESE = TASK_ENUM.ASSET_TYPE_CHINESE || (TASK_ENUM.ASSET_TYPE_CHINESE = {}));
|
|
530
|
+
/** 明细处理状态 */
|
|
531
|
+
let DETAIL_STATUS;
|
|
532
|
+
(function (DETAIL_STATUS) {
|
|
533
|
+
/** 待处理 */
|
|
534
|
+
DETAIL_STATUS["PENDING"] = "PENDING";
|
|
535
|
+
/** 成功 */
|
|
536
|
+
DETAIL_STATUS["SUCCESS"] = "SUCCESS";
|
|
537
|
+
/** 失败 */
|
|
538
|
+
DETAIL_STATUS["FAILED"] = "FAILED";
|
|
539
|
+
})(DETAIL_STATUS = TASK_ENUM.DETAIL_STATUS || (TASK_ENUM.DETAIL_STATUS = {}));
|
|
540
|
+
/** 明细处理状态中文 */
|
|
541
|
+
let DETAIL_STATUS_CHINESE;
|
|
542
|
+
(function (DETAIL_STATUS_CHINESE) {
|
|
543
|
+
DETAIL_STATUS_CHINESE["PENDING"] = "\u5F85\u5904\u7406";
|
|
544
|
+
DETAIL_STATUS_CHINESE["SUCCESS"] = "\u6210\u529F";
|
|
545
|
+
DETAIL_STATUS_CHINESE["FAILED"] = "\u5931\u8D25";
|
|
546
|
+
})(DETAIL_STATUS_CHINESE = TASK_ENUM.DETAIL_STATUS_CHINESE || (TASK_ENUM.DETAIL_STATUS_CHINESE = {}));
|
|
547
|
+
})(TASK_ENUM = ENUM.TASK_ENUM || (ENUM.TASK_ENUM = {}));
|
|
472
548
|
})(ENUM || (exports.ENUM = ENUM = {}));
|
package/index.d.ts
CHANGED
|
@@ -10,4 +10,6 @@ export { pointsMallService } from './modules/pointsMall/service';
|
|
|
10
10
|
export type { Service as PointsMallServiceTypes } from './modules/pointsMall/types';
|
|
11
11
|
export { jobService } from './modules/job/service';
|
|
12
12
|
export type { Service as JobServiceTypes } from './modules/job/types';
|
|
13
|
+
export { taskService } from './modules/task/service';
|
|
14
|
+
export type { Service as TaskServiceTypes } from './modules/task/types';
|
|
13
15
|
export { ENUM as PROMOTION_ENUM } from './enum';
|
package/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.PROMOTION_ENUM = exports.jobService = exports.pointsMallService = exports.pricingCalculationService = exports.configService = exports.couponService = exports.awardService = void 0;
|
|
3
|
+
exports.PROMOTION_ENUM = exports.taskService = exports.jobService = exports.pointsMallService = exports.pricingCalculationService = exports.configService = exports.couponService = exports.awardService = void 0;
|
|
4
4
|
var service_1 = require("./modules/award/service");
|
|
5
5
|
Object.defineProperty(exports, "awardService", { enumerable: true, get: function () { return service_1.awardService; } });
|
|
6
6
|
var service_2 = require("./modules/coupon/service");
|
|
@@ -13,6 +13,8 @@ var service_5 = require("./modules/pointsMall/service");
|
|
|
13
13
|
Object.defineProperty(exports, "pointsMallService", { enumerable: true, get: function () { return service_5.pointsMallService; } });
|
|
14
14
|
var service_6 = require("./modules/job/service");
|
|
15
15
|
Object.defineProperty(exports, "jobService", { enumerable: true, get: function () { return service_6.jobService; } });
|
|
16
|
+
var service_7 = require("./modules/task/service");
|
|
17
|
+
Object.defineProperty(exports, "taskService", { enumerable: true, get: function () { return service_7.taskService; } });
|
|
16
18
|
// 服务.模块.枚举名称.枚举值 示例: AWARD_ENUM.DISTRIBUTION_CHANNEL.ORDER
|
|
17
19
|
var enum_1 = require("./enum");
|
|
18
20
|
Object.defineProperty(exports, "PROMOTION_ENUM", { enumerable: true, get: function () { return enum_1.ENUM; } });
|
package/modules/BaseService.d.ts
CHANGED
|
@@ -8,7 +8,7 @@ export default abstract class BaseService {
|
|
|
8
8
|
protected abstract prefixUrl: string;
|
|
9
9
|
/** 子网域名 */
|
|
10
10
|
protected readonly natDevHost = "http://192.168.3.168:8090/promotion";
|
|
11
|
-
protected readonly natProdHost = "http://
|
|
11
|
+
protected readonly natProdHost = "http://10.1.0.97:8090/promotion";
|
|
12
12
|
/** 公网域名 */
|
|
13
13
|
protected readonly publicDevHost = "https://ecommerce-dev.wejourney.top/promotion";
|
|
14
14
|
protected readonly publicProdHost = "";
|
package/modules/BaseService.js
CHANGED
|
@@ -13,7 +13,7 @@ class BaseService {
|
|
|
13
13
|
constructor() {
|
|
14
14
|
/** 子网域名 */
|
|
15
15
|
this.natDevHost = 'http://192.168.3.168:8090/promotion';
|
|
16
|
-
this.natProdHost = 'http://
|
|
16
|
+
this.natProdHost = 'http://10.1.0.97:8090/promotion';
|
|
17
17
|
/** 公网域名 */
|
|
18
18
|
this.publicDevHost = 'https://ecommerce-dev.wejourney.top/promotion';
|
|
19
19
|
this.publicProdHost = '';
|
package/modules/award/types.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { TaskServiceTypes } from '../..';
|
|
1
2
|
import { ENUM } from '../../enum';
|
|
2
3
|
export declare namespace Service {
|
|
3
4
|
namespace Entity {
|
|
@@ -47,8 +48,30 @@ export declare namespace Service {
|
|
|
47
48
|
namespace Request {
|
|
48
49
|
/** 发放奖励 */
|
|
49
50
|
interface distributePrize {
|
|
50
|
-
/**
|
|
51
|
-
|
|
51
|
+
/** 发奖记录ID */
|
|
52
|
+
id: string;
|
|
53
|
+
/** 用户ID */
|
|
54
|
+
userId: string;
|
|
55
|
+
/** 任务ID */
|
|
56
|
+
taskId: string;
|
|
57
|
+
/** 任务名称 */
|
|
58
|
+
taskName: string;
|
|
59
|
+
/** 任务类型 */
|
|
60
|
+
taskType: string;
|
|
61
|
+
/** 奖品类型 */
|
|
62
|
+
prizeType: string;
|
|
63
|
+
/** 直播间id */
|
|
64
|
+
liveStreamRoomId: string;
|
|
65
|
+
/** 业务ID */
|
|
66
|
+
bizId: string;
|
|
67
|
+
/** 发放数量 */
|
|
68
|
+
quantity: number;
|
|
69
|
+
/** 轮次编号(观看任务专用) */
|
|
70
|
+
roundNumber?: number;
|
|
71
|
+
/** 订单ID(满赠/买赠专用) */
|
|
72
|
+
orderId?: string;
|
|
73
|
+
/** 订单明细ID(买赠专用) */
|
|
74
|
+
orderDetailId?: string;
|
|
52
75
|
}
|
|
53
76
|
/** 作废奖励 */
|
|
54
77
|
interface reversePrize {
|
|
@@ -102,6 +125,8 @@ export declare namespace Service {
|
|
|
102
125
|
couponId: string;
|
|
103
126
|
/** 用户ID */
|
|
104
127
|
userId: string;
|
|
128
|
+
/** 数量 */
|
|
129
|
+
quantity?: number;
|
|
105
130
|
}
|
|
106
131
|
}
|
|
107
132
|
namespace Response {
|
|
@@ -111,6 +136,8 @@ export declare namespace Service {
|
|
|
111
136
|
success: boolean;
|
|
112
137
|
/** 失败原因 */
|
|
113
138
|
message?: string;
|
|
139
|
+
/** 失败详情 */
|
|
140
|
+
failureDetail?: TaskServiceTypes.Response.FailureListItem[];
|
|
114
141
|
}
|
|
115
142
|
/** 直播间积分&券发放统计响应 */
|
|
116
143
|
interface queryLiveRoomDistributionStatsResponse {
|
|
@@ -153,6 +153,12 @@ export declare namespace Service {
|
|
|
153
153
|
originalAmount: number;
|
|
154
154
|
/** 券优惠金额(分) */
|
|
155
155
|
couponDiscountAmount: number;
|
|
156
|
+
/** 会员优惠金额(分) */
|
|
157
|
+
memberDiscount: {
|
|
158
|
+
totalAmount: number;
|
|
159
|
+
itemAmount: number;
|
|
160
|
+
quantity: number;
|
|
161
|
+
};
|
|
156
162
|
/** 优惠后金额(分) */
|
|
157
163
|
discountedAmount: number;
|
|
158
164
|
/** 积分最高抵扣金额(分) */
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Service } from './types';
|
|
2
|
+
import BaseService from '../BaseService';
|
|
3
|
+
declare class TaskService extends BaseService implements Service.BatchTaskController {
|
|
4
|
+
protected prefixUrl: string;
|
|
5
|
+
createBatchTask(request: Service.Request.createBatchTask): Promise<void>;
|
|
6
|
+
getBatchTaskList(request: Service.Request.getBatchTaskList): Promise<Service.Response.getBatchTaskList>;
|
|
7
|
+
getBatchTaskDetail(request: Service.Request.getBatchTaskDetail): Promise<Service.Response.getBatchTaskDetail>;
|
|
8
|
+
cancelBatchTask(request: Service.Request.cancelBatchTask): Promise<void>;
|
|
9
|
+
getFailureList(request: Service.Request.getFailureList): Promise<Service.Response.getFailureList>;
|
|
10
|
+
}
|
|
11
|
+
export declare const taskService: TaskService;
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
9
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.taskService = void 0;
|
|
16
|
+
const tsoa_1 = require("tsoa");
|
|
17
|
+
const http_1 = require("../../utils/http");
|
|
18
|
+
const BaseService_1 = __importDefault(require("../BaseService"));
|
|
19
|
+
let TaskService = class TaskService extends BaseService_1.default {
|
|
20
|
+
constructor() {
|
|
21
|
+
super(...arguments);
|
|
22
|
+
this.prefixUrl = '/task';
|
|
23
|
+
}
|
|
24
|
+
createBatchTask(request) {
|
|
25
|
+
return (0, http_1.callApi)(this.getApiUrl(this.createBatchTask), request);
|
|
26
|
+
}
|
|
27
|
+
getBatchTaskList(request) {
|
|
28
|
+
return (0, http_1.callApi)(this.getApiUrl(this.getBatchTaskList), request);
|
|
29
|
+
}
|
|
30
|
+
getBatchTaskDetail(request) {
|
|
31
|
+
return (0, http_1.callApi)(this.getApiUrl(this.getBatchTaskDetail), request);
|
|
32
|
+
}
|
|
33
|
+
cancelBatchTask(request) {
|
|
34
|
+
return (0, http_1.callApi)(this.getApiUrl(this.cancelBatchTask), request);
|
|
35
|
+
}
|
|
36
|
+
getFailureList(request) {
|
|
37
|
+
return (0, http_1.callApi)(this.getApiUrl(this.getFailureList), request);
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
__decorate([
|
|
41
|
+
(0, tsoa_1.OperationId)('创建批量任务'),
|
|
42
|
+
(0, tsoa_1.Post)('create-batch-task'),
|
|
43
|
+
__param(0, (0, tsoa_1.Body)())
|
|
44
|
+
], TaskService.prototype, "createBatchTask", null);
|
|
45
|
+
__decorate([
|
|
46
|
+
(0, tsoa_1.OperationId)('获取批量任务列表'),
|
|
47
|
+
(0, tsoa_1.Post)('get-batch-task-list'),
|
|
48
|
+
__param(0, (0, tsoa_1.Body)())
|
|
49
|
+
], TaskService.prototype, "getBatchTaskList", null);
|
|
50
|
+
__decorate([
|
|
51
|
+
(0, tsoa_1.OperationId)('获取批量任务详情'),
|
|
52
|
+
(0, tsoa_1.Post)('get-batch-task-detail'),
|
|
53
|
+
__param(0, (0, tsoa_1.Body)())
|
|
54
|
+
], TaskService.prototype, "getBatchTaskDetail", null);
|
|
55
|
+
__decorate([
|
|
56
|
+
(0, tsoa_1.OperationId)('撤回批量任务'),
|
|
57
|
+
(0, tsoa_1.Post)('cancel-batch-task'),
|
|
58
|
+
__param(0, (0, tsoa_1.Body)())
|
|
59
|
+
], TaskService.prototype, "cancelBatchTask", null);
|
|
60
|
+
__decorate([
|
|
61
|
+
(0, tsoa_1.OperationId)('获取失败名单'),
|
|
62
|
+
(0, tsoa_1.Post)('get-failure-list'),
|
|
63
|
+
__param(0, (0, tsoa_1.Body)())
|
|
64
|
+
], TaskService.prototype, "getFailureList", null);
|
|
65
|
+
TaskService = __decorate([
|
|
66
|
+
(0, tsoa_1.Route)('task'),
|
|
67
|
+
(0, tsoa_1.Tags)('Task')
|
|
68
|
+
], TaskService);
|
|
69
|
+
exports.taskService = new TaskService();
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import { ENUM } from '../../enum';
|
|
2
|
+
export declare namespace Service {
|
|
3
|
+
namespace Entity {
|
|
4
|
+
/** 批量任务基础信息 */
|
|
5
|
+
interface BatchTask {
|
|
6
|
+
/** 任务ID */
|
|
7
|
+
id: string;
|
|
8
|
+
/** 任务名称 */
|
|
9
|
+
taskName: string;
|
|
10
|
+
/** 变动类型:增加/发放/扣减/作废 */
|
|
11
|
+
changeType: ENUM.TASK_ENUM.CHANGE_TYPE;
|
|
12
|
+
/** 资产类型:积分/优惠券 */
|
|
13
|
+
assetType: ENUM.TASK_ENUM.ASSET_TYPE;
|
|
14
|
+
/** 资产ID(券ID或积分类型标识) */
|
|
15
|
+
assetId?: string;
|
|
16
|
+
/** 变动数量 */
|
|
17
|
+
changeAmount: number;
|
|
18
|
+
/** 变动人数 */
|
|
19
|
+
changeUserCount: number;
|
|
20
|
+
/** 成功数量 */
|
|
21
|
+
successCount: number;
|
|
22
|
+
/** 失败数量 */
|
|
23
|
+
failureCount: number;
|
|
24
|
+
/** Excel文件URL(COS链接) */
|
|
25
|
+
fileUrl: string;
|
|
26
|
+
/** 任务状态 */
|
|
27
|
+
status: ENUM.TASK_ENUM.TASK_STATUS;
|
|
28
|
+
/** 操作人ID */
|
|
29
|
+
operatorId: string;
|
|
30
|
+
/** 操作人姓名 */
|
|
31
|
+
operatorName: string;
|
|
32
|
+
/** 创建时间 */
|
|
33
|
+
createdAt: number;
|
|
34
|
+
/** 更新时间 */
|
|
35
|
+
updatedAt: number;
|
|
36
|
+
/** 失败详情(JSON字符串) */
|
|
37
|
+
failureDetail?: string;
|
|
38
|
+
}
|
|
39
|
+
/** 批量任务详情项 */
|
|
40
|
+
interface BatchTaskDetail {
|
|
41
|
+
/** 用户ID */
|
|
42
|
+
userId: string;
|
|
43
|
+
/** 变动数量 */
|
|
44
|
+
amount: number;
|
|
45
|
+
/** 处理状态 */
|
|
46
|
+
status: ENUM.TASK_ENUM.DETAIL_STATUS;
|
|
47
|
+
/** 失败原因 */
|
|
48
|
+
failureReason?: string;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
namespace Request {
|
|
52
|
+
/** 创建批量任务 */
|
|
53
|
+
interface createBatchTask {
|
|
54
|
+
/** 任务名称 */
|
|
55
|
+
taskName: string;
|
|
56
|
+
/** 变动类型:增加/发放/扣减/作废 */
|
|
57
|
+
changeType: ENUM.TASK_ENUM.CHANGE_TYPE;
|
|
58
|
+
/** 资产类型:积分/优惠券 */
|
|
59
|
+
assetType: ENUM.TASK_ENUM.ASSET_TYPE;
|
|
60
|
+
/** 资产ID(券ID,积分类型可不填) */
|
|
61
|
+
assetId?: string;
|
|
62
|
+
/** 创建原因 */
|
|
63
|
+
reason: string;
|
|
64
|
+
/** Excel文件URL(COS链接) */
|
|
65
|
+
fileUrl: string;
|
|
66
|
+
}
|
|
67
|
+
/** 批量任务列表查询 */
|
|
68
|
+
interface getBatchTaskList {
|
|
69
|
+
/** 页码 */
|
|
70
|
+
pageIndex?: number;
|
|
71
|
+
/** 每页数量 */
|
|
72
|
+
pageSize?: number;
|
|
73
|
+
/** 任务ID */
|
|
74
|
+
taskId?: string;
|
|
75
|
+
/** 任务名称(模糊查询) */
|
|
76
|
+
taskName?: string;
|
|
77
|
+
/** 变动类型 */
|
|
78
|
+
changeType?: ENUM.TASK_ENUM.CHANGE_TYPE;
|
|
79
|
+
/** 资产类型 */
|
|
80
|
+
assetType?: ENUM.TASK_ENUM.ASSET_TYPE;
|
|
81
|
+
/** 任务状态 */
|
|
82
|
+
status?: ENUM.TASK_ENUM.TASK_STATUS;
|
|
83
|
+
}
|
|
84
|
+
/** 获取批量任务详情 */
|
|
85
|
+
interface getBatchTaskDetail {
|
|
86
|
+
/** 任务ID */
|
|
87
|
+
taskId: string;
|
|
88
|
+
}
|
|
89
|
+
/** 撤回批量任务 */
|
|
90
|
+
interface cancelBatchTask {
|
|
91
|
+
/** 任务ID */
|
|
92
|
+
taskId: string;
|
|
93
|
+
}
|
|
94
|
+
/** 获取失败名单 */
|
|
95
|
+
interface getFailureList {
|
|
96
|
+
/** 任务ID */
|
|
97
|
+
taskId: string;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
namespace Response {
|
|
101
|
+
/** 批量任务列表项 */
|
|
102
|
+
interface BatchTaskListItem {
|
|
103
|
+
/** 任务ID */
|
|
104
|
+
id: string;
|
|
105
|
+
/** 任务名称 */
|
|
106
|
+
taskName: string;
|
|
107
|
+
/** 变动类型 */
|
|
108
|
+
changeType: ENUM.TASK_ENUM.CHANGE_TYPE;
|
|
109
|
+
/** 变动类型中文 */
|
|
110
|
+
changeTypeChinese: string;
|
|
111
|
+
/** 资产类型 */
|
|
112
|
+
assetType: ENUM.TASK_ENUM.ASSET_TYPE;
|
|
113
|
+
/** 资产类型中文 */
|
|
114
|
+
assetTypeChinese: string;
|
|
115
|
+
/** 变动人数 */
|
|
116
|
+
changeUserCount: number;
|
|
117
|
+
/** 成功数/失败数 */
|
|
118
|
+
successCount: number;
|
|
119
|
+
failureCount: number;
|
|
120
|
+
/** 操作人 */
|
|
121
|
+
operatorId: string;
|
|
122
|
+
/** 创建时间 */
|
|
123
|
+
createdAt: number;
|
|
124
|
+
/** 任务状态 */
|
|
125
|
+
status: ENUM.TASK_ENUM.TASK_STATUS;
|
|
126
|
+
/** 任务状态中文 */
|
|
127
|
+
statusChinese: string;
|
|
128
|
+
}
|
|
129
|
+
/** 批量任务列表响应 */
|
|
130
|
+
interface getBatchTaskList {
|
|
131
|
+
/** 总数 */
|
|
132
|
+
total: number;
|
|
133
|
+
/** 任务列表 */
|
|
134
|
+
list: BatchTaskListItem[];
|
|
135
|
+
/** 当前页码 */
|
|
136
|
+
pageIndex: number;
|
|
137
|
+
/** 每页数量 */
|
|
138
|
+
pageSize: number;
|
|
139
|
+
}
|
|
140
|
+
/** 批量任务详情响应 */
|
|
141
|
+
interface getBatchTaskDetail {
|
|
142
|
+
/** 任务ID */
|
|
143
|
+
id: string;
|
|
144
|
+
/** 任务名称 */
|
|
145
|
+
taskName: string;
|
|
146
|
+
/** 变动类型 */
|
|
147
|
+
changeType: ENUM.TASK_ENUM.CHANGE_TYPE;
|
|
148
|
+
/** 变动类型中文 */
|
|
149
|
+
changeTypeChinese: string;
|
|
150
|
+
/** 资产类型 */
|
|
151
|
+
assetType: ENUM.TASK_ENUM.ASSET_TYPE;
|
|
152
|
+
/** 资产类型中文 */
|
|
153
|
+
assetTypeChinese: string;
|
|
154
|
+
/** 资产ID */
|
|
155
|
+
assetId?: string;
|
|
156
|
+
/** 资产名称 */
|
|
157
|
+
assetName?: string;
|
|
158
|
+
/** 变动人数 */
|
|
159
|
+
changeUserCount: number;
|
|
160
|
+
/** 成功数/失败数 */
|
|
161
|
+
successCount: number;
|
|
162
|
+
failureCount: number;
|
|
163
|
+
/** Excel文件URL */
|
|
164
|
+
fileUrl: string;
|
|
165
|
+
/** 操作人 */
|
|
166
|
+
operatorId: string;
|
|
167
|
+
/** 创建时间 */
|
|
168
|
+
createdAt: number;
|
|
169
|
+
/** 更新时间 */
|
|
170
|
+
updatedAt: number;
|
|
171
|
+
/** 任务状态 */
|
|
172
|
+
status: ENUM.TASK_ENUM.TASK_STATUS;
|
|
173
|
+
/** 任务状态中文 */
|
|
174
|
+
statusChinese: string;
|
|
175
|
+
}
|
|
176
|
+
/** 失败名单项 */
|
|
177
|
+
interface FailureListItem {
|
|
178
|
+
/** 用户ID */
|
|
179
|
+
userId: string;
|
|
180
|
+
/** 变动数量 */
|
|
181
|
+
amount: number;
|
|
182
|
+
/** 失败原因 */
|
|
183
|
+
failureReason: string;
|
|
184
|
+
}
|
|
185
|
+
/** 失败名单响应 */
|
|
186
|
+
interface getFailureList {
|
|
187
|
+
/** 表头 */
|
|
188
|
+
headerMap: Record<string, string>;
|
|
189
|
+
/** 数据 */
|
|
190
|
+
data: Record<string, any>[];
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
interface BatchTaskController {
|
|
194
|
+
/** 创建批量任务 */
|
|
195
|
+
createBatchTask(request: Service.Request.createBatchTask, req: any): Promise<void>;
|
|
196
|
+
/** 获取批量任务列表 */
|
|
197
|
+
getBatchTaskList(request: Service.Request.getBatchTaskList, req: any): Promise<Service.Response.getBatchTaskList>;
|
|
198
|
+
/** 获取批量任务详情 */
|
|
199
|
+
getBatchTaskDetail(request: Service.Request.getBatchTaskDetail, req: any): Promise<Service.Response.getBatchTaskDetail>;
|
|
200
|
+
/** 撤回批量任务 */
|
|
201
|
+
cancelBatchTask(request: Service.Request.cancelBatchTask, req: any): Promise<void>;
|
|
202
|
+
/** 获取失败名单 */
|
|
203
|
+
getFailureList(request: Service.Request.getFailureList, req: any): Promise<Service.Response.getFailureList>;
|
|
204
|
+
}
|
|
205
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@be-link/ecommerce-promotion-service-node-sdk",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.26",
|
|
4
4
|
"description": "EcommercePromotionService Node.js SDK",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"types": "index.d.ts",
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
"axios": "1.13.2",
|
|
15
15
|
"axios-retry": "4.0.0",
|
|
16
16
|
"uuid": "9.0.1",
|
|
17
|
-
"tsoa": "
|
|
17
|
+
"tsoa": "6.6.0",
|
|
18
18
|
"safe-stable-stringify": "2.5.0"
|
|
19
19
|
},
|
|
20
20
|
"scripts": {
|
package/utils/http.d.ts
CHANGED
|
@@ -9,25 +9,3 @@ declare module '@fastify/request-context' {
|
|
|
9
9
|
}
|
|
10
10
|
}
|
|
11
11
|
export declare function callApi<T extends (...args: any[]) => Promise<any>>(url: string, request?: Parameters<T>[0]): Promise<Awaited<ReturnType<T>>>;
|
|
12
|
-
export declare function getConnectionStats(): {
|
|
13
|
-
activeRequests: number;
|
|
14
|
-
totalRequests: number;
|
|
15
|
-
peakActiveRequests: number;
|
|
16
|
-
httpSockets: {
|
|
17
|
-
total: number;
|
|
18
|
-
hosts: number;
|
|
19
|
-
details: NodeJS.ReadOnlyDict<import("net").Socket[]>;
|
|
20
|
-
};
|
|
21
|
-
httpsSockets: {
|
|
22
|
-
total: number;
|
|
23
|
-
hosts: number;
|
|
24
|
-
details: NodeJS.ReadOnlyDict<import("net").Socket[]>;
|
|
25
|
-
};
|
|
26
|
-
config: {
|
|
27
|
-
maxSockets: number;
|
|
28
|
-
maxTotalSockets: number;
|
|
29
|
-
requestTimeout: number;
|
|
30
|
-
note: string;
|
|
31
|
-
};
|
|
32
|
-
};
|
|
33
|
-
export declare function resetPeakStats(): void;
|
package/utils/http.js
CHANGED
|
@@ -4,27 +4,22 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.callApi = callApi;
|
|
7
|
-
exports.getConnectionStats = getConnectionStats;
|
|
8
|
-
exports.resetPeakStats = resetPeakStats;
|
|
9
7
|
const axios_1 = __importDefault(require("axios"));
|
|
10
8
|
const uuid_1 = require("uuid");
|
|
11
9
|
const axios_retry_1 = __importDefault(require("axios-retry"));
|
|
12
10
|
const request_context_1 = require("@fastify/request-context");
|
|
13
|
-
const safe_stable_stringify_1 = __importDefault(require("safe-stable-stringify"));
|
|
14
11
|
const http_1 = __importDefault(require("http"));
|
|
15
12
|
const https_1 = __importDefault(require("https"));
|
|
16
|
-
//
|
|
13
|
+
// HTTP 连接池配置 - 支持 2000 QPS(响应时间 2秒)
|
|
17
14
|
const HTTP_CONFIG = {
|
|
18
|
-
maxSockets:
|
|
19
|
-
maxFreeSockets: 1000, //
|
|
20
|
-
maxTotalSockets:
|
|
21
|
-
keepAliveMsecs:
|
|
22
|
-
timeout:
|
|
23
|
-
requestTimeout:
|
|
24
|
-
retries:
|
|
25
|
-
retryBaseDelay:
|
|
26
|
-
logThreshold: 1000, // 日志采样率(每1000个请求采样1次,降低日志开销)
|
|
27
|
-
monitorInterval: 5000, // 监控日志间隔(毫秒)
|
|
15
|
+
maxSockets: 3000, // 每个 host 最大并发连接数
|
|
16
|
+
maxFreeSockets: 1000, // 保持空闲连接数(减少连接重建开销)
|
|
17
|
+
maxTotalSockets: 10000, // 所有 host 总连接数上限(支持多个服务同时调用)
|
|
18
|
+
keepAliveMsecs: 60000, // 保持连接60秒
|
|
19
|
+
timeout: 5000, // socket超时5秒
|
|
20
|
+
requestTimeout: 5000, // 请求超时5秒
|
|
21
|
+
retries: 0, // 不重试(失败直接返回)
|
|
22
|
+
retryBaseDelay: 200, // 基础重试延迟200ms
|
|
28
23
|
};
|
|
29
24
|
// 配置 HTTP/HTTPS Agent 以支持高并发连接池和 keepAlive
|
|
30
25
|
const httpAgent = new http_1.default.Agent({
|
|
@@ -34,7 +29,7 @@ const httpAgent = new http_1.default.Agent({
|
|
|
34
29
|
maxFreeSockets: HTTP_CONFIG.maxFreeSockets,
|
|
35
30
|
maxTotalSockets: HTTP_CONFIG.maxTotalSockets,
|
|
36
31
|
timeout: HTTP_CONFIG.timeout,
|
|
37
|
-
scheduling: '
|
|
32
|
+
scheduling: 'lifo', // 后进先出调度(优先复用热连接,提高连接复用效率)
|
|
38
33
|
});
|
|
39
34
|
const httpsAgent = new https_1.default.Agent({
|
|
40
35
|
keepAlive: true,
|
|
@@ -43,7 +38,7 @@ const httpsAgent = new https_1.default.Agent({
|
|
|
43
38
|
maxFreeSockets: HTTP_CONFIG.maxFreeSockets,
|
|
44
39
|
maxTotalSockets: HTTP_CONFIG.maxTotalSockets,
|
|
45
40
|
timeout: HTTP_CONFIG.timeout,
|
|
46
|
-
scheduling: '
|
|
41
|
+
scheduling: 'lifo', // 后进先出调度(优先复用热连接,提高连接复用效率)
|
|
47
42
|
});
|
|
48
43
|
// 配置 axios 默认使用这些 agent
|
|
49
44
|
axios_1.default.defaults.httpAgent = httpAgent;
|
|
@@ -57,10 +52,16 @@ axios_1.default.defaults.maxContentLength = 50 * 1024 * 1024; // 50MB 最大响
|
|
|
57
52
|
retryCondition(error) {
|
|
58
53
|
// 重试临时错误和特定的网络错误
|
|
59
54
|
const status = error.response?.status;
|
|
60
|
-
const isNetworkError = error.code === 'ECONNRESET' ||
|
|
55
|
+
const isNetworkError = error.code === 'ECONNRESET' ||
|
|
56
|
+
error.code === 'ETIMEDOUT' ||
|
|
57
|
+
error.code === 'ECONNREFUSED' ||
|
|
58
|
+
error.code === 'ENOTFOUND' ||
|
|
59
|
+
error.code === 'ENETUNREACH' ||
|
|
60
|
+
error.code === 'EAI_AGAIN';
|
|
61
61
|
const isServerError = status === 502 || status === 503 || status === 504;
|
|
62
62
|
const isRateLimited = status === 429;
|
|
63
|
-
|
|
63
|
+
const isTimeout = error.code === 'ECONNABORTED' || error.message?.includes('timeout');
|
|
64
|
+
return isNetworkError || isServerError || isRateLimited || isTimeout;
|
|
64
65
|
},
|
|
65
66
|
retryDelay: (retryCount, error) => {
|
|
66
67
|
// 指数退避 + 抖动
|
|
@@ -73,138 +74,35 @@ axios_1.default.defaults.maxContentLength = 50 * 1024 * 1024; // 50MB 最大响
|
|
|
73
74
|
}
|
|
74
75
|
return 1000 + Math.random() * 1000; // 1-2秒
|
|
75
76
|
}
|
|
76
|
-
// 指数退避:
|
|
77
|
+
// 指数退避:200ms, 400ms, 800ms...
|
|
77
78
|
const exponentialDelay = HTTP_CONFIG.retryBaseDelay * Math.pow(2, retryCount - 1);
|
|
78
|
-
const jitter = Math.random() *
|
|
79
|
-
return Math.min(exponentialDelay + jitter,
|
|
79
|
+
const jitter = Math.random() * 100; // 0-100ms 抖动
|
|
80
|
+
return Math.min(exponentialDelay + jitter, 3000); // 最多延迟3秒
|
|
80
81
|
},
|
|
81
82
|
shouldResetTimeout: true, // 重试时重置超时
|
|
82
83
|
});
|
|
83
|
-
// 连接池状态监控
|
|
84
|
-
let requestCount = 0;
|
|
85
|
-
let activeRequests = 0;
|
|
86
|
-
let peakActiveRequests = 0; // 峰值并发
|
|
87
84
|
async function callApi(url, request) {
|
|
88
|
-
//
|
|
89
|
-
const currentRequestId = ++requestCount;
|
|
90
|
-
activeRequests++;
|
|
91
|
-
// 记录峰值并发
|
|
92
|
-
if (activeRequests > peakActiveRequests) {
|
|
93
|
-
peakActiveRequests = activeRequests;
|
|
94
|
-
}
|
|
95
|
-
// 批量获取请求上下文,减少函数调用开销
|
|
85
|
+
// 获取请求上下文
|
|
96
86
|
const ctx = request_context_1.requestContext.get('requestId') ? request_context_1.requestContext : null;
|
|
97
87
|
const requestId = ctx?.get('requestId') || ctx?.get('traceMessageId') || (0, uuid_1.v4)();
|
|
98
88
|
const pandoraUserId = ctx?.get('pandoraUserId') || '';
|
|
99
89
|
const beLinkUserId = ctx?.get('beLinkUserId') || '';
|
|
100
90
|
const pandoraRoleId = ctx?.get('pandoraRoleId') || '';
|
|
101
91
|
const realIp = ctx?.get('realIp') || '';
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
requestId,
|
|
112
|
-
url,
|
|
113
|
-
type: 'http_request_start',
|
|
114
|
-
}));
|
|
115
|
-
}
|
|
116
|
-
const response = await axios_1.default.post(url, request || {}, {
|
|
117
|
-
headers: {
|
|
118
|
-
'x-request-id': requestId,
|
|
119
|
-
'x-belink-pandora-userid': pandoraUserId,
|
|
120
|
-
'x-belink-userid': beLinkUserId,
|
|
121
|
-
'x-belink-pandora-roleid': pandoraRoleId,
|
|
122
|
-
'x-real-ip': realIp,
|
|
123
|
-
Connection: 'keep-alive',
|
|
124
|
-
},
|
|
125
|
-
timeout: HTTP_CONFIG.requestTimeout,
|
|
126
|
-
httpAgent,
|
|
127
|
-
httpsAgent,
|
|
128
|
-
});
|
|
129
|
-
if (shouldLog) {
|
|
130
|
-
const duration = Date.now() - startTime;
|
|
131
|
-
if (duration > 3000) {
|
|
132
|
-
console.log((0, safe_stable_stringify_1.default)({
|
|
133
|
-
message: '请求完成',
|
|
134
|
-
currentRequestId,
|
|
135
|
-
duration: `${duration}ms`,
|
|
136
|
-
activeRequests,
|
|
137
|
-
type: 'http_request_complete',
|
|
138
|
-
}));
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
const responseData = response.data;
|
|
142
|
-
return responseData.data;
|
|
143
|
-
}
|
|
144
|
-
catch (error) {
|
|
145
|
-
const axiosError = error;
|
|
146
|
-
const duration = startTime ? Date.now() - startTime : 0;
|
|
147
|
-
// 错误始终记录(但简化输出)
|
|
148
|
-
console.error((0, safe_stable_stringify_1.default)({
|
|
149
|
-
message: '请求失败',
|
|
150
|
-
currentRequestId,
|
|
151
|
-
url,
|
|
152
|
-
duration: `${duration}ms`,
|
|
153
|
-
activeRequests,
|
|
154
|
-
errorMessage: axiosError.message,
|
|
155
|
-
type: 'http_request_failed',
|
|
156
|
-
}));
|
|
157
|
-
if (axiosError.response) {
|
|
158
|
-
const response = axiosError.response;
|
|
159
|
-
const data = response.data;
|
|
160
|
-
console.error((0, safe_stable_stringify_1.default)({
|
|
161
|
-
message: '响应异常',
|
|
162
|
-
status: response.status,
|
|
163
|
-
errorMessage: data?.message || axiosError.message,
|
|
164
|
-
type: 'http_response_error',
|
|
165
|
-
}));
|
|
166
|
-
}
|
|
167
|
-
throw error;
|
|
168
|
-
}
|
|
169
|
-
finally {
|
|
170
|
-
// 记录请求完成,减少活跃计数
|
|
171
|
-
activeRequests--;
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
// 导出监控函数
|
|
175
|
-
function getConnectionStats() {
|
|
176
|
-
const stats = {
|
|
177
|
-
// 当前状态
|
|
178
|
-
activeRequests,
|
|
179
|
-
totalRequests: requestCount,
|
|
180
|
-
// 峰值指标
|
|
181
|
-
peakActiveRequests,
|
|
182
|
-
// Socket连接池状态(这是真正的并发控制点)
|
|
183
|
-
httpSockets: {
|
|
184
|
-
total: Object.keys(httpAgent.sockets).reduce((sum, host) => sum + (httpAgent.sockets[host]?.length || 0), 0),
|
|
185
|
-
hosts: Object.keys(httpAgent.sockets).length,
|
|
186
|
-
details: httpAgent.sockets,
|
|
187
|
-
},
|
|
188
|
-
httpsSockets: {
|
|
189
|
-
total: Object.keys(httpsAgent.sockets).reduce((sum, host) => sum + (httpsAgent.sockets[host]?.length || 0), 0),
|
|
190
|
-
hosts: Object.keys(httpsAgent.sockets).length,
|
|
191
|
-
details: httpsAgent.sockets,
|
|
92
|
+
const response = await axios_1.default.post(url, request || {}, {
|
|
93
|
+
headers: {
|
|
94
|
+
'x-request-id': requestId,
|
|
95
|
+
'x-belink-pandora-userid': pandoraUserId,
|
|
96
|
+
'x-belink-userid': beLinkUserId,
|
|
97
|
+
'x-belink-pandora-roleid': pandoraRoleId,
|
|
98
|
+
'x-real-ip': realIp,
|
|
99
|
+
Connection: 'keep-alive',
|
|
100
|
+
'Content-Type': 'application/json;charset=utf-8',
|
|
192
101
|
},
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
},
|
|
200
|
-
};
|
|
201
|
-
return stats;
|
|
202
|
-
}
|
|
203
|
-
// 重置峰值统计(可用于定期重置)
|
|
204
|
-
function resetPeakStats() {
|
|
205
|
-
peakActiveRequests = activeRequests;
|
|
206
|
-
console.log((0, safe_stable_stringify_1.default)({
|
|
207
|
-
message: '峰值统计已重置',
|
|
208
|
-
type: 'stats_reset',
|
|
209
|
-
}));
|
|
102
|
+
timeout: HTTP_CONFIG.requestTimeout,
|
|
103
|
+
httpAgent,
|
|
104
|
+
httpsAgent,
|
|
105
|
+
});
|
|
106
|
+
const responseData = response.data;
|
|
107
|
+
return responseData.data;
|
|
210
108
|
}
|