# Project Detail Transaction Query Frontend Implementation Plan

> **For Claude:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task.

**Goal:** Replace the placeholder `DetailQuery.vue` with the full project detail bank statement query page and remove the obsolete upload-record jump entry.

**Architecture:** Keep the page inside the existing `ccdiProject/detail.vue` dynamic component system. Use one dedicated API module for list, options, detail, and export calls; preload project-wide select options on page entry; keep the entire interaction inside `DetailQuery.vue` plus a minimal cleanup in `UploadData.vue`.

**Tech Stack:** Vue 2.6, Element UI 2.15, Axios request wrapper, existing global `this.download`, `npm run build:prod` + manual smoke validation

---

### Task 1: Replace the placeholder with a typed page shell and make the build fail first

**Files:**
- Modify: `ruoyi-ui/src/views/ccdiProject/components/detail/DetailQuery.vue`
- Create: `ruoyi-ui/src/api/ccdiProjectBankStatement.js`

**Step 1: Write the failing verification**

In `DetailQuery.vue`, replace the placeholder text with the final top-level data structure and import the new API module before creating it:

```javascript
import {
  listBankStatement,
  getBankStatementOptions,
  getBankStatementDetail
} from "@/api/ccdiProjectBankStatement";
```

Also add empty methods `getList`, `getOptions`, and `handleExport`.

**Step 2: Run build to verify it fails**

Run: `cd ruoyi-ui && npm run build:prod`

Expected: FAIL because `@/api/ccdiProjectBankStatement` does not exist yet.

**Step 3: Write minimal implementation**

Create `ruoyi-ui/src/api/ccdiProjectBankStatement.js` with:

```javascript
import request from "@/utils/request";

export function listBankStatement(query) {
  return request({
    url: "/ccdi/project/bank-statement/list",
    method: "get",
    params: query
  });
}
```

Add stubs for:

- `getBankStatementOptions(projectId)`
- `getBankStatementDetail(bankStatementId)`

Do not add export wrapper here; use `this.download` directly in the component.

**Step 4: Run build to verify it passes**

Run: `cd ruoyi-ui && npm run build:prod`

Expected: PASS or fail only on unfinished component template bindings.

**Step 5: Commit**

```bash
git add ruoyi-ui/src/views/ccdiProject/components/detail/DetailQuery.vue ruoyi-ui/src/api/ccdiProjectBankStatement.js
git commit -m "搭建流水明细查询前端页面骨架"
```

### Task 2: Implement page state, preload list and project-wide select options

**Files:**
- Modify: `ruoyi-ui/src/views/ccdiProject/components/detail/DetailQuery.vue`

**Step 1: Write the failing verification**

Add the real component state before wiring the template:

```javascript
data() {
  return {
    loading: false,
    optionsLoading: false,
    activeTab: "all",
    queryParams: {
      projectId: this.projectId,
      pageNum: 1,
      pageSize: 10,
      tabType: "all",
      transactionStartTime: "",
      transactionEndTime: "",
      counterpartyName: "",
      counterpartyNameEmpty: false,
      userMemo: "",
      userMemoEmpty: false,
      ourSubjects: [],
      ourBanks: [],
      ourAccounts: [],
      amountMin: "",
      amountMax: "",
      counterpartyAccount: "",
      counterpartyAccountEmpty: false,
      transactionType: "",
      transactionTypeEmpty: false,
      orderBy: "trxDate",
      orderDirection: "desc"
    },
    optionData: {
      ourSubjectOptions: [],
      ourBankOptions: [],
      ourAccountOptions: []
    }
  };
}
```

Call both `getList()` and `getOptions()` in `created()`.

**Step 2: Run build to verify it fails**

Run: `cd ruoyi-ui && npm run build:prod`

Expected: FAIL because the template has not been updated to use the new reactive state yet, or methods are incomplete.

**Step 3: Write minimal implementation**

Implement:

- `getList()`
- `getOptions()`
- `syncProjectId()`
- `handleQuery()`
- `resetQuery()`

Ensure `created()` and the `projectId` watcher both call:

```javascript
this.queryParams.projectId = this.projectId;
this.getOptions();
this.getList();
```

**Step 4: Run build to verify it passes**

Run: `cd ruoyi-ui && npm run build:prod`

Expected: PASS

**Step 5: Commit**

```bash
git add ruoyi-ui/src/views/ccdiProject/components/detail/DetailQuery.vue
git commit -m "实现流水明细查询页面初始加载逻辑"
```

### Task 3: Build the left filter panel and local-search multi-selects

**Files:**
- Modify: `ruoyi-ui/src/views/ccdiProject/components/detail/DetailQuery.vue`

**Step 1: Write the failing verification**

Replace the old placeholder template with the final left column filter markup using Element UI controls:

- `el-date-picker` for transaction time range
- `el-input` + `el-checkbox` for counterparty name, summary, counterparty account, transaction type
- `el-select multiple filterable collapse-tags` for subject, bank, account
- amount range inputs

Do not wire the search/reset buttons yet.

**Step 2: Run build to verify it fails**

Run: `cd ruoyi-ui && npm run build:prod`

Expected: FAIL because methods or bound state used in the template are incomplete.

**Step 3: Write minimal implementation**

Wire the filter controls to `queryParams` and `dateRange`:

