@be-link/ecommerce-plan-allocation-service-node-sdk 0.0.6 → 0.0.7

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
@@ -50,13 +50,13 @@ export declare namespace ENUM {
50
50
  enum STATUS {
51
51
  PENDING = "PENDING",
52
52
  PARTIAL = "PARTIAL",
53
- RECEIVED = "RECEIVED",
53
+ SHIPPED = "SHIPPED",
54
54
  EARLY_COMPLETED = "EARLY_COMPLETED"
55
55
  }
56
56
  enum STATUS_CHINESE {
57
57
  PENDING = "\u5F85\u53D1\u8D27",
58
58
  PARTIAL = "\u90E8\u5206\u53D1\u8D27",
59
- RECEIVED = "\u5DF2\u53D1\u8D27",
59
+ SHIPPED = "\u5DF2\u53D1\u8D27",
60
60
  EARLY_COMPLETED = "\u63D0\u524D\u5B8C\u6210"
61
61
  }
62
62
  /** 错误消息常量 */
@@ -69,9 +69,9 @@ export declare namespace ENUM {
69
69
  };
70
70
  /** 状态转换规则 */
71
71
  const STATUS_TRANSITIONS: {
72
- readonly PENDING: readonly ["PARTIAL", "RECEIVED", "EARLY_COMPLETED"];
73
- readonly PARTIAL: readonly ["RECEIVED", "EARLY_COMPLETED"];
74
- readonly RECEIVED: readonly [];
72
+ readonly PENDING: readonly ["PARTIAL", "SHIPPED", "EARLY_COMPLETED"];
73
+ readonly PARTIAL: readonly ["SHIPPED", "EARLY_COMPLETED"];
74
+ readonly SHIPPED: readonly [];
75
75
  readonly EARLY_COMPLETED: readonly [];
76
76
  };
77
77
  }
package/enum.js CHANGED
@@ -62,14 +62,14 @@ var ENUM;
62
62
  (function (STATUS) {
63
63
  STATUS["PENDING"] = "PENDING";
64
64
  STATUS["PARTIAL"] = "PARTIAL";
65
- STATUS["RECEIVED"] = "RECEIVED";
65
+ STATUS["SHIPPED"] = "SHIPPED";
66
66
  STATUS["EARLY_COMPLETED"] = "EARLY_COMPLETED";
67
67
  })(STATUS = ALLOCATION_ORDER_ENUM.STATUS || (ALLOCATION_ORDER_ENUM.STATUS = {}));
68
68
  let STATUS_CHINESE;
69
69
  (function (STATUS_CHINESE) {
70
70
  STATUS_CHINESE["PENDING"] = "\u5F85\u53D1\u8D27";
71
71
  STATUS_CHINESE["PARTIAL"] = "\u90E8\u5206\u53D1\u8D27";
72
- STATUS_CHINESE["RECEIVED"] = "\u5DF2\u53D1\u8D27";
72
+ STATUS_CHINESE["SHIPPED"] = "\u5DF2\u53D1\u8D27";
73
73
  STATUS_CHINESE["EARLY_COMPLETED"] = "\u63D0\u524D\u5B8C\u6210";
74
74
  })(STATUS_CHINESE = ALLOCATION_ORDER_ENUM.STATUS_CHINESE || (ALLOCATION_ORDER_ENUM.STATUS_CHINESE = {}));
75
75
  /** 错误消息常量 */
@@ -82,9 +82,9 @@ var ENUM;
82
82
  };
83
83
  /** 状态转换规则 */
84
84
  ALLOCATION_ORDER_ENUM.STATUS_TRANSITIONS = {
85
- PENDING: ['PARTIAL', 'RECEIVED', 'EARLY_COMPLETED'],
86
- PARTIAL: ['RECEIVED', 'EARLY_COMPLETED'],
87
- RECEIVED: [],
85
+ PENDING: ['PARTIAL', 'SHIPPED', 'EARLY_COMPLETED'],
86
+ PARTIAL: ['SHIPPED', 'EARLY_COMPLETED'],
87
+ SHIPPED: [],
88
88
  EARLY_COMPLETED: [],
89
89
  };
90
90
  })(ALLOCATION_ORDER_ENUM = ENUM.ALLOCATION_ORDER_ENUM || (ENUM.ALLOCATION_ORDER_ENUM = {}));
package/index.d.ts CHANGED
@@ -1,5 +1,10 @@
1
1
  export { allocationService } from './modules/allocation/service';
2
2
  export type { Service as AllocationServiceTypes } from './modules/allocation/types';
3
+ export { logisticsService } from './modules/logistics/service';
4
+ export type { Service as LogisticsServiceTypes } from './modules/logistics/types';
5
+ export { ENUM as DEMO_ENUM } from './enum';
6
+ export { allocationOrderService } from './modules/allocationOrder/service';
7
+ export { AllocationOrderTypes } from './modules/allocationOrder/types';
3
8
  export { storeStockInService } from './modules/storeStockIn/service';
4
9
  export { StoreStockInTypes } from './modules/storeStockIn/types';
5
10
  export { preAllocationOrderService } from './modules/preAllocationOrder/service';
package/index.js CHANGED
@@ -1,14 +1,21 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ENUM = exports.preAllocationOrderService = exports.storeStockInService = exports.allocationService = void 0;
3
+ exports.ENUM = exports.preAllocationOrderService = exports.storeStockInService = exports.allocationOrderService = exports.DEMO_ENUM = exports.logisticsService = exports.allocationService = void 0;
4
4
  var service_1 = require("./modules/allocation/service");
