diff --git a/.workbuddy/memory/2026-07-07.md b/.workbuddy/memory/2026-07-07.md index a95ce00..961ac1f 100644 --- a/.workbuddy/memory/2026-07-07.md +++ b/.workbuddy/memory/2026-07-07.md @@ -21,3 +21,38 @@ - **search.vue**: 修正类型导入、添加搜索输入框、添加批量删除按钮(disabled 联动 selection) - **Detail Edit**: templateId 改为下拉选择(从 listShopExpressTemplate 加载选项) - 修复 rules 类型错误(reactive>) + +### Bug 修复 +- **JSON 反序列化错误**: 后端 type 字段为 Java Boolean,前端 radio 值从字符串 "0"/"1" 改为 true/false,Model 中 type 类型从 string 改为 boolean +- **ele-modal X按钮错位**: component.less 添加 ele-modal 关闭按钮定位修复,有最大化按钮时右移 56px +- **shopExpressTemplate/index.vue**: selection 绑定从 `:selection` 修正为 `v-model:selection` + +## 小程序端运费模板接入(guilixu-taro checkout) + +### 现状分析 +- checkout.tsx 运费硬编码"免运费",零处 import shopExpressTemplate API +- ShopGoods 模型中有 expressTemplateId 字段,运费模板与商品关联 +- ShopExpressTemplate 有 firstNum/firstAmount/extraNum/extraAmount 定价字段 +- 地址模型只有 province/city 字符串名,无数字 ID,地区匹配暂不可行 + +### 实现方案 +采用主模板定价方案(不依赖地区匹配): +- 创建 src/utils/expressFee.ts:computeExpressFee() 工具函数 +- 按模板分组、合并同模板商品数量、应用计费公式 +- fee = firstAmount + extraAmount * ceil(max(0, Q - firstNum) / extraNum) +- 修改 checkout.tsx:添加 expressFee 状态 + useEffect 自动计算 + 动态显示运费 + 纳入总价 + +### 注意事项 +- 购物车 items 不包含 product 嵌套对象,cart checkout 时 expressTemplateId 为 undefined,运费显示为 0(免运费) +- buyNow 流程 items 包含 product 数据,运费计算正常工作 +- 后端创建订单时会独立计算运费,前端仅用于展示预览 + +## 修复 shopExpressTemplate 删除报错 + +- 问题:删除运费模板时报错 "参数格式错误: id 的值 'undefined' 无法转换为 Integer" +- 根因:后端返回的主键字段是 `id`,但前端代码用了 `row.shopExpressTemplateId`(Model 中定义了两个字段,实际后端只返回 `id`) +- 修复文件: + - `src/views/shop/shopExpressTemplate/index.vue`:`row-key`、删除、批量删除均改为用 `row.id` + - `src/views/shop/shopExpressTemplateDetail/index.vue`:同上 + - `src/views/shop/shopExpressTemplateDetail/components/shopExpressTemplateDetailEdit.vue`:下拉选择器 `field-names` 的 `value` 改为 `'id'` +- 注意:该模块 Model 中 `shopExpressTemplateId` 和 `id` 并存,建议后续清理废弃字段 diff --git a/dist.zip b/dist.zip deleted file mode 100644 index 9d016c6..0000000 Binary files a/dist.zip and /dev/null differ diff --git a/src/api/shop/shopExpressTemplate/model/index.ts b/src/api/shop/shopExpressTemplate/model/index.ts index e55ae22..a980651 100644 --- a/src/api/shop/shopExpressTemplate/model/index.ts +++ b/src/api/shop/shopExpressTemplate/model/index.ts @@ -8,8 +8,8 @@ export interface ShopExpressTemplate { shopExpressTemplateId?: number; /** 旧字段ID(兼容) */ id?: number; - /** 计费方式: 0=按件, 1=按重量 */ - type?: string; + /** 计费方式: true=按件, false=按重量 */ + type?: boolean; /** 模板名称 */ title?: string; /** 首件价格 */ diff --git a/src/api/shop/shopExpressTemplateDetail/model/index.ts b/src/api/shop/shopExpressTemplateDetail/model/index.ts index 4a61693..eeee907 100644 --- a/src/api/shop/shopExpressTemplateDetail/model/index.ts +++ b/src/api/shop/shopExpressTemplateDetail/model/index.ts @@ -10,8 +10,8 @@ export interface ShopExpressTemplateDetail { id?: number; /** 所属运费模板ID */ templateId?: number; - /** 计费方式: 0=按件, 1=按重量 */ - type?: string; + /** 计费方式: true=按件, false=按重量 */ + type?: boolean; /** 省份ID */ provinceId?: number; /** 城市ID */ @@ -46,7 +46,7 @@ export interface ShopExpressTemplateDetailParam extends PageParam { /** 所属运费模板ID */ templateId?: number; /** 计费方式 */ - type?: string; + type?: boolean; /** 状态 */ status?: number; keywords?: string; diff --git a/src/styles/component.less b/src/styles/component.less index dd4b067..893d1ca 100644 --- a/src/styles/component.less +++ b/src/styles/component.less @@ -85,3 +85,36 @@ border-radius: 0 0 12px 12px; } } + +/* ele-modal 最大化按钮与关闭按钮位置修复 */ +.ele-modal .ant-modal-header { + .ant-modal-close { + position: absolute; + top: 0; + right: 0; + width: 30px; + height: 30px; + display: flex; + align-items: center; + justify-content: center; + z-index: 10; + } + + /* 当存在最大化按钮时,关闭按钮左移 */ + .ele-modal-maximize-btn + .ant-modal-close, + .ele-modal-maximize-btn ~ .ant-modal-close { + right: 30px; + } +} + +/* 针对 ant-modal 关闭按钮的兜底修复 */ +.ant-modal .ant-modal-close { + position: absolute; + top: 0; + right: 0; + width: 30px; + height: 30px; + display: flex; + align-items: center; + justify-content: center; +} diff --git a/src/views/shop/shopExpressTemplate/components/shopExpressTemplateEdit.vue b/src/views/shop/shopExpressTemplate/components/shopExpressTemplateEdit.vue index e048b66..27aef61 100644 --- a/src/views/shop/shopExpressTemplate/components/shopExpressTemplateEdit.vue +++ b/src/views/shop/shopExpressTemplate/components/shopExpressTemplateEdit.vue @@ -30,16 +30,16 @@ - 按件 - 按重量 + 按件 + 按重量 - + @@ -52,12 +52,12 @@ v-model:value="form.firstAmount" /> - + @@ -141,7 +141,7 @@ const form = reactive({ shopExpressTemplateId: undefined, id: undefined, - type: '0', + type: true, title: undefined, firstAmount: undefined, extraAmount: undefined, diff --git a/src/views/shop/shopExpressTemplate/index.vue b/src/views/shop/shopExpressTemplate/index.vue index 066d34b..9278cb4 100644 --- a/src/views/shop/shopExpressTemplate/index.vue +++ b/src/views/shop/shopExpressTemplate/index.vue @@ -3,7 +3,7 @@