@be-link/ecommerce-promotion-service-node-sdk 0.1.61 → 0.1.63

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 CHANGED
@@ -537,6 +537,15 @@ export declare namespace ENUM {
537
537
  SKIPPED = "\u8DF3\u8FC7",
538
538
  NOT_NEEDED = "\u65E0\u9700\u56DE\u6536"
539
539
  }
540
+ /**
541
+ * 会员权益链路(按用户查可领权益列表是否有促销侧记录;调用方约定传入已是会员的 userId)
542
+ */
543
+ enum MEMBER_BENEFIT_CHAIN_TYPE {
544
+ /** 新会员:有可展示的 MemberBenefitRecord */
545
+ NEW = "NEW",
546
+ /** 老会员:无 MemberBenefitRecord(历史开通链路) */
547
+ LEGACY = "LEGACY"
548
+ }
540
549
  }
541
550
  namespace TASK_ENUM {
542
551
  /** 任务状态 */
package/enum.js CHANGED
@@ -608,6 +608,16 @@ var ENUM;
608
608
  RECOVERY_STATUS_CHINESE["SKIPPED"] = "\u8DF3\u8FC7";
609
609
  RECOVERY_STATUS_CHINESE["NOT_NEEDED"] = "\u65E0\u9700\u56DE\u6536";
610
610
  })(RECOVERY_STATUS_CHINESE = MEMBER_ENUM.RECOVERY_STATUS_CHINESE || (MEMBER_ENUM.RECOVERY_STATUS_CHINESE = {}));
611
+ /**
612
+ * 会员权益链路(按用户查可领权益列表是否有促销侧记录;调用方约定传入已是会员的 userId)
613
+ */
614
+ let MEMBER_BENEFIT_CHAIN_TYPE;
615
+ (function (MEMBER_BENEFIT_CHAIN_TYPE) {
616
+ /** 新会员:有可展示的 MemberBenefitRecord */
617
+ MEMBER_BENEFIT_CHAIN_TYPE["NEW"] = "NEW";
618
+ /** 老会员:无 MemberBenefitRecord(历史开通链路) */
619
+ MEMBER_BENEFIT_CHAIN_TYPE["LEGACY"] = "LEGACY";
620
+ })(MEMBER_BENEFIT_CHAIN_TYPE = MEMBER_ENUM.MEMBER_BENEFIT_CHAIN_TYPE || (MEMBER_ENUM.MEMBER_BENEFIT_CHAIN_TYPE = {}));
611
621
  })(MEMBER_ENUM = ENUM.MEMBER_ENUM || (ENUM.MEMBER_ENUM = {}));
612
622
  let TASK_ENUM;