5
5
  Object.defineProperty(exports, "allocationService", { enumerable: true, get: function () { return service_1.allocationService; } });
6
- var service_2 = require("./modules/storeStockIn/service");
7
- Object.defineProperty(exports, "storeStockInService", { enumerable: true, get: function () { return service_2.storeStockInService; } });
8
- var service_3 = require("./modules/preAllocationOrder/service");
9
- Object.defineProperty(exports, "preAllocationOrderService", { enumerable: true, get: function () { return service_3.preAllocationOrderService; } });
6
+ var service_2 = require("./modules/logistics/service");
7
+ Object.defineProperty(exports, "logisticsService", { enumerable: true, get: function () { return service_2.logisticsService; } });
10
8
  var enum_1 = require("./enum");
11
- Object.defineProperty(exports, "ENUM", { enumerable: true, get: function () { return enum_1.ENUM; } });
9
+ Object.defineProperty(exports, "DEMO_ENUM", { enumerable: true, get: function () { return enum_1.ENUM; } });
10
+ var service_3 = require("./modules/allocationOrder/service");
11
+ Object.defineProperty(exports, "allocationOrderService", { enumerable: true, get: function () { return service_3.allocationOrderService; } });
12
+ var service_4 = require("./modules/storeStockIn/service");
13
+ Object.defineProperty(exports, "storeStockInService", { enumerable: true, get: function () { return service_4.storeStockInService; } });
14
+ var service_5 = require("./modules/preAllocationOrder/service");
15
+ Object.defineProperty(exports, "preAllocationOrderService", { enumerable: true, get: function () { return service_5.preAllocationOrderService; } });
16
+ var enum_2 = require("./enum");
17
+ Object.defineProperty(exports, "ENUM", { enumerable: true, get: function () { return enum_2.ENUM; } });
12
18
  // 服务.模块.枚举名称.枚举值 示例: DEMO_ENUM.ORDER_ENUM.STATUS.PENDING
13
19
  // 门店入库单枚举示例: ENUM.STORE_STOCK_IN_ORDER_ENUM.STATUS.PENDING
14
20
  // 预配货单上传枚举示例: ENUM.PRE_ALLOCATION_ORDER_UPLOAD_EXCEL_ENUM.STATUS.PROCESSING
