feat(shopZone): 新增专区折扣系数功能及购物车链路支持
- HomeSection 模型增加 discountRate 字段,默认 1.00 表示不打折 - zoneEdit 组件新增折扣系数输入框,支持设置 0.01~1 之间的折扣率 - 后端 guilixu-java 增加专区折扣逻辑,成交价=市场价×折扣系数,保证后端价格计算安全 - 小程序 guilixu-taro 频道详情和商品详情支持专区折扣展示和传参 - 购物车新增 sectionId 字段,支持专区折扣价计算,完善购物车加购与价格计算逻辑 - 提供对应迁移 SQL 脚本更新数据库结构(专区折扣率与购物车 section_id) - 修复历史订单商品支付状态,补偿专区销量统计数据 - MEMORY 文档补充详细开发与设计说明,明确双后端接口调度和业务逻辑划分
This commit is contained in:
@@ -0,0 +1,40 @@
|
||||
# 2026-08-18 工作日志
|
||||
|
||||
## 专区商城价 = 市场价 × 折扣系数 功能(已实现)
|
||||
|
||||
客户要求:专区的商城价显示为市场价的 0.78(并按此价成交)。已与用户确认:展示+成交价都按系数、每专区单独配(默认1.00)、基数=市场价 salePrice。
|
||||
|
||||
### 后端 guilixu-java(仅此,商城走 guilixu-java)
|
||||
- `ShopHomeSection` + `ShopHomeSectionParam` 增加 `discountRate`(BigDecimal, 默认1.00)。
|
||||
- 迁移 SQL:`guilixu-admin/zone-discount-rate-10606.sql`(`ALTER TABLE shop_home_section ADD discount_rate DECIMAL(10,2) NOT NULL DEFAULT 1.00`)。需在生产库执行。
|
||||
- `OrderCreateRequest.OrderGoodsItem` 增加 `sectionId`(每商品项携带专区ID)。
|
||||
- `OrderBusinessService` **两处**价格解析(①`validateAndCalculateTotal` 算总额 ②`createOrder` 落库订单商品价)都加了专区折扣逻辑:若 `item.sectionId` 命中且商品 `section_ids` 含它、且专区 `discountRate≠1`,则 `actualPrice = goods.getSalePrice() × rate`(保留两位小数,HALF_UP)。后端不信任前端传价,按 sectionId 重算,防篡改。
|
||||
|
||||
### 后台 guilixu-admin
|
||||
- `src/api/shop/shopZone/model/index.ts` 的 `HomeSection` 增加 `discountRate?: number`。
|
||||
- `src/views/special/zone/components/zoneEdit.vue`:表单加「折扣系数」输入框(a-input-number,0.01~1,默认1,提示"专区商城价=市场价×系数"),表单默认值 `discountRate: 1`。
|
||||
|
||||
### 小程序 guilixu-taro(仅「专区→立即购买」链路打通)
|
||||
- `src/api/shop/shopHomeSection/index.ts` 增加 `getHomeSection(id)`。
|
||||
- `src/api/shop/shopHomeSection/model/index.ts` 的 `HomeSection` 增加 `discountRate?`。
|
||||
- `section-detail.tsx`:进入时 `getHomeSection` 取折扣系数并展示(价格=市场价×系数,划线价显示市场价),跳转详情带 `sectionId`+`discountRate`。
|
||||
- `product-detail.tsx`:读 `sectionId`/`discountRate`,按系数展示;立即购买时把系数写入 `buy_now` 存储并带参跳结算。
|
||||
- `src/api/shop/shopOrder/model/index.ts` 的 `OrderGoodsItem` 增加 `sectionId?`。
|
||||
- `checkout.tsx`:增加 `getItemDisplayPrice`/`getItemSectionId`,按系数估价并随下单提交 `sectionId`。
|
||||
|
||||
### ⚠️ 已知限制
|
||||
- **购物车链路不支持专区折扣**:服务端 `shop_cart` 表无 `sectionId` 字段,从专区「加入购物车」再结算会走原价(仅「立即购买」享受折扣)。若要购物车也生效,需给 `shop_cart` 表加 `section_id` 并在下单时透传——后续需求。
|
||||
- 未执行迁移 SQL、未重新部署后端、未构建发布前端,需按环境操作。
|
||||
|
||||
### 验证
|
||||
- 前端 `tsc --noEmit` 因环境配置(taro 缺 @tarojs/taro 类型、admin 大量既存错误)未完整跑通,但本次改动文件未产生任何新报错。
|
||||
- 后端 Maven 不在本环境,未编译;改动为标准 Java,已逐行核对。
|
||||
|
||||
## 购物车链路打通专区折扣(补充实现)
|
||||
|
||||
用户要求把"购物车也支持专区折扣"补上。在「立即购买」已实现基础上,打通购物车链路:
|
||||
|
||||
- **后端 guilixu-java**:`ShopCart` 实体加 `sectionId`(真实列)+`discountRate`(exist=false 关联字段);`ShopCartMapper.xml` 的 selectSql 增加 `LEFT JOIN shop_home_section hs ON a.section_id = hs.section_id` 并选 `hs.discount_rate AS discount_rate`(section_id 为 NULL 时不影响普通商品);`ShopCartServiceImpl.addToCart` 在"已存在累加"分支若本次新传 sectionId 非空则刷新 `existCart.sectionId`(让专区加购覆盖普通加购的 null)。迁移SQL:`zone-cart-section-id-10606.sql`(`ALTER TABLE shop_cart ADD section_id INT NULL`)。
|
||||
- **小程序 guilixu-taro**:`CartContext.addItem` 增可选 `sectionId` 参数并透传给加购接口;`refresh` 映射带 `sectionId`/`discountRate`;`CartItem` 接口加两字段;`calcPrice` 在 `discountRate≠1` 时用 `salePrice×rate`;`section-detail`/`product-detail` 加购调用传 `sectionId`;`cart.tsx` 单价展示用折扣价;`checkout.tsx` 的 `getItemDisplayPrice` 折扣分支改读顶层 `salePrice`(购物车项 product 为空,否则算不出折扣价)。
|
||||
- 下单成交价仍由 `OrderBusinessService` 按 `sectionId` 重算,购物车项带 sectionId 后自动生效,无需改下单逻辑。
|
||||
- 验证:taro `tsc --noEmit` 对本次改动 5 个文件零新报错。
|
||||
Reference in New Issue
Block a user