fix(shopExpressTemplateDetail): 修正配送区域多选字段对接后端机制
- model中省市多选字段由provinceIds/cityIds改为regionMode/regionIds - RegionMultiSelect组件去除update:provinceIds事件,改仅emit update:value - 编辑弹窗中城市选择变化同步更新form.regionIds和form.regionMode字段 - 回显数据时从regionIds拆分赋值,不再使用provinceIds/cityIds - 列表页customRender展示使用record.regionIds反查城市名 - 解决前端提交字段与后端实体不匹配导致数据未保存问题 - 确保本次改动完全兼容后端现有regionMode/regionIds机制,无需后端改动
This commit is contained in:
@@ -16,10 +16,10 @@ export interface ShopExpressTemplateDetail {
|
||||
provinceId?: number;
|
||||
/** 城市ID(旧单值字段,兼容历史数据) */
|
||||
cityId?: number;
|
||||
/** 省份IDs(逗号分隔,多选配送区域) */
|
||||
provinceIds?: string;
|
||||
/** 城市IDs(逗号分隔,多选配送区域) */
|
||||
cityIds?: string;
|
||||
/** 配送区域模式: 0=全国, 1=指定配送(白名单), 2=指定不发货(黑名单) */
|
||||
regionMode?: number;
|
||||
/** 地区编码列表(6位行政区划码,逗号分隔),regionMode=1或2时有效 */
|
||||
regionIds?: string;
|
||||
/** 首件数量/重量 */
|
||||
firstNum?: string;
|
||||
/** 首件价格 */
|
||||
|
||||
@@ -129,7 +129,6 @@
|
||||
|
||||
const emit = defineEmits<{
|
||||
(e: 'update:value', value: string[]): void;
|
||||
(e: 'update:provinceIds', value: string[]): void;
|
||||
}>();
|
||||
|
||||
const simpleImage = Empty.PRESENTED_IMAGE_SIMPLE;
|
||||
@@ -226,17 +225,6 @@
|
||||
}))
|
||||
);
|
||||
|
||||
const derivedProvinceIds = computed(() => {
|
||||
const set = new Set<string>();
|
||||
selectedSet.value.forEach((cv) => {
|
||||
const pv = cityToProvince.value[cv];
|
||||
if (pv) {
|
||||
set.add(pv);
|
||||
}
|
||||
});
|
||||
return Array.from(set);
|
||||
});
|
||||
|
||||
const selectProvince = (p: ProvinceItem) => {
|
||||
const s = new Set(selectedSet.value);
|
||||
p.cities.forEach((c) => s.add(c.value));
|
||||
@@ -275,7 +263,6 @@
|
||||
|
||||
const handleConfirm = () => {
|
||||
emit('update:value', selectedCities.value);
|
||||
emit('update:provinceIds', derivedProvinceIds.value);
|
||||
visible.value = false;
|
||||
};
|
||||
|
||||
|
||||
+22
-32
@@ -24,7 +24,6 @@
|
||||
<RegionMultiSelect
|
||||
:value="cityIds"
|
||||
@update:value="onCityIdsChange"
|
||||
@update:provinceIds="onProvinceIdsChange"
|
||||
/>
|
||||
<div class="rms-tip">不选则默认全国</div>
|
||||
</a-form-item>
|
||||
@@ -128,10 +127,8 @@
|
||||
const maxable = ref(true);
|
||||
// 表单实例
|
||||
const formRef = ref<FormInstance | null>(null);
|
||||
// 已选城市ID数组
|
||||
// 已选城市编码数组(对应后端的 regionIds)
|
||||
const cityIds = ref<string[]>([]);
|
||||
// 已选省份ID数组(由城市推导,随城市变化同步)
|
||||
const provinceIds = ref<string[]>([]);
|
||||
|
||||
// 表单数据
|
||||
const form = reactive<ShopExpressTemplateDetail>({
|
||||
@@ -140,8 +137,8 @@
|
||||
type: true,
|
||||
provinceId: undefined,
|
||||
cityId: undefined,
|
||||
provinceIds: undefined,
|
||||
cityIds: undefined,
|
||||
regionMode: undefined,
|
||||
regionIds: undefined,
|
||||
firstNum: undefined,
|
||||
firstAmount: undefined,
|
||||
extraAmount: undefined,
|
||||
@@ -190,16 +187,16 @@
|
||||
|
||||
const { resetFields } = useForm(form, rules);
|
||||
|
||||
/* 城市选中变化,同步到 form.cityIds */
|
||||
/* 城市选中变化,同步到 form.regionIds / regionMode(1=指定配送白名单,0=全国) */
|
||||
const onCityIdsChange = (val: string[]) => {
|
||||
cityIds.value = val;
|
||||
form.cityIds = val.length ? val.join(',') : undefined;
|
||||
};
|
||||
|
||||
/* 省份选中变化(由组件根据已选城市推导),同步到 form.provinceIds */
|
||||
const onProvinceIdsChange = (val: string[]) => {
|
||||
provinceIds.value = val;
|
||||
form.provinceIds = val.length ? val.join(',') : undefined;
|
||||
if (val.length) {
|
||||
form.regionIds = val.join(',');
|
||||
form.regionMode = 1;
|
||||
} else {
|
||||
form.regionIds = undefined;
|
||||
form.regionMode = 0;
|
||||
}
|
||||
};
|
||||
|
||||
/* 保存编辑 */
|
||||
@@ -215,13 +212,14 @@
|
||||
// 确保templateId和type从父级继承
|
||||
formData.templateId = props.templateId;
|
||||
formData.type = props.templateType ?? true;
|
||||
// 多选配送区域(逗号分隔,空则默认全国)
|
||||
formData.cityIds = cityIds.value.length
|
||||
? cityIds.value.join(',')
|
||||
: undefined;
|
||||
formData.provinceIds = provinceIds.value.length
|
||||
? provinceIds.value.join(',')
|
||||
: undefined;
|
||||
// 多选配送区域(regionMode=1 指定配送,0=全国;regionIds 存城市编码逗号串)
|
||||
if (cityIds.value.length) {
|
||||
formData.regionIds = cityIds.value.join(',');
|
||||
formData.regionMode = 1;
|
||||
} else {
|
||||
formData.regionIds = undefined;
|
||||
formData.regionMode = 0;
|
||||
}
|
||||
const saveOrUpdate = isUpdate.value
|
||||
? updateShopExpressTemplateDetail
|
||||
: addShopExpressTemplateDetail;
|
||||
@@ -252,26 +250,18 @@
|
||||
form.templateId = props.templateId;
|
||||
form.type = props.templateType ?? true;
|
||||
}
|
||||
// 回显多选配送区域
|
||||
if (form.cityIds) {
|
||||
cityIds.value = form.cityIds.split(',').filter(Boolean);
|
||||
// 回显多选配送区域(regionIds 存城市编码)
|
||||
if (form.regionIds) {
|
||||
cityIds.value = form.regionIds.split(',').filter(Boolean);
|
||||
} else if (form.cityId) {
|
||||
// 兼容旧单值数据
|
||||
cityIds.value = [String(form.cityId)];
|
||||
} else {
|
||||
cityIds.value = [];
|
||||
}
|
||||
if (form.provinceIds) {
|
||||
provinceIds.value = form.provinceIds.split(',').filter(Boolean);
|
||||
} else if (form.provinceId) {
|
||||
provinceIds.value = [String(form.provinceId)];
|
||||
} else {
|
||||
provinceIds.value = [];
|
||||
}
|
||||
} else {
|
||||
resetFields();
|
||||
cityIds.value = [];
|
||||
provinceIds.value = [];
|
||||
}
|
||||
},
|
||||
{ immediate: true }
|
||||
|
||||
@@ -128,8 +128,8 @@
|
||||
align: 'center',
|
||||
width: 150,
|
||||
customRender: ({ record }) => {
|
||||
// 多选配送区域(cityIds 逗号分隔)
|
||||
const cityIds = (record.cityIds || '')
|
||||
// 多选配送区域(regionIds 逗号分隔的城市编码)
|
||||
const cityIds = (record.regionIds || '')
|
||||
.split(',')
|
||||
.filter(Boolean);
|
||||
if (cityIds.length) {
|
||||
|
||||
Reference in New Issue
Block a user