Browse Source

feat(miniapp): 指标 API 封装 getIndicatorTrend/ChangeRanking/QuickLookup/CorrelationList

iwt 2 days ago
parent
commit
dd62e2b380
2 changed files with 86 additions and 0 deletions
  1. 75 0
      cfc-frontend/__tests__/api/api.indicator.test.js
  2. 11 0
      cfc-frontend/utils/api.js

+ 75 - 0
cfc-frontend/__tests__/api/api.indicator.test.js

@@ -0,0 +1,75 @@
+/**
+ * 指标 API 封装契约测试
+ * 验证 URL / method / body 正确,且是规范入口(单 URL 单封装)
+ */
+import * as api from '@/utils/api'
+import { getIndicatorTrend, getIndicatorChangeRanking, getIndicatorQuickLookup, getIndicatorCorrelationList } from '@/utils/api'
+
+// --------------- helpers ---------------
+function mockSuccess(data) {
+  global.uni.request.mockImplementation((opts) => {
+    process.nextTick(() => {
+      if (opts.success) opts.success({ data })
+    })
+  })
+}
+
+function lastRequest() {
+  const calls = global.uni.request.mock.calls
+  return calls[calls.length - 1][0]
+}
+
+// --------------- global beforeEach ---------------
+describe('indicator API 封装', () => {
+  beforeEach(() => {
+    global.uni._storage = {}
+    global.uni.request.mockReset()
+    global.uni.showToast.mockReset()
+    global.uni.reLaunch.mockReset()
+    global.uni.login.mockReset()
+    global.getCurrentPages.mockReset()
+    global.getCurrentPages.mockReturnValue([{ route: 'pages/index-home/index' }])
+    global.uni.getAccountInfoSync.mockReset()
+    global.uni.getAccountInfoSync.mockReturnValue({ miniProgram: { envVersion: 'develop' } })
+    api.clearApiDedup()
+  })
+
+  test('getIndicatorTrend → POST /api/indicator/trend with subjectId+definitionIds', async () => {
+    mockSuccess({ code: 200, data: {} })
+    await getIndicatorTrend({ subjectId: 5, definitionIds: [1, 2] })
+    const opts = lastRequest()
+    expect(opts.url).toMatch(/\/api\/indicator\/trend$/)
+    expect(opts.method).toBe('POST')
+    expect(opts.data.subjectId).toBe(5)
+    expect(opts.data.definitionIds).toEqual([1, 2])
+  })
+
+  test('getIndicatorChangeRanking → POST /api/indicator/change-ranking with scope+orderBy', async () => {
+    mockSuccess({ code: 200, data: {} })
+    await getIndicatorChangeRanking({ subjectId: 5, scope: 'adjacent', orderBy: 'magnitude', limit: 50 })
+    const opts = lastRequest()
+    expect(opts.url).toMatch(/\/api\/indicator\/change-ranking$/)
+    expect(opts.method).toBe('POST')
+    expect(opts.data.scope).toBe('adjacent')
+    expect(opts.data.orderBy).toBe('magnitude')
+  })
+
+  test('getIndicatorQuickLookup → POST /api/indicator/quick-lookup with page', async () => {
+    mockSuccess({ code: 200, data: {} })
+    await getIndicatorQuickLookup({ subjectId: 5, category: '核心菌属', page: 1, pageSize: 30 })
+    const opts = lastRequest()
+    expect(opts.url).toMatch(/\/api\/indicator\/quick-lookup$/)
+    expect(opts.method).toBe('POST')
+    expect(opts.data.page).toBe(1)
+    expect(opts.data.pageSize).toBe(30)
+  })
+
+  test('getIndicatorCorrelationList → POST /api/indicator/correlation/list with subjectId+definitionId', async () => {
+    mockSuccess({ code: 200, data: {} })
+    await getIndicatorCorrelationList({ subjectId: 5, definitionId: 3 })
+    const opts = lastRequest()
+    expect(opts.url).toMatch(/\/api\/indicator\/correlation\/list$/)
+    expect(opts.method).toBe('POST')
+    expect(opts.data.definitionId).toBe(3)
+  })
+})

+ 11 - 0
cfc-frontend/utils/api.js

@@ -3394,3 +3394,14 @@ export const createSsoTicket = (target) =>
 /** 用一次性票据换取登录态。返回登录信息(结构同 wechatLogin 的 data) */
 export const ssoLogin = (ticket) =>
   request('/api/auth/sso-login', 'POST', { ticket })
+
+// ============ 指标变化曲线 / 速查 / 关联 ============
+// 规范入口(singular per URL)。后端契约见 design.md §6.1-6.4。
+/** 指标趋势(曲线页):{ subjectId, definitionIds:[] } */
+export const getIndicatorTrend = (params) => request('/api/indicator/trend', 'POST', params || {})
+/** 变化幅度排名:{ subjectId, reportType?, category?, scope:'adjacent'|'first-vs-latest', orderBy:'up'|'down'|'magnitude', limit } */
+export const getIndicatorChangeRanking = (params) => request('/api/indicator/change-ranking', 'POST', params || {})
+/** 指标速查(分类分页):{ subjectId, category?, page, pageSize } */
+export const getIndicatorQuickLookup = (params) => request('/api/indicator/quick-lookup', 'POST', params || {})
+/** 指标关联查询:{ subjectId, definitionId }(本期仅封装,展示二期) */
+export const getIndicatorCorrelationList = (params) => request('/api/indicator/correlation/list', 'POST', params || {})