# 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 个文件零新报错。