Files
gxwebsoft 8d8080c7bf feat(shopZone): 新增专区折扣系数功能及购物车链路支持
- HomeSection 模型增加 discountRate 字段,默认 1.00 表示不打折
- zoneEdit 组件新增折扣系数输入框,支持设置 0.01~1 之间的折扣率
- 后端 guilixu-java 增加专区折扣逻辑,成交价=市场价×折扣系数,保证后端价格计算安全
- 小程序 guilixu-taro 频道详情和商品详情支持专区折扣展示和传参
- 购物车新增 sectionId 字段,支持专区折扣价计算,完善购物车加购与价格计算逻辑
- 提供对应迁移 SQL 脚本更新数据库结构(专区折扣率与购物车 section_id)
- 修复历史订单商品支付状态,补偿专区销量统计数据
- MEMORY 文档补充详细开发与设计说明,明确双后端接口调度和业务逻辑划分
2026-08-18 10:53:15 +08:00

41 lines
4.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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-number0.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 个文件零新报错。