@be-link/pos-cli-nodejs 1.0.233 → 1.0.235

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/package.json CHANGED
@@ -1,8 +1,17 @@
1
1
  {
2
2
  "name": "@be-link/pos-cli-nodejs",
3
- "version": "1.0.233",
3
+ "version": "1.0.235",
4
4
  "description": "正向订单服务Nodejs客户端",
5
5
  "main": "index.js",
6
+ "scripts": {
7
+ "build": "rm -rf ./dist && tsc && cp package.json README.md ./dist/",
8
+ "test": "npx jest",
9
+ "gen-doc": "npx typedoc --options typedoc.json",
10
+ "update:major": "standard-version --release-as major",
11
+ "update:minor": "standard-version --release-as minor",
12
+ "update:patch": "standard-version --release-as patch",
13
+ "update:beta": "standard-version --prerelease beta"
14
+ },
6
15
  "repository": {
7
16
  "type": "git",
8
17
  "url": "git+https://github.com/snowmountain-top/pos-cli-nodejs.git"
@@ -43,14 +52,5 @@
43
52
  "lodash": "4.17.21",
44
53
  "uuid": "^9.0.1",
45
54
  "vitality-meta": "1.0.240"
46
- },
47
- "scripts": {
48
- "build": "rm -rf ./dist && tsc && cp package.json README.md ./dist/",
49
- "test": "npx jest",
50
- "gen-doc": "npx typedoc --options typedoc.json",
51
- "update:major": "standard-version --release-as major",
52
- "update:minor": "standard-version --release-as minor",
53
- "update:patch": "standard-version --release-as patch",
54
- "update:beta": "standard-version --prerelease beta"
55
55
  }
56
- }
56
+ }
@@ -17,6 +17,45 @@ jest.mock('../../http', () => ({
17
17
  callApi: (...args) => mockCallApi(...args),
18
18
  }));
19
19
  const service_1 = __importDefault(require("./service"));
