a228dcb96b
- model中省市多选字段由provinceIds/cityIds改为regionMode/regionIds - RegionMultiSelect组件去除update:provinceIds事件,改仅emit update:value - 编辑弹窗中城市选择变化同步更新form.regionIds和form.regionMode字段 - 回显数据时从regionIds拆分赋值,不再使用provinceIds/cityIds - 列表页customRender展示使用record.regionIds反查城市名 - 解决前端提交字段与后端实体不匹配导致数据未保存问题 - 确保本次改动完全兼容后端现有regionMode/regionIds机制,无需后端改动
3.5 KiB
3.5 KiB
2026-08-11 工作记录
运费模板配送地区改为「省+市两级多选穿梭弹窗」
需求背景
客户要求运费模板的配送地区选择改成仿截图的双栏穿梭弹窗(左侧候选 + 右侧已选), 选择粒度从原「省+市单选(级联)」升级为「多条规则覆盖多城市」,并保留「不选=全国」规则。
改动清单(纯前端,后端字段由用户确认可改)
- 新建组件
src/components/RegionMultiSelect/index.vue- 树形可展开:省级可展开看市级;省级"选择"=选该省全部市,市级可单独选。
- 左栏搜索(按省/市名过滤)、右栏已选列表(单项是"省/市"+取消)。
- 底部:全部选择 / 取消 / 确认。
v-model:value绑定已选城市ID数组;额外 emitupdate:provinceIds(由城市推导的省份ID数组)。- 复用
src/components/RegionsSelect/load-data.ts的 getRegionsData()(public/json/regions-data.json,取省+市两级,丢弃区级)。
- model
src/api/shop/shopExpressTemplateDetail/model/index.ts- 新增
provinceIds?: string(逗号分隔)、cityIds?: string(逗号分隔);保留旧provinceId/cityId兼容历史数据。
- 新增
- 编辑弹窗
src/views/shop/shopExpressTemplateDetail/components/shopExpressTemplateDetailEdit.vue- 移除
RegionsSelect type="provinceCity",改用RegionMultiSelect。 - 打开时从
record.cityIds(兼容旧cityId)回填;保存时数组→逗号串提交cityIds/provinceIds。
- 移除
- 列表页
src/views/shop/shopExpressTemplateDetail/index.vue- "配送地区"列 customRender 改为遍历
cityIds多值反查 regionMap;超22字截断+tooltip;旧单值数据兼容。 - 新增
h函数 import。
- "配送地区"列 customRender 改为遍历
待办 / 风险
- antd 为 v4,
var(--ant-color-border)在暗色下可能回退浅灰(边框略浅,不影响功能);如要完美暗色适配可后续改 less 变量。 - 构建验证(vite build)已通过。
⚠️ 重大修订(同日):前端字段名与后端不匹配,导致"没存进库"
根因
- 后端
ShopExpressTemplateDetail实体已有配送区域多选机制:regionMode(0=全国 / 1=指定配送白名单 / 2=不发货黑名单)+regionIds(逗号分隔的 6 位城市编码串)。 - 旧代码
provinceId/cityId是单值历史字段,已被迁移脚本sql/shop_express_template_detail_region.sql迁成regionMode=1, regionIds=城市编码。 - 我第一版前端提交的是
provinceIds/cityIds,后端实体无此字段 → MyBatis-Plus 自动忽略未知字段 → 看起来"没存没变化"。 - ORM 是 MyBatis-Plus,add/update 用
save()/updateById()自动生成 SQL,接收的是实体类本身(非 Param);新增字段只需在实体加属性 + 表加列,无需改 Mapper XML。
修复(对接后端已有的 regionMode/regionIds,无需后端改动)
- model:
provinceIds/cityIds→ 改为regionMode?、regionIds?。 RegionMultiSelect组件:去掉update:provinceIdsemit,只 emitupdate:value(城市编码数组)。- 编辑弹窗:城市选择变化 →
form.regionIds = 逗号串、form.regionMode = 1(有选)或0(全国);回显从form.regionIds拆出。 - 列表页:customRender 读
record.regionIds反查城市名。
- 结论:本需求纯前端即可闭环,后端无需改。城市编码(
regions-data.json的 city value,6位)与regionIds完全一致,下单校验DeliveryRegionChecker读regionIds直接生效。