You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
dianshang-qianduan/docs/superpowers/plans/2026-08-26-market-opportuni...

95 lines
4.4 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 市场机会识别第二步权重设置 Implementation Plan
> **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:** 让学生在市场机会识别第二步完成符合原型的指标权重设定、实时计算和可靠保存。
**Architecture:** 前端页面负责按固定分组渲染权重表、输入状态和即时总计;既有第二步接口负责服务器端最终校验。答案继续存放在学生实训答案的 `step2Answer`,不新增数据表或接口字段。
**Tech Stack:** Vue 3、Element Plus、Vite、Spring Boot、JUnit 5。
---
## 文件结构
- 修改:`src/views/product/market-opportunity-selection.vue` — 第二步表格、状态提示、交互和保存回显。
- 修改:`tests/market-opportunity-step2.static.test.cjs` — 前端结构与计算契约。
- 修改:`E:/workspace/dianshang/dianshang-houduan/src/test/java/com/sztzjy/linkCommerce/service/impl/MarketOpportunitySelectionStepTwoServiceImplTest.java` — 后端校验回归测试。
### Task 1: 前端第二步权重表契约
**Files:**
- Create: `tests/market-opportunity-step2.static.test.cjs`
- Modify: `src/views/product/market-opportunity-selection.vue`
- [ ] **Step 1: 编写失败的前端契约测试**
断言页面按以下固定顺序含有一级指标和二级指标:市场规模(搜索次数、成交金额)、市场潜力(成交金额增速、类目成交增速)、竞争强度(需供比、在线商品数、在线商家数)、运营难度(自然流占比、退货率);同时断言 2535、6575、5565、3545、2030、1020 建议区间、一级/对应总权重统计、实时错误状态和公式计算函数存在。
- [ ] **Step 2: 运行测试确认失败**
Run`E:/workspace/dianshang/dianshang-qianduan`: `node --test tests/market-opportunity-step2.static.test.cjs`
Expected: 因新的原型布局和输入反馈契约尚未实现而失败。
- [ ] **Step 3: 最小化实现原型布局与即时反馈**
让第二步使用分组表格:一级权重输入使用合并单元格,二级权重按指标逐行输入,对应总权重只读显示;在总计不满足 100% 时显示错误提示。
- [ ] **Step 4: 运行前端测试确认通过**
Run`E:/workspace/dianshang/dianshang-qianduan`: `node --test tests/market-opportunity-step2.static.test.cjs`
Expected: PASS。
### Task 2: 后端权重规则回归
**Files:**
- Modify: `E:/workspace/dianshang/dianshang-houduan/src/test/java/com/sztzjy/linkCommerce/service/impl/MarketOpportunitySelectionStepTwoServiceImplTest.java`
- [ ] **Step 1: 编写失败的后端测试**
新增一个请求:一级权重合法,但某个维度缺少预期的二级指标(或包含未知二级指标),断言服务拒绝。测试请求严格使用既有数组契约:`primaryWeights[].group`、`primaryWeights[].weight`、`dimensionWeights[].id`、`dimensionWeights[].weight`。
- [ ] **Step 2: 运行后端定向测试确认失败或暴露缺口**
Run`E:/workspace/dianshang/dianshang-houduan`: `mvn -Dtest=MarketOpportunitySelectionStepTwoServiceImplTest test`
Expected: 若服务未覆盖该边界则失败;若现有服务已覆盖,记录现有实现满足约束并保持测试通过。
- [ ] **Step 3: 只在测试暴露缺口时补充最小校验代码**
保持请求字段和答案存储格式不变,确保服务拒绝缺失或未知的二级指标。
- [ ] **Step 4: 运行定向测试确认通过**
Run`E:/workspace/dianshang/dianshang-houduan`: `mvn -Dtest=MarketOpportunitySelectionStepTwoServiceImplTest test`
Expected: PASS。
### Task 3: 集成验证
**Files:**
- Modify: `src/views/product/market-opportunity-selection.vue`
- [ ] **Step 1: 验证答案保存与回显数据结构**
确认 `buildStepTwoOutcome` 保存 `primaryWeights`、`dimensionWeights` 和自动计算的 `correspondingWeights`;确认 `loadSavedAnswer` 使用同名字段恢复数据。
- [ ] **Step 2: 运行前端生产构建**
Run`E:/workspace/dianshang/dianshang-qianduan`: `npm run build:prod`
Expected: exit code 0。
- [ ] **Step 3: 运行后端完整测试**
Run`E:/workspace/dianshang/dianshang-houduan`: `mvn test`
Expected: 0 failures0 errors。
- [ ] **Step 4: 提交本次功能修改**
仅提交本次页面、测试和必要的后端修复,不包含本地日志或无关设计文档。