@be-link/pos-cli-nodejs 1.0.234 → 1.0.236

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,6 +1,6 @@
1
1
  {
2
2
  "name": "@be-link/pos-cli-nodejs",
3
- "version": "1.0.234",
3
+ "version": "1.0.236",
4
4
  "description": "正向订单服务Nodejs客户端",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -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
  /** 预订人手机号 */
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
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
+ jest.mock('../../http', () => ({ callApi: jest.fn() }));
16
+ const http_1 = require("../../http");
17
+ const pos_1 = require("vitality-meta/enums/pos");
18
+ const user_1 = __importDefault(require("./user"));
19
+ const mockedCallApi = http_1.callApi;
20
+ describe('getOrderSettlementFacts', () => {
21
+ beforeEach(() => mockedCallApi.mockReset());
22
+ it.each([0, 2])('返回原始结算事实,保留 %s 份且不要求 attributes block', (remainQuantity) => __awaiter(void 0, void 0, void 0, function* () {
23
+ const facts = {
24
+ orderId: 'order-1',
25
+ status: pos_1.TradeOrderStatusEnum.SUCCEED,
26
+ remainQuantity,
27
+ };
28
+ mockedCallApi.mockResolvedValue(facts);
29
+ const request = { id: 'order-1' };
30
+ yield expect(user_1.default.getOrderSettlementFacts(request)).resolves.toBe(facts);
31
+ expect(mockedCallApi).toHaveBeenCalledWith(expect.stringMatching(/\/query\/user\/get-order-settlement-facts$/), request);
32
+ }));
33
+ it('未完结状态原样返回,由消费者决定重试', () => __awaiter(void 0, void 0, void 0, function* () {
34
+ const facts = { orderId: 'order-1', status: pos_1.TradeOrderStatusEnum.FULFILLING, remainQuantity: 1 };
35
+ mockedCallApi.mockResolvedValue(facts);
36
+ yield expect(user_1.default.getOrderSettlementFacts({ id: 'order-1' })).resolves.toEqual(facts);
37
+ }));
38
+ it('查询失败不使用零份数或缓存结果兜底', () => __awaiter(void 0, void 0, void 0, function* () {
39
+ const error = new Error('upstream unavailable');
40
+ mockedCallApi.mockRejectedValue(error);
41
+ yield expect(user_1.default.getOrderSettlementFacts({ id: 'order-1' })).rejects.toBe(error);
42
+ }));
43
+ });
@@ -3,6 +3,10 @@ import * as DTO from '../../../types';
3
3
  /** QueryByWeb 命名空间 */
4
4
  export declare namespace Service {
5
5
  namespace Request {
6
+ interface getOrderSettlementFacts {
7
+ /** 订单id */
8
+ id: string;
9
+ }
6
10
  interface getOrderById<K> {
7
11
  /** 订单id */
8
12
  id: string;
@@ -965,6 +969,13 @@ export declare namespace Service {
965
969
  }
966
970
  }
967
971
  namespace Response {
972
+ /** 查询时主库同一快照中的状态与主 ITEM 剩余份数,不是完结时快照。 */
973
+ interface getOrderSettlementFacts {
974
+ orderId: string;
975
+ status: PosConstants.TradeOrderStatusEnum;
976
+ /** 首个匹配主 ITEM 的剩余份数;无主 ITEM SKU 时取首个匹配商品行,零为有效值。 */
977
+ remainQuantity: number;
978
+ }
968
979
  interface mgetUserOrderCountList {
969
980
  /** 用户id: 数量 */
970
981
  [unionId: string]: number;
@@ -1296,6 +1307,12 @@ export declare namespace Service {
1296
1307
  }
1297
1308
  /** 用户维度查询 */
1298
1309
  interface QueryByUserController {
1310
+ /**
1311
+ * 查询当前主库结算事实,绕过缓存。调用方仅在 SUCCEED 时入账,入账后不因退款调整。
1312
+ * 未完结订单原样返回状态;不存在或份数缺失/非法时抛错,不以零兜底。
1313
+ * @path /query/user/get-order-settlement-facts
1314
+ */
1315
+ getOrderSettlementFacts(request: Request.getOrderSettlementFacts): Promise<Response.getOrderSettlementFacts>;
1299
1316
  /**
1300
1317
  * list开票记录
1301
1318
  * @returns 开票记录
@@ -3,6 +3,7 @@ import { Service } from './types';
3
3
  import * as DTO from '../../../types';
4
4
  declare class QueryByUserService extends BaseService implements Service.QueryByUserController {
5
5
  protected prefixUrl: string;
6
+ getOrderSettlementFacts(request: Service.Request.getOrderSettlementFacts): Promise<Service.Response.getOrderSettlementFacts>;
6
7
  listOrderInvoiceCount(request: Service.Request.getOrderInvoiceRequest): Promise<number>;
7
8
  listOrderInvoice(request: Service.Request.getOrderInvoiceRequest): Promise<DTO.IPositiveOrderInvoice[]>;
8
9
  getOrderInvoiceByOrderId(request: any): Promise<DTO.IPositiveOrderInvoice>;
@@ -20,6 +20,9 @@ class QueryByUserService extends service_1.default {
20
20
  super(...arguments);
21
21
  this.prefixUrl = '/query/user';
22
22
  }
23
+ getOrderSettlementFacts(request) {
24
+ return (0, http_1.callApi)(this.getApiUrl(this.getOrderSettlementFacts), request);
25
+ }
23
26
  listOrderInvoiceCount(request) {
24
27
  return (0, http_1.callApi)(this.getApiUrl(this.listOrderInvoiceCount), request);
25
28
  }
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);