# 预存余额错误处理修复 + 柜台收费开票/分账状态展示
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** 修复 3 类异常处理缺陷 + 柜台收费主表格增加开票状态和分账状态列。
**Architecture:** 后端 3 处异常处理修正已完成(未提交),本次计划覆盖剩余 2 项:后端 VO 加字段 + 前端表格加列。`BeanUtils.toBean` 自动映射同名属性,后端改动最小。
**Tech Stack:** Spring Boot 3, MyBatis-Plus, Vue 3, Element Plus, TypeScript
---
## 已完成修改 (未提交)
| 文件 | 修改内容 |
|------|---------|
| `ChargeServiceImpl.java:2276-2281` | `catch(Exception)` 不再包装为 `IllegalArgumentException`,改为 `exception(INTERNAL_SERVER_ERROR)` |
| `ChargeServiceImpl.java:2446-2448` | 开票状态校验从 `!= NOT_INVOICED` 改为仅拦截 `PARTIALLY_INVOICED` 和 `INVOICE_COMPLETED` |
| `PrestorageAdjustInternalApiImpl.java:194-200` | catch 内 DB 更新加嵌套 try-catch,防止状态更新失败吞异常 |
| `BadDebt/PriceDiff/LateFeeReduce/Writtenoff` AdjustInternalApiImpl | catch 内 `.message(e.getMessage())` 加 null-safe |
---
### Task 1: 后端 — ChargeDetailsPageRespVO 加分账字段
**Files:**
- Modify: `sw-business/sw-business-server/src/main/java/cn/com/emsoft/sw/business/controller/admin/charge/vo/ChargeDetailsPageRespVO.java` (在 `invoiceStateName` 之后插入)
**Purpose:** 柜台收费主表格 API (`/business/charge/page-details`) 返回 `splitAdjustId`、`splitStatus` 字段,供前端展示分账状态。`ChargeDO` 已有这两个字段,只需在 VO 中声明即可自动映射。
- [ ] **Step 1: 在 ChargeDetailsPageRespVO 添加字段**
在 `ChargeDetailsPageRespVO.java` 的 `invoiceStateName` 字段后面添加:
```java
@Schema(description = "分账调整主表ID")
private Long splitAdjustId;
@Schema(description = "分账状态:NONE/PARENT_SPLIT/SPLIT_CHILD")
@ExcelProperty("分账状态")
private String splitStatus;
```
位置:`invoiceStateName` 字段声明之后、`meterOthType` 字段之前。`BeanUtils.toBean` 自动从 `ChargeDO.splitAdjustId` / `ChargeDO.splitStatus` 映射。
- [ ] **Step 2: 编译验证**
```bash
cd /Volumes/Dpan/github/water-workspace/water-backend/sw-business/sw-business-server && mvn compile -o
```
Expected: BUILD SUCCESS.
- [ ] **Step 3: Commit**
```bash
cd /Volumes/Dpan/github/water-workspace/water-backend
git add sw-business/sw-business-server/src/main/java/cn/com/emsoft/sw/business/controller/admin/charge/vo/ChargeDetailsPageRespVO.java
git commit -m "feat(charge): ChargeDetailsPageRespVO 加分账字段 splitAdjustId + splitStatus"
```
---
### Task 2: 前端 — 柜台收费主表格加开票状态 + 分账状态列
**Files:**
- Modify: `water-frontend/src/views/operatingCharges/counterCharging/index.vue:206-208` (在"状态"列之后插入两列)
**Purpose:** 待缴账单表格中,在"状态"列后面加"开票状态"(已有后端字段 `invoiceStateName`)和"分账状态"(新后端字段 `splitStatus`),让操作员预判操作是否会被拦截。
- [ ] **Step 1: 在待缴账单表格加两列**
当前代码(约 206-208 行):
```html
未收
```
修改为:
```html
未收
{{ row.invoiceStateName || '-' }}
已分账
子账单
-
```
- [ ] **Step 2: 集收号模式下的子表格也同样加列**
找到集收号子表格(约 75-89 行,`getHubCustomerCharges` 对应的 el-table),在"状态"列后同样插入上述两列。列定义相同。
- [ ] **Step 3: TypeScript 类型检查**
```bash
cd /Volumes/Dpan/github/water-workspace/water-frontend && npx vue-tsc --noEmit 2>&1 | grep "counterCharging" | head -10
```
Expected: 无新增错误(`CounterChargingChargeVO` 声明了 `[key: string]: any`,新字段不会报类型错误)。
- [ ] **Step 4: Commit**
```bash
cd /Volumes/Dpan/github/water-workspace/water-frontend
git add src/views/operatingCharges/counterCharging/index.vue
git commit -m "feat(counter): 柜台收费表格加开票状态 + 分账状态列"
```
---
### Task 3: 提交全部后端异常处理修复
**Files:** (已在工作区修改,待提交)
- `ChargeServiceImpl.java`
- `PrestorageAdjustInternalApiImpl.java`
- `BadDebtAdjustInternalApiImpl.java`
- `PriceDiffAdjustInternalApiImpl.java`
- `LateFeeReduceInternalApiImpl.java`
- `WrittenoffAdjustInternalApiImpl.java`
- [ ] **Step 1: 确认修改内容**
```bash
cd /Volumes/Dpan/github/water-workspace/water-backend && git diff --stat
```
应显示 6 files changed.
- [ ] **Step 2: 编译确认**
```bash
cd /Volumes/Dpan/github/water-workspace/water-backend/sw-business/sw-business-server && mvn compile -o
```
Expected: BUILD SUCCESS (仅 WARNING,无 ERROR).
- [ ] **Step 3: Commit**
```bash
cd /Volumes/Dpan/github/water-workspace/water-backend
git add -A
git commit -m "fix: 异常处理修正 — handleUsageAdjust 不伪装 400 + invoiceState 放宽 + InternalApi catch 加固"
```
---