613
623
  (function (TASK_ENUM) {
package/index.d.ts CHANGED
@@ -16,4 +16,5 @@ export { memberService } from './modules/member/service';
16
16
  export type { Service as MemberServiceTypes } from './modules/member/types';
17
17
  export { benefitService } from './modules/benefit/service';
18
18
  export type { Service as BenefitServiceTypes } from './modules/benefit/types';
19
+ export { destroyHttpAgents } from './utils/http';
19
20
  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.benefitService = exports.memberService = exports.taskService = exports.jobService = exports.pointsMallService = exports.pricingCalculationService = exports.configService = exports.couponService = exports.awardService = void 0;
3
+ exports.PROMOTION_ENUM = exports.destroyHttpAgents = exports.benefitService = exports.memberService = 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");
@@ -19,6 +19,8 @@ var service_8 = require("./modules/member/service");
19
19
  Object.defineProperty(exports, "memberService", { enumerable: true, get: function () { return service_8.memberService; } });
20
20
  var service_9 = require("./modules/benefit/service");
21
21
  Object.defineProperty(exports, "benefitService", { enumerable: true, get: function () { return service_9.benefitService; } });
22
+ var http_1 = require("./utils/http");
23
+ Object.defineProperty(exports, "destroyHttpAgents", { enumerable: true, get: function () { return http_1.destroyHttpAgents; } });
22
24
  // 服务.模块.枚举名称.枚举值 示例: AWARD_ENUM.DISTRIBUTION_CHANNEL.ORDER
23
25
  var enum_1 = require("./enum");
24
26
  Object.defineProperty(exports, "PROMOTION_ENUM", { enumerable: true, get: function () { return enum_1.ENUM; } });
@@ -149,6 +149,8 @@ export declare namespace Service {
149
149
  successCount?: number;
150
150
  /** 失败数量 */
151
151
  failureCount?: number;
152
+ /** 实际发放数量(券场景下返回实际发放的券数量) */
153
+ actualQuantity?: number;
152
154
  }
153
155
  /** 直播间积分&券发放统计响应 */
154
156
  interface queryLiveRoomDistributionStatsResponse {
@@ -104,17 +104,17 @@ __decorate([
104
104
  __param(0, (0, tsoa_1.Body)())
105
105
  ], BenefitService.prototype, "listConfigsByTemplate", null);
106
106
  __decorate([
107
- (0, tsoa_1.OperationId)('查询会员订单权益状态'),
107
+ (0, tsoa_1.OperationId)('查询会员订单权益状态,给交易侧b端查询使用'),
108
108
  (0, tsoa_1.Post)('get-benefit-status'),
109
109
  __param(0, (0, tsoa_1.Body)())
110
110
  ], BenefitService.prototype, "getBenefitStatus", null);
111
111
  __decorate([
112
- (0, tsoa_1.OperationId)('按用户查询当前会员权益状态'),
112
+ (0, tsoa_1.OperationId)('按用户查询当前会员权益状态,给c端查询使用'),
113
113
  (0, tsoa_1.Post)('get-benefit-status-by-user-id'),
114
114
  __param(0, (0, tsoa_1.Body)())
115
115
  ], BenefitService.prototype, "getBenefitStatusByUserId", null);
116
116
  __decorate([
117
- (0, tsoa_1.OperationId)('按城市查询黑钻模板ID'),
117
+ (0, tsoa_1.OperationId)('按城市查询黑钻模板ID,给c端查询使用'),
118
118
  (0, tsoa_1.Post)('get-black-diamond-template-id-by-city'),
119
119
  __param(0, (0, tsoa_1.Body)())
120
120
  ], BenefitService.prototype, "getBlackDiamondTemplateIdByCity", null);
@@ -67,6 +67,62 @@ export declare namespace Service {
67
67
  /** 删除时间(时间戳,毫秒,0 表示未删除) */
68
68
  deletedAt: number;
69
69
  }
70
+ /** 核销券关联商品快照(商品中心字段裁剪) */
71
+ interface BenefitVerifyProductSnapshot {
72
+ productId: string;
73
+ productName: string;
74
+ mainImg: string;
75
+ pickType?: string;
76
+ dispatchType?: string;
77
+ status?: string;
78
+ needVerify?: number;
79
+ verifyPeriod?: {
80
+ startDate?: number;
81
+ endDate?: number;
82
+ payAfterDay?: number;
83
+ type?: number;
84
+ };
85
+ targetSkuId?: string;
86
+ targetSkuCode?: string;
87
+ targetSkuAttrs?: Array<{
88
+ attrName: string;
89
+ attrValue: string;
90
+ }>;
91
+ price?: number;
92
+ memberPrice?: number;
93
+ strikethroughPrice?: number;
94
+ skuStatus?: string;
95
+ skuListSummary?: Array<{
96
+ skuId: string;
97
+ skuCode: string;
98
+ attrs: Array<{
99
+ attrName: string;
100
+ attrValue: string;
101
+ }>;
102
+ price: number;
103
+ memberPrice: number;
104
+ strikethroughPrice?: number;
105
+ status: string;
106
+ }>;
107
+ }
108
+ /** 单个候选券对应的商品信息 */
109
+ interface BenefitCouponVerifyOption {
110
+ /** 候选券模板ID(用于和商品建立关联) */
111
+ couponTemplateId: string;
112
+ product: BenefitVerifyProductSnapshot | null;
113
+ productFetchError?: string;
114
+ }
115
+ /** 一条券权益(N 选 1 核销券)的展示数据 */
116
+ interface BenefitCouponBenefitDetail {
117
+ benefitId: string;
118
+ claimStatus: ENUM.MEMBER_ENUM.BENEFIT_CLAIM_STATUS;
119
+ /**
120
+ * 用户已选择的券模板 ID(与领取接口 couponId 一致,未选为空串时不返回)
121
+ */
122
+ selectedCouponTemplateId?: string;
123
+ /** 候选券对应的商品信息 */
124
+ verifyOptions: BenefitCouponVerifyOption[];
125
+ }
70
126
  /** 会员订单权益状态 */
71
127
  interface BenefitStatus {
72
128
  /** 积分权益状态 */
@@ -84,13 +140,30 @@ export declare namespace Service {
84
140
  hotelTravel?: {
85
141
  status: string;
86
142
  };
87
- /** 权益领取态列表 */
88
- benefitClaims?: Array<{
89
- benefitId: string;
90
- benefitSubType: ENUM.MEMBER_ENUM.BENEFIT_SUB_TYPE;
91
- claimStatus: ENUM.MEMBER_ENUM.BENEFIT_CLAIM_STATUS;
92
- selectedCouponId?: string;
93
- }>;
143
+ }
144
+ /** 按用户查询当前权益状态的列表项(与会员权益列表结构对齐) */
145
+ interface BenefitStatusByUserIdItem {
146
+ id: string;
147
+ bizKey: string;
148
+ userId: string;
149
+ orderNo: string;
150
+ membershipType: string;
151
+ benefitType: string;
152
+ benefitSubType: ENUM.MEMBER_ENUM.BENEFIT_SUB_TYPE;
153
+ status: string;
154
+ failReason: string;
155
+ benefitId: string;
156
+ claimStatus: ENUM.MEMBER_ENUM.BENEFIT_CLAIM_STATUS;
157
+ selectedCouponId: string;
158
+ templateId: string;
159
+ couponCandidateIds: string[];
160
+ expireAt: number;
161
+ extra: Record<string, unknown>;
162
+ createdAt: number;
163
+ updatedAt: number;
164
+ deletedAt: number;
165
+ /** 仅券权益返回:候选券对应商品信息 */
166
+ verifyOptions?: BenefitCouponVerifyOption[];
94
167
  }
95
168
  }
96
169
  namespace Request {
@@ -312,8 +385,15 @@ export declare namespace Service {
312
385
  type listConfigsByTemplate = Entity.BenefitConfig[];
313
386
  /** 会员订单权益状态 */
314
387
  type getBenefitStatus = Entity.BenefitStatus;
315
- /** 按用户查询当前会员权益状态 */
316
- type getBenefitStatusByUserId = Entity.BenefitStatus;
388
+ /** 按用户查询当前会员权益状态(权益列表结构) */
389
+ interface getBenefitStatusByUserId {
390
+ orderNo: string;
391
+ list: Entity.BenefitStatusByUserIdItem[];
392
+ /**
393
+ * 权益链路:约定传入已是会员的 userId;list 有数据=新会员,无数据=老会员
394
+ */
395
+ memberBenefitChainType: ENUM.MEMBER_ENUM.MEMBER_BENEFIT_CHAIN_TYPE;
396
+ }
317
397
  /** 按城市查询黑钻模板ID */
318
398
  interface getBlackDiamondTemplateIdByCity {
319
399
  /** 模板ID */
@@ -7,6 +7,10 @@ declare class MemberService extends BaseService implements Service.MemberControl
7
7
  listBenefitOfficers(request: Service.Request.listBenefitOfficers): Promise<Service.Response.listBenefitOfficers>;
8
8
  listClaimableBenefits(request: Service.Request.listClaimableBenefits): Promise<Service.Response.listClaimableBenefits>;
9
9
  claimMemberBenefit(request: Service.Request.claimMemberBenefit): Promise<Service.Response.claimMemberBenefit>;
10
+ triggerMemberPriceOrderCompleted(request: Service.Request.triggerMemberPriceOrderCompleted): Promise<Service.Response.triggerMemberPriceOrderCompleted>;
11
+ triggerMemberPriceOrderPositiveClosed(request: Service.Request.triggerMemberPriceOrderPositiveClosed): Promise<Service.Response.triggerMemberPriceOrderPositiveClosed>;
12
+ backfillMemberSavingByDate(request: Service.Request.backfillMemberSavingByDate): Promise<Service.Response.backfillMemberSavingByDate>;
13
+ getBackfillMemberSavingTaskStatus(request: Service.Request.getBackfillMemberSavingTaskStatus): Promise<Service.Response.getBackfillMemberSavingTaskStatus>;
10
14
  }
11
15
  export declare const memberService: MemberService;
12
16
  export default memberService;
@@ -36,6 +36,18 @@ let MemberService = class MemberService extends BaseService_1.default {
36
36
  claimMemberBenefit(request) {
37
37
  return (0, http_1.callApi)(this.getApiUrl(this.claimMemberBenefit), request);
38
38
  }
39
+ triggerMemberPriceOrderCompleted(request) {
40
+ return (0, http_1.callApi)(this.getApiUrl(this.triggerMemberPriceOrderCompleted), request);
41
+ }
42
+ triggerMemberPriceOrderPositiveClosed(request) {
43
+ return (0, http_1.callApi)(this.getApiUrl(this.triggerMemberPriceOrderPositiveClosed), request);
44
+ }
45
+ backfillMemberSavingByDate(request) {
46
+ return (0, http_1.callApi)(this.getApiUrl(this.backfillMemberSavingByDate), request);
47
+ }
48
+ getBackfillMemberSavingTaskStatus(request) {
49
+ return (0, http_1.callApi)(this.getApiUrl(this.getBackfillMemberSavingTaskStatus), request);
50
+ }
39
51
  };
40
52
  __decorate([
41
53
  (0, tsoa_1.OperationId)('会员正向触发(mock trade)'),
@@ -62,6 +74,26 @@ __decorate([
62
74
  (0, tsoa_1.Post)('claim-member-benefit'),
63
75
  __param(0, (0, tsoa_1.Body)())
64
76
  ], MemberService.prototype, "claimMemberBenefit", null);
77
+ __decorate([
78
+ (0, tsoa_1.OperationId)('测试触发会员价订单正向省钱累计'),
79
+ (0, tsoa_1.Post)('trigger-member-price-order-completed'),
80
+ __param(0, (0, tsoa_1.Body)())
81
+ ], MemberService.prototype, "triggerMemberPriceOrderCompleted", null);
82
+ __decorate([
83
+ (0, tsoa_1.OperationId)('测试触发会员价订单正向关单省钱冲销'),
84
+ (0, tsoa_1.Post)('trigger-member-price-order-positive-closed'),
85
+ __param(0, (0, tsoa_1.Body)())
86
+ ], MemberService.prototype, "triggerMemberPriceOrderPositiveClosed", null);
87
+ __decorate([
88
+ (0, tsoa_1.OperationId)('按完成日回补会员省钱明细(按天异步)'),
89
+ (0, tsoa_1.Post)('backfill-member-saving-by-date'),
90
+ __param(0, (0, tsoa_1.Body)())
91
+ ], MemberService.prototype, "backfillMemberSavingByDate", null);
92
+ __decorate([
93
+ (0, tsoa_1.OperationId)('查询会员省钱回补任务状态'),
94
+ (0, tsoa_1.Post)('get-backfill-member-saving-task-status'),
95
+ __param(0, (0, tsoa_1.Body)())
96
+ ], MemberService.prototype, "getBackfillMemberSavingTaskStatus", null);
65
97
  MemberService = __decorate([
66
98
  (0, tsoa_1.Route)('member'),
67
99
  (0, tsoa_1.Tags)('Member')
@@ -127,13 +127,31 @@ export declare namespace Service {
127
127
  interface claimMemberBenefit {
128
128
  /** 用户ID */
129
129
  userId: string;
130
- /** 会员订单号 */
131
- orderNo: string;
132
130
  /** 权益ID */
133
131
  benefitId: string;
134
132
  /** 券权益选择的券ID */
135
133
  couponId?: string;
136
134
  }
135
+ /** 测试触发会员价订单正向省钱累计 */
136
+ interface triggerMemberPriceOrderCompleted {
137
+ userId: string;
138
+ orderNo: string;
139
+ }
140
+ /** 测试触发会员价订单正向关单省钱冲销(对齐 trade.order.positive.closed) */
141
+ interface triggerMemberPriceOrderPositiveClosed {
142
+ userId: string;
143
+ orderNo: string;
144
+ }
145
+ /**
146
+ * 按订单完成日回补会员省钱(单日)。建议配置 MEMBER_SAVING_BACKFILL_SECRET,请求头 x-member-saving-backfill-secret
147
+ */
148
+ interface backfillMemberSavingByDate {
149
+ /** 处理日期,YYYYMMDD,例如 20251022 */
150
+ date: string;
151
+ }
152
+ interface getBackfillMemberSavingTaskStatus {
153
+ taskId: string;
154
+ }
137
155
  }
138
156
  namespace Response {
139
157
  type triggerMemberOrderPaid = void;
@@ -146,6 +164,70 @@ export declare namespace Service {
146
164
  interface claimMemberBenefit {
147
165
  claimStatus: string;
148
166
  }
167
+ type triggerMemberPriceOrderCompleted = void;
168
+ type triggerMemberPriceOrderPositiveClosed = void;
169
+ interface backfillMemberSavingByDate {
170
+ taskId: string;
171
+ date: string;
172
+ status: 'QUEUED';
173
+ createdAt: number;
174
+ /** 存在同日运行中任务时返回,用于提示请求被去重 */
175
+ activeTaskId?: string;
176
+ }
177
+ interface getBackfillMemberSavingTaskStatus {
178
+ taskId: string;
179
+ date: string;
180
+ status: 'QUEUED' | 'RUNNING' | 'SUCCESS' | 'FAILED';
181
+ createdAt: number;
182
+ startedAt?: number;
183
+ finishedAt?: number;
184
+ progress?: {
185
+ stage: 'QUERY' | 'WRITE' | 'DONE';
186
+ day: string;
187
+ pageIndex: number;
188
+ pages: number;
189
+ scanned: number;
190
+ memberOrders: number;
191
+ pointsOrders: number;
192
+ normalOrders: number;
193
+ aggregatedUsers: number;
194
+ written: number;
195
+ failed: number;
196
+ lastMessage: string;
197
+ updatedAt: number;
198
+ };
199
+ result?: {
200
+ range: {
201
+ start: string;
202
+ end: string;
203
+ };
204
+ totals: {
205
+ scanned: number;
206
+ memberOrders: number;
207
+ pointsOrders: number;
208
+ normalOrders: number;
209
+ written: number;
210
+ aggregatedUsers: number;
211
+ failed: number;
212
+ pages: number;
213
+ };
214
+ perDay: Array<{
215
+ day: string;
216
+ scanned: number;
217
+ memberOrders: number;
218
+ pointsOrders: number;
219
+ normalOrders: number;
220
+ written: number;
221
+ aggregatedUsers: number;
222
+ failed: number;
223
+ pages: number;
224
+ }>;
225
+ failuresTotal: number;
226
+ failuresTruncated: boolean;
227
+ };
228
+ error?: string;
229
+ activeTaskId?: string;
230
+ }
149
231
  }
150
232
  interface MemberController {
151
233
  triggerMemberOrderPaid(request: Request.triggerMemberOrderPaid): Promise<Response.triggerMemberOrderPaid>;
@@ -153,5 +235,9 @@ export declare namespace Service {
153
235
  listBenefitOfficers(request: Request.listBenefitOfficers): Promise<Response.listBenefitOfficers>;
154
236
  listClaimableBenefits(request: Request.listClaimableBenefits): Promise<Response.listClaimableBenefits>;
155
237
  claimMemberBenefit(request: Request.claimMemberBenefit): Promise<Response.claimMemberBenefit>;
238
+ triggerMemberPriceOrderCompleted(request: Request.triggerMemberPriceOrderCompleted): Promise<Response.triggerMemberPriceOrderCompleted>;
239
+ triggerMemberPriceOrderPositiveClosed(request: Request.triggerMemberPriceOrderPositiveClosed): Promise<Response.triggerMemberPriceOrderPositiveClosed>;
240
+ backfillMemberSavingByDate(request: Request.backfillMemberSavingByDate): Promise<Response.backfillMemberSavingByDate>;
241
+ getBackfillMemberSavingTaskStatus(request: Request.getBackfillMemberSavingTaskStatus): Promise<Response.getBackfillMemberSavingTaskStatus>;
156
242
  }
157
243
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@be-link/ecommerce-promotion-service-node-sdk",
3
- "version": "0.1.61",
3
+ "version": "0.1.63",
4
4
  "description": "EcommercePromotionService Node.js SDK",
5
5
  "main": "index.js",
6
6
  "types": "index.d.ts",
package/utils/http.d.ts CHANGED
@@ -9,3 +9,8 @@ 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
+ /**
13
+ * 优雅退出时,销毁所有 HTTP/HTTPS Agent 连接池
14
+ * 确保所有 socket 被正确关闭,防止进程 hang 住
15
+ */
16
+ export declare function destroyHttpAgents(): void;
package/utils/http.js CHANGED
@@ -4,6 +4,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.callApi = callApi;
7
+ exports.destroyHttpAgents = destroyHttpAgents;
7
8
  const axios_1 = __importDefault(require("axios"));
8
9
  const uuid_1 = require("uuid");
9
10
  const axios_retry_1 = __importDefault(require("axios-retry"));
@@ -106,3 +107,11 @@ async function callApi(url, request) {
106
107
  const responseData = response.data;
107
108
  return responseData.data;
108
109
  }
110
+ /**
111
+ * 优雅退出时,销毁所有 HTTP/HTTPS Agent 连接池
112
+ * 确保所有 socket 被正确关闭,防止进程 hang 住
113
+ */
114
+ function destroyHttpAgents() {
115
+ httpAgent.destroy();
116
+ httpsAgent.destroy();
117
+ }