20
+ describe('OrderCoreService.sceneInfo advisorShare passthrough', () => {
21
+ beforeEach(() => {
22
+ mockCallApi.mockReset().mockResolvedValue({ tradeOrderId: 'order-1' });
23
+ });
24
+ const sceneInfo = {
25
+ scene1: '',
26
+ scene2: '',
27
+ appScene: 0,
28
+ advisorShare: { advisorId: '', cardId: 'card-1', shareAt: 0 },
29
+ };
30
+ it.each([
31
+ ['省略', undefined],
32
+ ['空对象', {}],
33
+ ['空字符串', { advisorId: '' }],
34
+ ['零时间戳', { shareAt: 0 }],
35
+ ['完整对象', { advisorId: 'advisor-1', cardId: 'card-1', shareAt: 123 }],
36
+ ])('orderCreate 透传 %s advisorShare', (_label, advisorShare) => __awaiter(void 0, void 0, void 0, function* () {
37
+ const request = {
38
+ basicInfo: {
39
+ sceneInfo: Object.assign({ scene1: '', scene2: '', appScene: 0 }, (advisorShare === undefined ? {} : { advisorShare })),
40
+ },
41
+ };
42
+ yield service_1.default.orderCreate(request);
43
+ expect(mockCallApi).toHaveBeenCalledWith(expect.stringMatching(/\/core\/order-create$/), request);
44
+ expect(mockCallApi.mock.calls[0][1].basicInfo.sceneInfo.advisorShare).toBe(advisorShare);
45
+ }));
46
+ it.each([
47
+ ['orderCreate', 'order-create', false],
48
+ ['storeOrderCreate', 'store-order-create', false],
49
+ ['orderCreateV2', 'order-create-v2', false],
50
+ ['depositOrderCreate', 'deposit-order-create', false],
51
+ ['depositOrderComplete', 'deposit-order-complete', true],
52
+ ])('%s 原样透传分享信息', (method, path, isComplete) => __awaiter(void 0, void 0, void 0, function* () {
53
+ const request = Object.assign({ basicInfo: { sceneInfo } }, (isComplete ? { depositOrderId: 'deposit-1' } : {}));
54
+ yield service_1.default[method](request);
55
+ expect(mockCallApi).toHaveBeenCalledWith(expect.stringMatching(new RegExp(`/core/${path}$`)), request);
56
+ expect(mockCallApi.mock.calls[0][1].basicInfo.sceneInfo.advisorShare).toBe(sceneInfo.advisorShare);
57
+ }));
58
+ });
20
59
  describe('OrderCoreService.acknowledgeAutoConfirmedOrder', () => {
21
60
  beforeEach(() => {
22
61
  mockCallApi.mockReset().mockResolvedValue(undefined);
@@ -42,14 +42,7 @@ export declare namespace Service {
42
42
  /** 实际支付 */
43
43
  actuallyPaidFee: number;
44
44
  /** 交易场景 */
45
- sceneInfo: {
46
- /** 场景1 */
47
- scene1: string;
48
- /** 场景2 */
49
- scene2: string;
50
- /** app场景 */
51
- appScene: number;
52
- };
45
+ sceneInfo: DTO.IOrderCreateSceneInfo;
53
46
  /** 用户订单备注 */
54
47
  orderNote?: string;
55
48
  /** 来源人Id */
@@ -140,14 +133,7 @@ export declare namespace Service {
140
133
  /** 实际支付 */
141
134
  actuallyPaidFee: number;
142
135
  /** 交易场景 */
143
- sceneInfo: {
144
- /** 场景1 */
145
- scene1: string;
146
- /** 场景2 */
147
- scene2: string;
148
- /** app场景 */
149
- appScene: number;
150
- };
136
+ sceneInfo: DTO.IOrderCreateSceneInfo;
151
137
  /** 用户openId */
152
138
  openId: string;
153
139
  /** 来源人Id */
@@ -433,11 +419,7 @@ export declare namespace Service {
433
419
  liveRoomId: string;
434
420
  /** 实付金额(等于定金金额,单位:分) */
435
421
  actuallyPaidFee: number;
436
- sceneInfo?: {
437
- scene1: string;
438
- scene2: string;
439
- appScene: number;
440
- };
422
+ sceneInfo?: DTO.IOrderCreateSceneInfo;
441
423
  fromUnionId?: string;
442
424
  fromUserRole?: string;
443
425
  /** 预订人手机号 */
@@ -26,6 +26,10 @@ declare class OrderJobService extends BaseService implements Service.OrderJobCon
26
26
  jobNotifySupplierTomorrowOrder(): Promise<void>;
27
27
  jobNotifySupplierInvoiceOrder(): Promise<void>;
28
28
  jobNotifySupplierInvoiceDay(): Promise<void>;
29
+ jobNotifyPendingSupplierPaid24h(request?: Service.Request.jobNotifyPendingSupplierPaid24h): Promise<Record<string, number>>;
30
+ jobNotifyPendingSupplierT1(request: Service.Request.jobNotifyPendingSupplierT1): Promise<Record<string, number>>;
31
+ jobNotifyPendingInvoiceDay5(request?: Service.Request.jobNotifyPendingInvoiceDay5): Promise<Record<string, number>>;
32
+ jobNotifyRejectedUncontacted72h(request?: Service.Request.jobNotifyRejectedUncontacted72h): Promise<Record<string, number>>;
29
33
  jobNotifyFeishuOfConfirmBus(): Promise<void>;
30
34
  jobPushTourSupplierForConfirmOrder(): Promise<void>;
31
35
  jobCompensateOrderPaid(): Promise<void>;
@@ -82,6 +82,18 @@ class OrderJobService extends service_1.default {
82
82
  jobNotifySupplierInvoiceDay() {
83
83
  return (0, http_1.callApi)(this.getApiUrl(this.jobNotifySupplierInvoiceDay));
84
84
  }
85
+ jobNotifyPendingSupplierPaid24h(request) {
86
+ return (0, http_1.callApi)(this.getApiUrl(this.jobNotifyPendingSupplierPaid24h), request);
87
+ }
88
+ jobNotifyPendingSupplierT1(request) {
89
+ return (0, http_1.callApi)(this.getApiUrl(this.jobNotifyPendingSupplierT1), request);
90
+ }
91
+ jobNotifyPendingInvoiceDay5(request) {
92
+ return (0, http_1.callApi)(this.getApiUrl(this.jobNotifyPendingInvoiceDay5), request);
93
+ }
94
+ jobNotifyRejectedUncontacted72h(request) {
95
+ return (0, http_1.callApi)(this.getApiUrl(this.jobNotifyRejectedUncontacted72h), request);
96
+ }
85
97
  jobNotifyFeishuOfConfirmBus() {
86
98
  return (0, http_1.callApi)(this.getApiUrl(this.jobNotifyFeishuOfConfirmBus));
87
99
  }
@@ -4,6 +4,24 @@ export declare namespace Service {
4
4
  orderIds?: string[];
5
5
  scene?: 'T-1-10:00' | 'T-1-15:00' | 'manual';
6
6
  }
7
+ interface jobNotifyPendingSupplierPaid24h {
8
+ now?: number;
9
+ lookbackHours?: number;
10
+ dryRun?: boolean;
11
+ }
12
+ interface jobNotifyPendingSupplierT1 {
13
+ now?: number;
14
+ bizTypes: Array<'TOUR' | 'PARTY_HOTEL' | 'ONE_SECOND_PARTY'>;
15
+ dryRun?: boolean;
16
+ }
17
+ interface jobNotifyPendingInvoiceDay5 {
18
+ now?: number;
19
+ dryRun?: boolean;
20
+ }
21
+ interface jobNotifyRejectedUncontacted72h {
22
+ now?: number;
23
+ dryRun?: boolean;
24
+ }
7
25
  }
8
26
  interface OrderJobController {
9
27
  /** 自动完结订单 */
@@ -54,6 +72,14 @@ export declare namespace Service {
54
72
  jobNotifySupplierInvoiceOrder(): Promise<void>;
55
73
  /** 每天通知超过5天未处理的发票 */
56
74
  jobNotifySupplierInvoiceDay(): Promise<void>;
75
+ /** 每10分钟补扫支付满24小时仍待接单 */
76
+ jobNotifyPendingSupplierPaid24h(request?: Request.jobNotifyPendingSupplierPaid24h): Promise<Record<string, number>>;
77
+ /** 出行前一天仍待接单 */
78
+ jobNotifyPendingSupplierT1(request: Request.jobNotifyPendingSupplierT1): Promise<Record<string, number>>;
79
+ /** 申请发票第5天仍未开票 */
80
+ jobNotifyPendingInvoiceDay5(request?: Request.jobNotifyPendingInvoiceDay5): Promise<Record<string, number>>;
81
+ /** 拒单满72小时且销售未联系用户 */
82
+ jobNotifyRejectedUncontacted72h(request?: Request.jobNotifyRejectedUncontacted72h): Promise<Record<string, number>>;
57
83
  /** 每天早上10点,出团前5天飞书通知客服再次确认班车 */
58
84
  jobNotifyFeishuOfConfirmBus(): Promise<void>;
59
85
  /** 从8点开始每隔3小时催促供应商接单 */
@@ -39,28 +39,22 @@ describe('自动接单订单查询契约', () => {
39
39
  beforeEach(() => {
40
40
  mockCallApi.mockReset().mockResolvedValue([]);
41
41
  });
42
- it.each([0, 1])('list/count/statistics 透传属性值 %s', (value) => __awaiter(void 0, void 0, void 0, function* () {
43
- yield store_1.default.queryOrderList(storeListRequest(value, value));
44
- yield store_1.default.getOrderCount(storeCountRequest(value, value));
45
- yield web_1.default.queryOrderForStatistics(statisticsRequest(value, value));
46
- expect(mockCallApi.mock.calls.map((call) => call[1])).toEqual([
47
- expect.objectContaining({
48
- conditions: expect.objectContaining({
49
- isAutoConfirmedOrder: value,
50
- isSupplierAcknowledged: value,
51
- }),
52
- }),
53
- expect.objectContaining({
54
- isAutoConfirmedOrder: value,
55
- isSupplierAcknowledged: value,
56
- }),
57
- expect.objectContaining({
58
- conditions: expect.objectContaining({
59
- isAutoConfirmedOrder: value,
60
- isSupplierAcknowledged: value,
61
- }),
62
- }),
63
- ]);
42
+ it.each([
43
+ [0, 0],
44
+ [0, 1],
45
+ [1, 0],
46
+ [1, 1],
47
+ ])('list/count/statistics 透传属性值 (%s, %s)', (isAutoConfirmedOrder, isSupplierAcknowledged) => __awaiter(void 0, void 0, void 0, function* () {
48
+ yield store_1.default.queryOrderList(storeListRequest(isAutoConfirmedOrder, isSupplierAcknowledged));
49
+ yield store_1.default.getOrderCount(storeCountRequest(isAutoConfirmedOrder, isSupplierAcknowledged));
50
+ yield web_1.default.queryOrderForStatistics(statisticsRequest(isAutoConfirmedOrder, isSupplierAcknowledged));
51
+ const [listRequest, countRequest, statisticsRequestValue] = mockCallApi.mock.calls.map((call) => call[1]);
52
+ expect(listRequest.conditions.isAutoConfirmedOrder).toBe(isAutoConfirmedOrder);
53
+ expect(listRequest.conditions.isSupplierAcknowledged).toBe(isSupplierAcknowledged);
54
+ expect(countRequest.isAutoConfirmedOrder).toBe(isAutoConfirmedOrder);
55
+ expect(countRequest.isSupplierAcknowledged).toBe(isSupplierAcknowledged);
56
+ expect(statisticsRequestValue.conditions.isAutoConfirmedOrder).toBe(isAutoConfirmedOrder);
57
+ expect(statisticsRequestValue.conditions.isSupplierAcknowledged).toBe(isSupplierAcknowledged);
64
58
  }));
65
59
  it('未传新增字段时保持旧请求结构', () => __awaiter(void 0, void 0, void 0, function* () {
66
60
  const listRequest = storeListRequest();
@@ -30,8 +30,10 @@ export declare namespace Service {
30
30
  interface getOrderInvoiceRequest {
31
31
  /** 开票状态 */
32
32
  invoiceStatus?: string;
33
- /** 创建时间 */
33
+ /** 创建时间(旧累计查询上限) */
34
34
  createdAt?: number;
35
+ /** 创建时间左闭右开范围 */
36
+ createdAtRange?: [number, number];
35
37
  /** 开票方 */
36
38
  invoiceBase?: string;
37
39
  page?: number;
package/types.d.ts CHANGED
@@ -8,6 +8,24 @@ import { ItemInfoProxy } from './utils/posProxy/itemInfoProxy';
8
8
  import { SkuInfoProxy } from './utils/posProxy/skuInfoProxy';
9
9
  import { VenueInfoProxy } from './utils/posProxy/venueInfoProxy';
10
10
  import { ComboInfoProxy } from './utils/posProxy/comboInfoProxy';
11
+ /** 顾问分享信息;字段可省略,允许空字符串,是否有有效旅顾归属由业务判定。 */
12
+ export interface IAdvisorShareInfo {
13
+ advisorId?: string;
14
+ cardId?: string;
15
+ shareAt?: number;
16
+ }
17
+ /** 订单场景信息(查询结果允许历史订单缺少场景层级)。 */
18
+ export interface IOrderSceneInfo {
19
+ scene1?: string;
20
+ scene2?: string;
21
+ appScene: number;
22
+ advisorShare?: IAdvisorShareInfo;
23
+ }
24
+ /** 创建订单时必须提供一级、二级场景。 */
25
+ export interface IOrderCreateSceneInfo extends IOrderSceneInfo {
26
+ scene1: string;
27
+ scene2: string;
28
+ }
11
29
  /**
12
30
  * 订单正向结构
13
31
  */
@@ -59,14 +77,7 @@ export interface IPositiveOrder {
59
77
  /** 快照:关联主单ID */
60
78
  rootOrderId: string;
61
79
  /** 快照:下单场景信息 */
62
- sceneInfo: {
63
- /** 一级场景 */
64
- scene1?: string;
65
- /** 二级场景 */
66
- scene2?: string;
67
- /** 小程序场景值 */
68
- appScene: number;
69
- };
80
+ sceneInfo: IOrderSceneInfo;
70
81
  /** 联系人信息 */
71
82
  contactInfo: {
72
83
  /** 姓名 */
package/types.test.js CHANGED
@@ -8,6 +8,42 @@ const isAutoConfirmedOrder = 1;
8
8
  const isSupplierAcknowledged = 0;
9
9
  // @ts-expect-error 原始订单结构中的布尔属性统一映射为数值
10
10
  const invalidIsAutoConfirmedOrder = true;
11
+ // These assignments and @ts-expect-error checks run through tsc/ts-jest, not just Jest assertions.
12
+ const advisorShare = { advisorId: '', cardId: '', shareAt: 0 };
13
+ const createScene = { scene1: '', scene2: '', appScene: 0, advisorShare };
14
+ const createV2Scene = createScene;
15
+ const depositScene = createScene;
16
+ const completeScene = createScene;
17
+ const storedScene = { appScene: 0, advisorShare: {} };
18
+ const legacyScene = { scene1: '', scene2: '', appScene: 0 };
19
+ const legacyStoredScene = { appScene: 0 };
20
+ const optionalDepositScene = undefined;
21
+ // @ts-expect-error Share timestamps must be numeric.
22
+ const invalidShareAt = { shareAt: '123' };
23
+ // @ts-expect-error null is not a supported share value.
24
+ const invalidNullShare = { advisorId: null };
25
+ // @ts-expect-error null is not a supported scene share value.
26
+ const invalidSceneShare = { appScene: 0, advisorShare: null };
27
+ // @ts-expect-error New order requests still require scene1.
28
+ const invalidCreateScene = { scene2: '', appScene: 0 };
29
+ // @ts-expect-error Deposit creation still requires scene2 if sceneInfo is present.
30
+ const invalidDepositScene = { scene1: '', appScene: 0 };
31
+ describe('订单场景类型', () => {
32
+ it('支持空串、部分分享信息与历史订单场景', () => {
33
+ expect(createV2Scene.advisorShare).toBe(advisorShare);
34
+ expect(depositScene.advisorShare).toBe(advisorShare);
35
+ expect(completeScene.advisorShare).toBe(advisorShare);
36
+ expect(storedScene.advisorShare).toEqual({});
37
+ expect(legacyScene.advisorShare).toBeUndefined();
38
+ expect(legacyStoredScene.scene1).toBeUndefined();
39
+ expect(optionalDepositScene).toBeUndefined();
40
+ expect(invalidShareAt.shareAt).toBe('123');
41
+ expect(invalidNullShare.advisorId).toBeNull();
42
+ expect(invalidSceneShare.advisorShare).toBeNull();
43
+ expect(invalidCreateScene.scene1).toBeUndefined();
44
+ expect(invalidDepositScene.scene2).toBeUndefined();
45
+ });
46
+ });
11
47
  describe('订单属性类型', () => {
12
48
  it('IPositiveAttributes 声明布尔字段,IRawOrderStructure 映射为数值字段', () => {
13
49
  expect(positiveAttributes.isAutoConfirmedOrder).toBe(true);