21
+ // 配货单枚举示例: ENUM.ALLOCATION_ORDER_ENUM.STATUS.PENDING
@@ -0,0 +1,47 @@
1
+ import { AllocationOrderTypes } from './types';
2
+ import BaseService from '../BaseService';
3
+ declare class AllocationOrderService extends BaseService implements AllocationOrderTypes.AllocationOrderController {
4
+ protected prefixUrl: string;
5
+ /**
6
+ * 获取配货单列表
7
+ */
8
+ list(request: AllocationOrderTypes.Request.GetList): Promise<AllocationOrderTypes.Response.GetList>;
9
+ /**
10
+ * 获取配货单详情
11
+ */
12
+ detail(request: AllocationOrderTypes.Request.GetDetail): Promise<AllocationOrderTypes.Response.GetDetail>;
13
+ /**
14
+ * 批量更新配货单明细备注
15
+ */
16
+ batchUpdateDetailRemarks(request: AllocationOrderTypes.Request.BatchUpdateDetailRemarks): Promise<void>;
17
+ /**
18
+ * 发货
19
+ */
20
+ ship(request: AllocationOrderTypes.Request.Ship): Promise<void>;
21
+ /**
22
+ * 保存草稿
23
+ */
24
+ saveDraft(request: AllocationOrderTypes.Request.SaveDraft): Promise<void>;
25
+ /**
26
+ * 撤销发货
27
+ */
28
+ cancelShip(request: AllocationOrderTypes.Request.CancelShip): Promise<void>;
29
+ /**
30
+ * 导出配货单Excel
31
+ */
32
+ exportExcel(request: AllocationOrderTypes.Request.ExportExcel): Promise<AllocationOrderTypes.Response.ExportExcel>;
33
+ /**
34
+ * 打印拣货单
35
+ */
36
+ printPickingSheet(request: AllocationOrderTypes.Request.PrintPickingSheet): Promise<AllocationOrderTypes.Response.PrintPickingSheet>;
37
+ /**
38
+ * 打印发货签收单
39
+ */
40
+ printDeliveryReceipt(request: AllocationOrderTypes.Request.PrintDeliveryReceipt): Promise<AllocationOrderTypes.Response.PrintDeliveryReceipt>;
41
+ /**
42
+ * 退回预配货单
43
+ */
44
+ rollbackPre(request: AllocationOrderTypes.Request.RollbackPre): Promise<void>;
45
+ }
46
+ export declare const allocationOrderService: AllocationOrderService;
47
+ export default allocationOrderService;
@@ -0,0 +1,130 @@
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.allocationOrderService = void 0;
16
+ const tsoa_1 = require("tsoa");
17
+ const http_1 = require("../../utils/http");
18
+ const BaseService_1 = __importDefault(require("../BaseService"));
19
+ let AllocationOrderService = class AllocationOrderService extends BaseService_1.default {
20
+ constructor() {
21
+ super(...arguments);
22
+ this.prefixUrl = '/allocation-order';
23
+ }
24
+ /**
25
+ * 获取配货单列表
26
+ */
27
+ list(request) {
28
+ return (0, http_1.callApi)(this.getApiUrl(this.list), request);
29
+ }
30
+ /**
31
+ * 获取配货单详情
32
+ */
33
+ detail(request) {
34
+ return (0, http_1.callApi)(this.getApiUrl(this.detail), request);
35
+ }
36
+ /**
37
+ * 批量更新配货单明细备注
38
+ */
39
+ batchUpdateDetailRemarks(request) {
40
+ return (0, http_1.callApi)(this.getApiUrl(this.batchUpdateDetailRemarks), request);
41
+ }
42
+ /**
43
+ * 发货
44
+ */
45
+ ship(request) {
46
+ return (0, http_1.callApi)(this.getApiUrl(this.ship), request);
47
+ }
48
+ /**
49
+ * 保存草稿
50
+ */
51
+ saveDraft(request) {
52
+ return (0, http_1.callApi)(this.getApiUrl(this.saveDraft), request);
53
+ }
54
+ /**
55
+ * 撤销发货
56
+ */
57
+ cancelShip(request) {
58
+ return (0, http_1.callApi)(this.getApiUrl(this.cancelShip), request);
59
+ }
60
+ /**
61
+ * 导出配货单Excel
62
+ */
63
+ exportExcel(request) {
64
+ return (0, http_1.callApi)(this.getApiUrl(this.exportExcel), request);
65
+ }
66
+ /**
67
+ * 打印拣货单
68
+ */
69
+ printPickingSheet(request) {
70
+ return (0, http_1.callApi)(this.getApiUrl(this.printPickingSheet), request);
71
+ }
72
+ /**
73
+ * 打印发货签收单
74
+ */
75
+ printDeliveryReceipt(request) {
76
+ return (0, http_1.callApi)(this.getApiUrl(this.printDeliveryReceipt), request);
77
+ }
78
+ /**
79
+ * 退回预配货单
80
+ */
81
+ rollbackPre(request) {
82
+ return (0, http_1.callApi)(this.getApiUrl(this.rollbackPre), request);
83
+ }
84
+ };
85
+ __decorate([
86
+ (0, tsoa_1.Post)('list'),
87
+ __param(0, (0, tsoa_1.Body)())
88
+ ], AllocationOrderService.prototype, "list", null);
89
+ __decorate([
90
+ (0, tsoa_1.Post)('detail'),
91
+ __param(0, (0, tsoa_1.Body)())
92
+ ], AllocationOrderService.prototype, "detail", null);
93
+ __decorate([
94
+ (0, tsoa_1.Post)('batch-update-detail-remarks'),
95
+ __param(0, (0, tsoa_1.Body)())
96
+ ], AllocationOrderService.prototype, "batchUpdateDetailRemarks", null);
97
+ __decorate([
98
+ (0, tsoa_1.Post)('ship'),
99
+ __param(0, (0, tsoa_1.Body)())
100
+ ], AllocationOrderService.prototype, "ship", null);
101
+ __decorate([
102
+ (0, tsoa_1.Post)('save-draft'),
103
+ __param(0, (0, tsoa_1.Body)())
104
+ ], AllocationOrderService.prototype, "saveDraft", null);
105
+ __decorate([
106
+ (0, tsoa_1.Post)('cancel-ship'),
107
+ __param(0, (0, tsoa_1.Body)())
108
+ ], AllocationOrderService.prototype, "cancelShip", null);
109
+ __decorate([
110
+ (0, tsoa_1.Post)('export-excel'),
111
+ __param(0, (0, tsoa_1.Body)())
112
+ ], AllocationOrderService.prototype, "exportExcel", null);
113
+ __decorate([
114
+ (0, tsoa_1.Post)('print-picking-sheet'),
115
+ __param(0, (0, tsoa_1.Body)())
116
+ ], AllocationOrderService.prototype, "printPickingSheet", null);
117
+ __decorate([
118
+ (0, tsoa_1.Post)('print-delivery-receipt'),
119
+ __param(0, (0, tsoa_1.Body)())
120
+ ], AllocationOrderService.prototype, "printDeliveryReceipt", null);
121
+ __decorate([
122
+ (0, tsoa_1.Post)('rollback-pre'),
123
+ __param(0, (0, tsoa_1.Body)())
124
+ ], AllocationOrderService.prototype, "rollbackPre", null);
125
+ AllocationOrderService = __decorate([
126
+ (0, tsoa_1.Route)('AllocationOrder'),
127
+ (0, tsoa_1.Tags)('allocationOrder')
128
+ ], AllocationOrderService);
129
+ exports.allocationOrderService = new AllocationOrderService();
130
+ exports.default = exports.allocationOrderService;
@@ -0,0 +1,330 @@
1
+ import { ENUM } from '../../enum';
2
+ export declare namespace AllocationOrderTypes {
3
+ namespace Entity {
4
+ /**
5
+ * 配货单主表实体
6
+ */
7
+ interface AllocationOrder {
8
+ id: string;
9
+ createdAt: number;
10
+ updatedAt: number;
11
+ deletedAt: number;
12
+ stockInOrderId: string;
13
+ pickingAt: number;
14
+ storeId: string;
15
+ warehouseId: string;
16
+ status: ENUM.ALLOCATION_ORDER_ENUM.STATUS;
17
+ shouldNum: number;
18
+ realNum: number;
19
+ creator: string;
20
+ updater: string;
21
+ shippedAt: number | null;
22
+ estimatedArrivalAt: number | null;
23
+ needNextHandle: number;
24
+ remark: string | null;
25
+ }
26
+ /**
27
+ * 配货单扩展实体(包含关联数据)
28
+ */
29
+ interface AllocationOrderWithExtension extends AllocationOrder {
30
+ storeName?: string;
31
+ warehouseName?: string;
32
+ deliveryMode?: number;
33
+ regionName?: string;
34
+ }
35
+ /**
36
+ * 配货单明细实体
37
+ */
38
+ interface AllocationOrderDetail {
39
+ id: string;
40
+ createdAt: number;
41
+ updatedAt: number;
42
+ deletedAt: number;
43
+ allocationOrderId: string;
44
+ storeId: string;
45
+ productId: string;
46
+ skuId: string;
47
+ skuCode: string;
48
+ pickingNum: number;
49
+ shippedNum: number;
50
+ remainNum: number;
51
+ nextPickingNum: number;
52
+ shouldPickNum: number;
53
+ pickingRemark: string | null;
54
+ shippingRemark: string | null;
55
+ }
56
+ /**
57
+ * 配货单明细扩展实体(包含商品信息)
58
+ */
59
+ interface AllocationOrderDetailWithProduct extends AllocationOrderDetail {
60
+ productName: string;
61
+ specName: string;
62
+ storageMethod: string;
63
+ classification: string;
64
+ }
65
+ /**
66
+ * 发货项
67
+ */
68
+ interface ShipItem {
69
+ detailId: string;
70
+ shippedNum: number;
71
+ pickingRemark?: string;
72
+ shippingRemark?: string;
73
+ }
74
+ /**
75
+ * 草稿项
76
+ */
77
+ interface DraftItem {
78
+ detailId: string;
79
+ shippedNum: number;
80
+ pickingRemark?: string;
81
+ shippingRemark?: string;
82
+ }
83
+ }
84
+ namespace Request {
85
+ /**
86
+ * 获取配货单列表请求
87
+ */
88
+ interface GetList {
89
+ pageIndex: number;
90
+ pageSize: number;
91
+ id?: string;
92
+ pickingAtStart?: number;
93
+ pickingAtEnd?: number;
94
+ shippedAtStart?: number;
95
+ shippedAtEnd?: number;
96
+ productIds?: string[];
97
+ skuCodes?: string[];
98
+ warehouseIds?: string[];
99
+ storeIds?: string[];
100
+ deliveryMode?: number;
101
+ status?: string;
102
+ }
103
+ /**
104
+ * 获取配货单详情请求
105
+ */
106
+ interface GetDetail {
107
+ allocationOrderId: string;
108
+ pageIndex: number;
109
+ pageSize: number;
110
+ productIds?: string[];
111
+ skuCodes?: string[];
112
+ minRemainNum?: number;
113
+ maxRemainNum?: number;
114
+ }
115
+ /**
116
+ * 批量更新明细备注请求
117
+ */
118
+ interface BatchUpdateDetailRemarks {
119
+ orderId: string;
120
+ operator: string;
121
+ items: {
122
+ detailId: string;
123
+ pickingRemark?: string;
124
+ shippingRemark?: string;
125
+ }[];
126
+ }
127
+ /**
128
+ * 发货请求
129
+ */
130
+ interface Ship {
131
+ allocationId: string;
132
+ items: Entity.ShipItem[];
133
+ operator: string;
134
+ }
135
+ /**
136
+ * 保存草稿请求
137
+ */
138
+ interface SaveDraft {
139
+ allocationId: string;
140
+ items: Entity.DraftItem[];
141
+ operator: string;
142
+ }
143
+ /**
144
+ * 撤销发货请求
145
+ */
146
+ interface CancelShip {
147
+ allocationId: string;
148
+ operator?: string;
149
+ }
150
+ /**
151
+ * 导出配货单Excel请求
152
+ */
153
+ interface ExportExcel {
154
+ pageIndex: number;
155
+ pageSize: number;
156
+ ids?: string[];
157
+ pickingAtStart?: number;
158
+ pickingAtEnd?: number;
159
+ shippedAtStart?: number;
160
+ shippedAtEnd?: number;
161
+ productIds?: string[];
162
+ skuCodes?: string[];
163
+ storeIds?: string[];
164
+ warehouseIds?: string[];
165
+ deliveryMode?: number;
166
+ status?: string;
167
+ }
168
+ /**
169
+ * 打印拣货单请求
170
+ */
171
+ interface PrintPickingSheet {
172
+ pageIndex: number;
173
+ pageSize: number;
174
+ ids?: string[];
175
+ pickingAtStart?: number;
176
+ pickingAtEnd?: number;
177
+ shippedAtStart?: number;
178
+ shippedAtEnd?: number;
179
+ productIds?: string[];
180
+ skuCodes?: string[];
181
+ storeIds?: string[];
182
+ warehouseIds?: string[];
183
+ deliveryMode?: number;
184
+ status?: string;
185
+ }
186
+ /**
187
+ * 打印发货签收单请求
188
+ */
189
+ interface PrintDeliveryReceipt {
190
+ orderIds: string[];
191
+ }
192
+ /**
193
+ * 退回预配货单请求
194
+ */
195
+ interface RollbackPre {
196
+ pickingAt?: number;
197
+ orderIds?: string[];
198
+ operator?: string;
199
+ }
200
+ }
201
+ namespace Response {
202
+ /**
203
+ * 获取配货单列表响应
204
+ */
205
+ interface GetList {
206
+ total: number;
207
+ list: Entity.AllocationOrderWithExtension[];
208
+ totalCount: number;
209
+ pendingCount: number;
210
+ partialCount: number;
211
+ shippedCount: number;
212
+ }
213
+ /**
214
+ * 获取配货单详情响应
215
+ */
216
+ interface GetDetail {
217
+ order: Entity.AllocationOrder;
218
+ details: Entity.AllocationOrderDetailWithProduct[];
219
+ total: number;
220
+ }
221
+ /**
222
+ * 导出Excel项目接口
223
+ */
224
+ interface ExportExcelItem {
225
+ 单号?: string;
226
+ 建议配货日期?: string;
227
+ 仓库?: string;
228
+ 门店?: string;
229
+ 门店地址?: string;
230
+ 门店联系电话?: string;
231
+ 商品应发?: number;
232
+ 商品实发?: number;
233
+ 发货时间?: string;
234
+ 配送模式?: string;
235
+ 状态?: string;
236
+ productId?: string;
237
+ skuId?: string;
238
+ 商品名称?: string;
239
+ 规格名称?: string;
240
+ 规格编码?: string;
241
+ 库位信息?: string;
242
+ 储藏方式?: string;
243
+ 商品分类?: string;
244
+ 配货数量?: number;
245
+ 应拣数量?: number;
246
+ 已发数量?: number;
247
+ 剩余待发数量?: number;
248
+ 配货备注?: string;
249
+ 发货备注?: string;
250
+ }
251
+ /**
252
+ * 导出Excel响应接口
253
+ */
254
+ interface ExportExcel {
255
+ data: ExportExcelItem[];
256
+ headerMap: string[];
257
+ }
258
+ /**
259
+ * 打印拣货单项目接口(按商品聚合)
260
+ */
261
+ interface PrintPickingSheetItem {
262
+ 商品名称?: string;
263
+ 规格名称?: string;
264
+ 规格编码?: string;
265
+ 商品分类?: string;
266
+ 储藏方式?: string;
267
+ 库位信息?: string;
268
+ 总计应拣数量?: number;
269
+ [storeName: string]: string | number | undefined;
270
+ }
271
+ /**
272
+ * 打印拣货单响应接口
273
+ */
274
+ interface PrintPickingSheet {
275
+ data: PrintPickingSheetItem[];
276
+ headerMap: string[];
277
+ }
278
+ /**
279
+ * 发货签收单商品项
280
+ */
281
+ interface DeliveryReceiptItem {
282
+ productName?: string;
283
+ specName?: string;
284
+ skuCode?: string;
285
+ classification?: string;
286
+ storageMethod?: string;
287
+ shippedQuantity?: number;
288
+ receivedQuantity?: number;
289
+ pickingRemark?: string;
290
+ shippingRemark?: string;
291
+ }
292
+ /**
293
+ * 发货签收单数据
294
+ */
295
+ interface DeliveryReceiptData {
296
+ allocationOrderId: string;
297
+ pickingDate?: string;
298
+ warehouseName?: string;
299
+ storeRemark: string;
300
+ deliveryMode?: string;
301
+ storeName?: string;
302
+ storePhone?: string;
303
+ storeAddress?: string;
304
+ driverNotice?: string;
305
+ qrCodeUrl?: string;
306
+ items: DeliveryReceiptItem[];
307
+ }
308
+ /**
309
+ * 打印发货签收单响应接口
310
+ */
311
+ interface PrintDeliveryReceipt {
312
+ list: DeliveryReceiptData[];
313
+ }
314
+ }
315
+ /**
316
+ * 配货单控制器接口
317
+ */
318
+ interface AllocationOrderController {
319
+ list(request: Request.GetList): Promise<Response.GetList>;
320
+ detail(request: Request.GetDetail): Promise<Response.GetDetail>;
321
+ batchUpdateDetailRemarks(request: Request.BatchUpdateDetailRemarks): Promise<void>;
322
+ ship(request: Request.Ship): Promise<void>;
323
+ saveDraft(request: Request.SaveDraft): Promise<void>;
324
+ cancelShip(request: Request.CancelShip): Promise<void>;
325
+ exportExcel(request: Request.ExportExcel): Promise<Response.ExportExcel>;
326
+ printPickingSheet(request: Request.PrintPickingSheet): Promise<Response.PrintPickingSheet>;
327
+ printDeliveryReceipt(request: Request.PrintDeliveryReceipt): Promise<Response.PrintDeliveryReceipt>;
328
+ rollbackPre(request: Request.RollbackPre): Promise<void>;
329
+ }
330
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -45,6 +45,7 @@ export declare namespace Service {
45
45
  remark: string;
46
46
  extra: any;
47
47
  deletedAt: number;
48
+ products: Product[];
48
49
  }
49
50
  interface Product {
50
51
  }
@@ -7,7 +7,7 @@ declare class StoreStockInService extends BaseService implements StoreStockInTyp
7
7
  list(request: StoreStockInTypes.Request.GetList): Promise<StoreStockInTypes.Response.GetList>;
8
8
  earlyComplete(request: StoreStockInTypes.Request.EarlyComplete): Promise<void>;
9
9
  delete(request: StoreStockInTypes.Request.Delete): Promise<void>;
10
- detailList(request: StoreStockInTypes.Request.IDetailList): Promise<StoreStockInTypes.Response.IDetailList>;
10
+ exportExcel(request: StoreStockInTypes.Request.ExportExcel): Promise<StoreStockInTypes.Response.ExportExcel>;
11
11
  getStockInProducts(request: StoreStockInTypes.Request.GetStockInProducts): Promise<StoreStockInTypes.Response.GetStockInProducts>;
12
12
  }