```javascript
watch: {
  dateRange(value) {
    this.queryParams.transactionStartTime = value && value[0] ? value[0] : "";
    this.queryParams.transactionEndTime = value && value[1] ? value[1] : "";
  }
}
```

Add the left action buttons:

- `查询`
- `重置`

Add local filter support inside each `el-select` using Element UI `filterable`.

**Step 4: Run build to verify it passes**

Run: `cd ruoyi-ui && npm run build:prod`

Expected: PASS

**Step 5: Commit**

```bash
git add ruoyi-ui/src/views/ccdiProject/components/detail/DetailQuery.vue
git commit -m "完成流水明细查询筛选栏布局"
```

### Task 4: Build the right result area, tabs, table, pagination, and detail drawer

**Files:**
- Modify: `ruoyi-ui/src/views/ccdiProject/components/detail/DetailQuery.vue`

**Step 1: Write the failing verification**

Add the right-side structure:

- top tabs `全部 / 流入 / 流出`
- export button
- `el-table`
- `pagination`
- detail drawer or dialog

Reference the final columns:

- `trxDate`
- `leAccountNo / leAccountName`
- `customerAccountName / customerAccountNo`
- `userMemo / cashType`
- `displayAmount`
- `详情`

**Step 2: Run build to verify it fails**

Run: `cd ruoyi-ui && npm run build:prod`

Expected: FAIL because event handlers like `handleTabChange`, `handleSortChange`, `handleViewDetail`, or `handlePageChange` are missing.

**Step 3: Write minimal implementation**

Implement:

- `handleTabChange(tab)`
- `handleSortChange({ prop, order })`
- `handlePageChange(pageNum)`
- `handleViewDetail(row)`
- `closeDetailDialog()`

Sort mapping:

```javascript
const sortMap = {
  trxDate: "trxDate",
  displayAmount: "amount"
};
```

Tab mapping:

```javascript
const tabMap = {
  all: "all",
  in: "in",
  out: "out"
};
```

**Step 4: Run build to verify it passes**

Run: `cd ruoyi-ui && npm run build:prod`

Expected: PASS

**Step 5: Commit**

```bash
git add ruoyi-ui/src/views/ccdiProject/components/detail/DetailQuery.vue
git commit -m "完成流水明细查询结果区与详情展示"
```

### Task 5: Wire export, empty/error states, and responsive styles

**Files:**
- Modify: `ruoyi-ui/src/views/ccdiProject/components/detail/DetailQuery.vue`

**Step 1: Write the failing verification**

Add the `导出流水` button click handler without implementation:

```javascript
handleExport() {
  // TODO
}
```

Show the button in the UI but keep it clickable.

**Step 2: Run build to verify it fails functionally in manual smoke**

Run:

```bash
cd ruoyi-ui
npm run build:prod
```

Expected: BUILD PASS, but manual smoke in browser should show export button with no behavior yet.

**Step 3: Write minimal implementation**

Implement export with the existing global helper:

```javascript
this.download(
  "ccdi/project/bank-statement/export",
  { ...this.queryParams },
  `${this.projectInfo.projectName || "项目"}_流水明细_${Date.now()}.xlsx`
);
```

Add:

- empty state when `list.length === 0`
- inline error tip when list load fails
- disabled export when total is `0`
- responsive layout styles for mobile widths

**Step 4: Run build and manual smoke verification**

Run:

```bash
cd ruoyi-ui
npm run build:prod
```

Expected: BUILD PASS

Manual smoke:

1. Open project detail page
2. Switch to `流水明细查询`
3. Confirm left filters render
4. Confirm export button is disabled on empty data and enabled on non-empty data

**Step 5: Commit**

```bash
git add ruoyi-ui/src/views/ccdiProject/components/detail/DetailQuery.vue
git commit -m "补齐流水明细查询导出与状态反馈"
```

### Task 6: Remove obsolete upload-page operation column and finish smoke verification

**Files:**
- Modify: `ruoyi-ui/src/views/ccdiProject/components/detail/UploadData.vue`
- Modify if needed: `ruoyi-ui/src/views/ccdiProject/components/detail/DetailQuery.vue`

**Step 1: Write the failing verification**

Delete only the old upload-table operation column usage in the template, but do not clean methods yet.

**Step 2: Run build to verify it fails**

Run: `cd ruoyi-ui && npm run build:prod`

Expected: FAIL because `handleViewFlow` or `handleViewError` remains unused or referenced.

**Step 3: Write minimal implementation**

In `UploadData.vue`:

- remove the upload-record operation column entirely
- remove methods:
  - `handleViewFlow`
  - `handleViewError`
- remove any event payload that tried to change menu to `detail`

Keep upload, polling, and record-list refresh behavior unchanged.

**Step 4: Run final verification**

Run:

```bash
cd ruoyi-ui
npm run build:prod
```

Expected: BUILD PASS

Manual smoke:

1. Open one project detail page
2. Confirm `上传数据` 页不再出现“查看流水”入口
3. Confirm `流水明细查询` 可独立查询、筛选、分页、导出
4. Confirm手机宽度下左右布局能够折叠为上下布局

**Step 5: Commit**

```bash
git add ruoyi-ui/src/views/ccdiProject/components/detail/UploadData.vue ruoyi-ui/src/views/ccdiProject/components/detail/DetailQuery.vue ruoyi-ui/src/api/ccdiProjectBankStatement.js
git commit -m "完成流水明细查询前端实现并移除旧跳转入口"
```