13
13
  export declare const storeStockInService: StoreStockInService;
@@ -36,8 +36,8 @@ let StoreStockInService = class StoreStockInService extends BaseService_1.defaul
36
36
  delete(request) {
37
37
  return (0, http_1.callApi)(this.getApiUrl(this.delete), request);
38
38
  }
39
- detailList(request) {
40
- return (0, http_1.callApi)(this.getApiUrl(this.detailList), request);
39
+ exportExcel(request) {
40
+ return (0, http_1.callApi)(this.getApiUrl(this.exportExcel), request);
41
41
  }
42
42
  getStockInProducts(request) {
43
43
  return (0, http_1.callApi)(this.getApiUrl(this.getStockInProducts), request);
@@ -64,9 +64,9 @@ __decorate([
64
64
  __param(0, (0, tsoa_1.Body)())
65
65
  ], StoreStockInService.prototype, "delete", null);
66
66
  __decorate([
67
- (0, tsoa_1.Post)('detail-list'),
67
+ (0, tsoa_1.Post)('export-excel'),
68
68
  __param(0, (0, tsoa_1.Body)())
69
- ], StoreStockInService.prototype, "detailList", null);
69
+ ], StoreStockInService.prototype, "exportExcel", null);
70
70
  __decorate([
71
71
  (0, tsoa_1.Post)('get-stock-in-products'),
72
72
  __param(0, (0, tsoa_1.Body)())
@@ -101,8 +101,8 @@ export declare namespace StoreStockInTypes {
101
101
  id: string;
102
102
  operator?: string;
103
103
  }
104
- /** 查询入库单详情列表请求 */
105
- interface IDetailList {
104
+ /** 导出入库单Excel请求 */
105
+ interface ExportExcel {
106
106
  pageIndex: number;
107
107
  pageSize: number;
108
108
  ids?: string[];
@@ -141,8 +141,8 @@ export declare namespace StoreStockInTypes {
141
141
  receivedCount: number;
142
142
  earlyCompletedCount: number;
143
143
  }
144
- /** 详情列表项目接口 */
145
- interface IDetailListItem {
144
+ /** 导出Excel项目接口 */
145
+ interface ExportExcelItem {
146
146
  单号?: string;
147
147
  仓库?: string;
148
148
  门店?: string;
@@ -166,9 +166,9 @@ export declare namespace StoreStockInTypes {
166
166
  配货备注?: string;
167
167
  发货备注?: string;
168
168
  }
169
- /** 详情列表响应接口 */
170
- interface IDetailList {
171
- data: IDetailListItem[];
169
+ /** 导出Excel响应接口 */
170
+ interface ExportExcel {
171
+ data: ExportExcelItem[];
172
172
  headerMap: string[];
173
173
  }
174
174
  /** 入库单商品项 */
@@ -199,8 +199,8 @@ export declare namespace StoreStockInTypes {
199
199
  earlyComplete(request: StoreStockInTypes.Request.EarlyComplete): Promise<void>;
200
200
  /** 删除入库单 */
201
201
  delete(request: StoreStockInTypes.Request.Delete): Promise<void>;
202
- /** 获取详情列表 */
203
- detailList(request: StoreStockInTypes.Request.IDetailList): Promise<StoreStockInTypes.Response.IDetailList>;
202
+ /** 导出入库单Excel */
203
+ exportExcel(request: StoreStockInTypes.Request.ExportExcel): Promise<StoreStockInTypes.Response.ExportExcel>;
204
204
  /** 店长查看入库单商品数据 */
205
205
  getStockInProducts(request: StoreStockInTypes.Request.GetStockInProducts): Promise<StoreStockInTypes.Response.GetStockInProducts>;
206
206
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@be-link/ecommerce-plan-allocation-service-node-sdk",
3
- "version": "0.0.6",
3
+ "version": "0.0.7",
4
4
  "description": "EcommercePlanAllocationService Node.js SDK",
5
5
  "main": "index.js",
6
6
  "types": "index.d.ts",
@@ -0,0 +1,10 @@
1
+ declare module '@fastify/request-context' {
2
+ interface RequestContextData {
3
+ requestId?: string;
4
+ traceMessageId?: string;
5
+ pandoraUserId?: string;
6
+ beLinkUserId?: string;
7
+ pandoraRoleId?: string;
8
+ }
9
+ }
10
+ export declare function callApi<T extends (...args: any[]) => Promise<any>>(url: string, request?: Parameters<T>[0]): Promise<Awaited<ReturnType<T>>>;
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.callApi = callApi;
40
+ const axios_1 = __importDefault(require("axios"));
41
+ const uuid_1 = require("uuid");
42
+ const axios_retry_1 = __importDefault(require("axios-retry"));
43
+ const request_context_1 = require("@fastify/request-context");
44
+ (0, axios_retry_1.default)(axios_1.default, {
45
+ retries: 1,
46
+ retryCondition(error) {
47
+ return error.response?.status === 502;
48
+ },
49
+ retryDelay: (retryCount) => {
50
+ console.info(`retryCount: ${retryCount}, retryDelay: ${retryCount * 500}`);
51
+ return retryCount * 500;
52
+ },
53
+ onRetry(retryCount, error, requestConfig) {
54
+ console.info(`retryCount: ${retryCount}, onRetry: ${error.message}, requestHeader: ${JSON.stringify(requestConfig.headers)}`);
55
+ },
56
+ });
57
+ async function callApi(url, request) {
58
+ const requestId = request_context_1.requestContext.get('requestId') || request_context_1.requestContext.get('traceMessageId') || (0, uuid_1.v4)();
59
+ const pandoraUserId = request_context_1.requestContext.get('pandoraUserId') || '';
60
+ const pandoraRoleId = request_context_1.requestContext.get('pandoraRoleId') || '';
61
+ const beLinkUserId = request_context_1.requestContext.get('beLinkUserId') || '';
62
+ try {
63
+ console.info(`准备发起ecommerce-plan-allocation-service请求[${requestId}]: ${url}, 参数: ${JSON.stringify(request)}`);
64
+ const response = await axios_1.default.post(url, request || {}, {
65
+ headers: {
66
+ 'x-request-id': requestId,
67
+ 'x-belink-pandora-userid': pandoraUserId,
68
+ 'x-belink-userid': beLinkUserId,
69
+ 'x-belink-pandora-roleid': pandoraRoleId,
70
+ },
71
+ });
72
+ const responseData = response.data;
73
+ return responseData.data;
74
+ }
75
+ catch (error) {
76
+ const axiosError = error;
77
+ if (axiosError.response) {
78
+ const response = axiosError.response;
79
+ const data = response.data;
80
+ console.error(`ecommerce-plan-allocation-service 异常: ${axiosError.message},requestId: ${requestId}`);
81
+ console.info('响应信息', data.message);
82
+ console.error('异常堆栈', JSON.stringify(error.stack));
83
+ throw error;
84
+ }
85
+ // 调用dns模块解析url
86
+ const dns = await Promise.resolve().then(() => __importStar(require('dns')));
87
+ const dnsPromise = new Promise((resolve, reject) => {
88
+ const lookupRes = dns.lookup(url, (err, address) => {
89
+ if (err) {
90
+ console.error(err.message);
91
+ reject(err);
92
+ }
93
+ console.info(`lookup: ${JSON.stringify(lookupRes)}`);
94
+ resolve(address);
95
+ });
96
+ });
97
+ try {
98
+ const address = await dnsPromise;
99
+ console.info(`address: ${JSON.stringify(address)}`);
100
+ }
101
+ catch (error) {
102
+ console.info(`error: ${JSON.stringify(error)}`);
103
+ }
104
+ console.error(`ecommerce-plan-allocation-service 未知异常: ${axiosError.message}`, error.stack);
105
+ throw error;
106
+ }
107
+ }
package/utils/http.d.ts CHANGED
@@ -5,6 +5,7 @@ declare module '@fastify/request-context' {
5
5
  pandoraUserId?: string;
6
6
  beLinkUserId?: string;
7
7
  pandoraRoleId?: string;
8
+ realIp?: string;
8
9
  }
9
10
  }
10
11
  export declare function callApi<T extends (...args: any[]) => Promise<any>>(url: string, request?: Parameters<T>[0]): Promise<Awaited<ReturnType<T>>>;
package/utils/http.js CHANGED
@@ -1,37 +1,4 @@
1
1
  "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
36
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
37
4
  };
@@ -41,67 +8,101 @@ const axios_1 = __importDefault(require("axios"));
41
8
  const uuid_1 = require("uuid");
42
9
  const axios_retry_1 = __importDefault(require("axios-retry"));
43
10
  const request_context_1 = require("@fastify/request-context");
11
+ const http_1 = __importDefault(require("http"));
12
+ const https_1 = __importDefault(require("https"));
13
+ // HTTP 连接池配置 - 支持 2000 QPS(响应时间 2秒)
14
+ const HTTP_CONFIG = {
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
23
+ };
24
+ // 配置 HTTP/HTTPS Agent 以支持高并发连接池和 keepAlive
25
+ const httpAgent = new http_1.default.Agent({
26
+ keepAlive: true,
27
+ keepAliveMsecs: HTTP_CONFIG.keepAliveMsecs,
28
+ maxSockets: HTTP_CONFIG.maxSockets,
29
+ maxFreeSockets: HTTP_CONFIG.maxFreeSockets,
30
+ maxTotalSockets: HTTP_CONFIG.maxTotalSockets,
31
+ timeout: HTTP_CONFIG.timeout,
32
+ scheduling: 'lifo', // 后进先出调度(优先复用热连接,提高连接复用效率)
33
+ });
34
+ const httpsAgent = new https_1.default.Agent({
35
+ keepAlive: true,
36
+ keepAliveMsecs: HTTP_CONFIG.keepAliveMsecs,
37
+ maxSockets: HTTP_CONFIG.maxSockets,
38
+ maxFreeSockets: HTTP_CONFIG.maxFreeSockets,
39
+ maxTotalSockets: HTTP_CONFIG.maxTotalSockets,
40
+ timeout: HTTP_CONFIG.timeout,
41
+ scheduling: 'lifo', // 后进先出调度(优先复用热连接,提高连接复用效率)
42
+ });
43
+ // 配置 axios 默认使用这些 agent
44
+ axios_1.default.defaults.httpAgent = httpAgent;
45
+ axios_1.default.defaults.httpsAgent = httpsAgent;
46
+ axios_1.default.defaults.timeout = HTTP_CONFIG.requestTimeout;
47
+ axios_1.default.defaults.maxRedirects = 3; // 限制重定向次数
48
+ axios_1.default.defaults.maxContentLength = 50 * 1024 * 1024; // 50MB 最大响应大小
49
+ // 高并发场景下的智能重试配置
44
50
  (0, axios_retry_1.default)(axios_1.default, {
45
- retries: 1,
51
+ retries: HTTP_CONFIG.retries,
46
52
  retryCondition(error) {
47
- return error.response?.status === 502;
48
- },
49
- retryDelay: (retryCount) => {
50
- console.info(`retryCount: ${retryCount}, retryDelay: ${retryCount * 500}`);
51
- return retryCount * 500;
53
+ // 重试临时错误和特定的网络错误
54
+ const status = error.response?.status;
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
+ const isServerError = status === 502 || status === 503 || status === 504;
62
+ const isRateLimited = status === 429;
63
+ const isTimeout = error.code === 'ECONNABORTED' || error.message?.includes('timeout');
64
+ return isNetworkError || isServerError || isRateLimited || isTimeout;
52
65
  },
53
- onRetry(retryCount, error, requestConfig) {
54
- console.info(`retryCount: ${retryCount}, onRetry: ${error.message}, requestHeader: ${JSON.stringify(requestConfig.headers)}`);
66
+ retryDelay: (retryCount, error) => {
67
+ // 指数退避 + 抖动
68
+ const status = error.response?.status;
69
+ // 如果是限流错误,延迟更长
70
+ if (status === 429) {
71
+ const retryAfter = error.response?.headers['retry-after'];
72
+ if (retryAfter) {
73
+ return parseInt(retryAfter) * 1000;
74
+ }
75
+ return 1000 + Math.random() * 1000; // 1-2秒
76
+ }
77
+ // 指数退避:200ms, 400ms, 800ms...
78
+ const exponentialDelay = HTTP_CONFIG.retryBaseDelay * Math.pow(2, retryCount - 1);
79
+ const jitter = Math.random() * 100; // 0-100ms 抖动
80
+ return Math.min(exponentialDelay + jitter, 3000); // 最多延迟3秒
55
81
  },
82
+ shouldResetTimeout: true, // 重试时重置超时
56
83
  });
57
84
  async function callApi(url, request) {
58
- const requestId = request_context_1.requestContext.get('requestId') || request_context_1.requestContext.get('traceMessageId') || (0, uuid_1.v4)();
59
- const pandoraUserId = request_context_1.requestContext.get('pandoraUserId') || '';
60
- const pandoraRoleId = request_context_1.requestContext.get('pandoraRoleId') || '';
61
- const beLinkUserId = request_context_1.requestContext.get('beLinkUserId') || '';
62
- try {
63
- console.info(`准备发起ecommerce-plan-allocation-service请求[${requestId}]: ${url}, 参数: ${JSON.stringify(request)}`);
64
- const response = await axios_1.default.post(url, request || {}, {
65
- headers: {
66
- 'x-request-id': requestId,
67
- 'x-belink-pandora-userid': pandoraUserId,
68
- 'x-belink-userid': beLinkUserId,
69
- 'x-belink-pandora-roleid': pandoraRoleId,
70
- },
71
- });
72
- const responseData = response.data;
73
- return responseData.data;
74
- }
75
- catch (error) {
76
- const axiosError = error;
77
- if (axiosError.response) {
78
- const response = axiosError.response;
79
- const data = response.data;
80
- console.error(`ecommerce-plan-allocation-service 异常: ${axiosError.message},requestId: ${requestId}`);
81
- console.info('响应信息', data.message);
82
- console.error('异常堆栈', JSON.stringify(error.stack));
83
- throw error;
84
- }
85
- // 调用dns模块解析url
86
- const dns = await Promise.resolve().then(() => __importStar(require('dns')));
87
- const dnsPromise = new Promise((resolve, reject) => {
88
- const lookupRes = dns.lookup(url, (err, address) => {
89
- if (err) {
90
- console.error(err.message);
91
- reject(err);
92
- }
93
- console.info(`lookup: ${JSON.stringify(lookupRes)}`);
94
- resolve(address);
95
- });
96
- });
97
- try {
98
- const address = await dnsPromise;
99
- console.info(`address: ${JSON.stringify(address)}`);
100
- }
101
- catch (error) {
102
- console.info(`error: ${JSON.stringify(error)}`);
103
- }
104
- console.error(`ecommerce-plan-allocation-service 未知异常: ${axiosError.message}`, error.stack);
105
- throw error;
106
- }
85
+ // 获取请求上下文
86
+ const ctx = request_context_1.requestContext.get('requestId') ? request_context_1.requestContext : null;
87
+ const requestId = ctx?.get('requestId') || ctx?.get('traceMessageId') || (0, uuid_1.v4)();
88
+ const pandoraUserId = ctx?.get('pandoraUserId') || '';
89
+ const beLinkUserId = ctx?.get('beLinkUserId') || '';
90
+ const pandoraRoleId = ctx?.get('pandoraRoleId') || '';
91
+ const realIp = ctx?.get('realIp') || '';
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',
101
+ },
102
+ timeout: HTTP_CONFIG.requestTimeout,
103
+ httpAgent,
104
+ httpsAgent,
105
+ });
106
+ const responseData = response.data;
107
+ return responseData.data;
107
108
  }