Skip to content

Commit a9bbbc7

Browse files
committed
trade:优化运费模版的实现
1 parent bb08f6f commit a9bbbc7

File tree

5 files changed

+58
-179
lines changed

5 files changed

+58
-179
lines changed

src/api/system/area/index.ts

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,6 @@ export const getAreaTree = async () => {
55
return await request.get({ url: '/system/area/tree' })
66
}
77

8-
export const getChildrenArea = async (id: number) => {
9-
return await request.get({ url: '/system/area/get-children?id=' + id })
10-
}
11-
12-
export const getAreaListByIds = async (ids) => {
13-
return await request.get({ url: '/system/area/get-by-ids?ids=' + ids })
14-
}
15-
168
// 获得 IP 对应的地区名
179
export const getAreaByIp = async (ip: string) => {
1810
return await request.get({ url: '/system/area/get-by-ip?ip=' + ip })

src/views/mall/trade/delivery/express/ExpressForm.vue

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,17 @@
77
label-width="120px"
88
v-loading="formLoading"
99
>
10-
<el-form-item label="快递公司编码" prop="code">
10+
<el-form-item label="公司编码" prop="code">
1111
<el-input v-model="formData.code" placeholder="请输入快递编码" />
1212
</el-form-item>
13-
<el-form-item label="快递公司名称" prop="name">
13+
<el-form-item label="公司名称" prop="name">
1414
<el-input v-model="formData.name" placeholder="请输入快递名称" />
1515
</el-form-item>
16-
<el-form-item label="快递公司 logo" prop="logo">
16+
<el-form-item label="公司 logo" prop="logo">
1717
<UploadImg v-model="formData.logo" :limit="1" :is-show-tip="false" />
1818
<div style="font-size: 10px" class="pl-10px">推荐 180x180 图片分辨率</div>
1919
</el-form-item>
20-
<el-form-item label="分类排序" prop="sort">
20+
<el-form-item label="排序" prop="sort">
2121
<el-input-number v-model="formData.sort" controls-position="right" :min="0" />
2222
</el-form-item>
2323
<el-form-item label="开启状态" prop="status">

src/views/mall/trade/delivery/express/index.vue

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,11 @@
5353
<!-- 列表 -->
5454
<ContentWrap>
5555
<el-table v-loading="loading" :data="list">
56-
<el-table-column label="快递公司编号" prop="code" />
57-
<el-table-column label="快递公司名称" prop="name" />
58-
<el-table-column label="快递公司 logo " prop="logo">
56+
<el-table-column label="公司编码" prop="code" />
57+
<el-table-column label="公司名称" prop="name" />
58+
<el-table-column label="公司 logo " prop="logo">
5959
<template #default="scope">
60-
<img v-if="scope.row.logo" :src="scope.row.logo" alt="快递公司logo" class="h-100px" />
60+
<img v-if="scope.row.logo" :src="scope.row.logo" alt="公司logo" class="h-40px" />
6161
</template>
6262
</el-table-column>
6363
<el-table-column label="排序" align="center" prop="sort" />

src/views/mall/trade/delivery/expressTemplate/ExpressTemplateForm.vue

Lines changed: 46 additions & 159 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<template>
2-
<Dialog :title="dialogTitle" v-model="dialogVisible" width="80%">
2+
<Dialog :title="dialogTitle" v-model="dialogVisible" width="1300px">
33
<el-form
44
ref="formRef"
55
:model="formData"
@@ -21,23 +21,19 @@
2121
</el-radio>
2222
</el-radio-group>
2323
</el-form-item>
24-
<el-form-item label="运费" prop="templateCharge">
25-
<el-table border style="width: 100%" :data="formData.templateCharge">
26-
<el-table-column align="center" label="区域" width="180">
24+
<el-form-item label="运费" prop="charges">
25+
<el-table border style="width: 100%" :data="formData.charges">
26+
<el-table-column align="center" label="区域" width="360">
2727
<template #default="{ row }">
28-
<!-- 区域数据太多,用赖加载方式,要不然性能有问题 -->
29-
<el-tree-select
28+
<el-cascader
3029
v-model="row.areaIds"
31-
:load="loadChargeArea"
32-
:props="defaultProps"
33-
node-key="id"
34-
multiple
35-
check-strictly
36-
show-checkbox
37-
lazy
38-
check-on-click-node
39-
:render-after-expand="false"
40-
:cache-data="areaCache"
30+
:options="areaTree"
31+
:props="defaultProps2"
32+
class="w-1/1"
33+
clearable
34+
placeholder="请选择商品分类"
35+
filterable
36+
collapse-tags
4137
/>
4238
</template>
4339
</el-table-column>
@@ -85,23 +81,19 @@
8581
<Icon icon="ep:plus" class="mr-5px" /> 添加区域
8682
</el-button>
8783
</el-form-item>
88-
<el-form-item label="包邮区域" prop="templateFree">
89-
<el-table border style="width: 100%" :data="formData.templateFree">
90-
<el-table-column align="center" label="区域">
84+
<el-form-item label="包邮区域" prop="frees">
85+
<el-table border style="width: 100%" :data="formData.frees">
86+
<el-table-column align="center" label="区域" width="360">
9187
<template #default="{ row }">
92-
<!-- 区域数据太多,用赖加载方式,要不然性能有问题 -->
93-
<el-tree-select
88+
<el-cascader
9489
v-model="row.areaIds"
95-
multiple
96-
lazy
97-
:load="loadFreeArea"
98-
:props="defaultProps"
99-
node-key="id"
100-
check-strictly
101-
show-checkbox
102-
check-on-click-node
103-
:render-after-expand="true"
104-
:cache-data="areaCache"
90+
:options="areaTree"
91+
:props="defaultProps2"
92+
class="w-1/1"
93+
clearable
94+
placeholder="请选择商品分类"
95+
filterable
96+
collapse-tags
10597
/>
10698
</template>
10799
</el-table-column>
@@ -140,13 +132,18 @@
140132
<script lang="ts" setup>
141133
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
142134
import * as DeliveryExpressTemplateApi from '@/api/mall/trade/delivery/expressTemplate'
135+
import * as AreaApi from '@/api/system/area'
143136
import { defaultProps } from '@/utils/tree'
144137
import { yuanToFen, fenToYuan } from '@/utils'
145-
import { getChildrenArea, getAreaListByIds } from '@/api/system/area'
146138
import { cloneDeep } from 'lodash-es'
147139
const { t } = useI18n() // 国际化
148140
const message = useMessage() // 消息弹窗
149141
142+
const defaultProps2 = {
143+
...defaultProps,
144+
multiple: true
145+
}
146+
150147
const dialogVisible = ref(false) // 弹窗的是否展示
151148
const dialogTitle = ref('') // 弹窗的标题
152149
const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
@@ -156,8 +153,8 @@ const formData = ref({
156153
name: '',
157154
chargeMode: 1,
158155
sort: 0,
159-
templateCharge: [],
160-
templateFree: []
156+
charges: [],
157+
frees: []
161158
})
162159
const columnTitleMap = new Map()
163160
const columnTitle = ref({
@@ -171,9 +168,6 @@ const formRules = reactive({
171168
sort: [{ required: true, message: '分类排序不能为空', trigger: 'blur' }]
172169
})
173170
const formRef = ref() // 表单 Ref
174-
const areaCache = ref([]) // 由于区域节点懒加载,已选区域节点需要缓存展示
175-
// TODO @jason:配送的时候,只允许选择省市级别,不允许选择区;如果这样的话,是不是打开弹窗,直接把城市都请求过来;
176-
// TODO @jaosn:因为只有省市两级,感觉就不用特殊做全国逻辑;选择全国,就默认把子节点都选择上;另外,选择父节点,要把子节点选中哈;
177171
178172
/** 打开弹窗 */
179173
const open = async (type: string, id?: number) => {
@@ -187,30 +181,14 @@ const open = async (type: string, id?: number) => {
187181
formLoading.value = true
188182
formData.value = await DeliveryExpressTemplateApi.getDeliveryExpressTemplate(id)
189183
columnTitle.value = columnTitleMap.get(formData.value.chargeMode)
190-
const chargeAreaIds = []
191-
const freeAreaIds = []
192-
formData.value.templateCharge.forEach((item) => {
193-
for (let i = 0; i < item.areaIds.length; i++) {
194-
if (!chargeAreaIds.includes(item.areaIds[i])) {
195-
chargeAreaIds.push(item.areaIds[i])
196-
}
197-
}
198-
//前端价格以元展示
184+
formData.value.charges.forEach((item) => {
185+
// 前端价格以元展示
199186
item.startPrice = fenToYuan(item.startPrice)
200187
item.extraPrice = fenToYuan(item.extraPrice)
201188
})
202-
formData.value.templateFree.forEach((item) => {
203-
for (let i = 0; i < item.areaIds.length; i++) {
204-
if (!chargeAreaIds.includes(item.areaIds[i]) && !freeAreaIds.includes(item.areaIds[i])) {
205-
freeAreaIds.push(item.areaIds[i])
206-
}
207-
}
189+
formData.value.frees.forEach((item) => {
208190
item.freePrice = fenToYuan(item.freePrice)
209191
})
210-
// 已选的区域节点
211-
const areaIds = chargeAreaIds.concat(freeAreaIds)
212-
// 区域节点,懒加载方式。已选节点需要缓存展示
213-
areaCache.value = await getAreaListByIds(areaIds.join(','))
214192
}
215193
} finally {
216194
formLoading.value = false
@@ -228,14 +206,13 @@ const submitForm = async () => {
228206
// 提交请求
229207
formLoading.value = true
230208
try {
231-
const data = formData.value as DeliveryExpressTemplateApi.DeliveryExpressTemplateVO
209+
const data = cloneDeep(formData.value) as DeliveryExpressTemplateApi.DeliveryExpressTemplateVO
232210
// 前端价格以元展示,提交到后端。用分计算
233-
// TODO @jason:不能直接这样改,要复制出来改。不然后端操作失败,数据已经被改了
234-
data.templateCharge.forEach((item) => {
211+
data.charges.forEach((item) => {
235212
item.startPrice = yuanToFen(item.startPrice)
236213
item.extraPrice = yuanToFen(item.extraPrice)
237214
})
238-
data.templateFree.forEach((item) => {
215+
data.frees.forEach((item) => {
239216
item.freePrice = yuanToFen(item.freePrice)
240217
})
241218
if (formType.value === 'create') {
@@ -259,7 +236,7 @@ const resetForm = () => {
259236
id: undefined,
260237
name: '',
261238
chargeMode: 1,
262-
templateCharge: [
239+
charges: [
263240
{
264241
areaIds: [1],
265242
startCount: 2,
@@ -268,7 +245,7 @@ const resetForm = () => {
268245
extraPrice: 10
269246
}
270247
],
271-
templateFree: [],
248+
frees: [],
272249
sort: 0
273250
}
274251
columnTitle.value = columnTitleMap.get(1)
@@ -279,37 +256,10 @@ const resetForm = () => {
279256
const changeChargeMode = (chargeMode: number) => {
280257
columnTitle.value = columnTitleMap.get(chargeMode)
281258
}
282-
const defaultArea = [{ id: 1, name: '全国', disabled: false }]
283259
284260
/** 初始化数据 */
285-
// TODO @jason:是不是不用写这样一个初始化方法,columnTitleMap 直接就可以了呀
286-
// const columnTitleMap = {
287-
// '1': {
288-
// startCountTitle: '首件',
289-
// extraCountTitle: '续件',
290-
// freeCountTitle: '包邮件数'
291-
// },
292-
// '2': {
293-
// startCountTitle: '首件重量(kg)',
294-
// extraCountTitle: '续件重量(kg)',
295-
// freeCountTitle: '包邮重量(kg)'
296-
// },
297-
// '3': {
298-
// startCountTitle: '首件体积(m³)',
299-
// extraCountTitle: '续件体积(m³)',
300-
// freeCountTitle: '包邮体积(m³)'
301-
// }
302-
// }
261+
const areaTree = ref([])
303262
const initData = async () => {
304-
// TODO 从服务端全量加载数据, 后面看懒加载是不是可以从前端获取数据。 目前从后端获取数据
305-
// formLoading.value = true
306-
// try {
307-
// const data = await getAreaTree()
308-
// areaTree = data
309-
// console.log('areaTree', areaTree)
310-
// } finally {
311-
// formLoading.value = false
312-
// }
313263
// 表头标题和计费方式的映射
314264
columnTitleMap.set(1, {
315265
startCountTitle: '首件',
@@ -326,77 +276,14 @@ const initData = async () => {
326276
extraCountTitle: '续件体积(m³)',
327277
freeCountTitle: '包邮体积(m³)'
328278
})
279+
// 加载区域数据
280+
areaTree.value = await AreaApi.getAreaTree()
329281
}
330282
331-
/** 懒加载运费区域树 */
332-
const loadChargeArea = async (node, resolve) => {
333-
//已选区域需要禁止再次选择
334-
const areaIds = []
335-
formData.value.templateCharge.forEach((item) => {
336-
if (item.areaIds.length > 0) {
337-
item.areaIds.forEach((areaId) => areaIds.push(areaId))
338-
}
339-
})
340-
if (node.isLeaf) return resolve([])
341-
const length = node.data.length
342-
if (length === 0) {
343-
const data = cloneDeep(defaultArea)
344-
const item = data[0]
345-
if (areaIds.includes(item.id)) {
346-
// TODO 禁止选中的区域有些问题, 导致修改时候不能重新选择 不知道如何处理。 暂时注释掉 @芋艿 有空瞅瞅
347-
// TODO @jason:先不做这个功能哈。
348-
//item.disabled = true
349-
}
350-
resolve(data)
351-
} else {
352-
const id = node.data.id
353-
const data = await getChildrenArea(id)
354-
data.forEach((item) => {
355-
if (areaIds.includes(item.id)) {
356-
//item.disabled = true
357-
}
358-
})
359-
resolve(data)
360-
}
361-
}
362-
363-
/** 懒加载包邮区域树 */
364-
const loadFreeArea = async (node, resolve) => {
365-
if (node.isLeaf) return resolve([])
366-
//已选区域需要禁止再次选择
367-
const areaIds = []
368-
formData.value.templateFree.forEach((item) => {
369-
if (item.areaIds.length > 0) {
370-
item.areaIds.forEach((areaId) => areaIds.push(areaId))
371-
}
372-
})
373-
const length = node.data.length
374-
if (length === 0) {
375-
// 为空,从全国开始选择。全国 id == 1
376-
const data = cloneDeep(defaultArea)
377-
const item = data[0]
378-
if (areaIds.includes(item.id)) {
379-
//item.disabled = true
380-
}
381-
resolve(data)
382-
} else {
383-
const id = node.data.id
384-
const data = await getChildrenArea(id)
385-
// 已选区域需要禁止再次选择
386-
data.forEach((item) => {
387-
if (areaIds.includes(item.id)) {
388-
// TODO 禁止选中的区域有些问题, 导致修改时候不能重新选择 不知道如何处理。 暂时注释掉 @芋艿 有空瞅瞅
389-
// TODO @jason:先不做这个功能哈。
390-
//item.disabled = true
391-
}
392-
})
393-
resolve(data)
394-
}
395-
}
396283
/** 添加计费区域 */
397284
const addChargeArea = () => {
398285
const data = formData.value
399-
data.templateCharge.push({
286+
data.charges.push({
400287
areaIds: [],
401288
startCount: 1,
402289
startPrice: 1,
@@ -408,13 +295,13 @@ const addChargeArea = () => {
408295
/** 删除计费区域 */
409296
const deleteChargeArea = (index) => {
410297
const data = formData.value
411-
data.templateCharge.splice(index, 1)
298+
data.charges.splice(index, 1)
412299
}
413300
414301
/** 添加包邮区域 */
415302
const addFreeArea = () => {
416303
const data = formData.value
417-
data.templateFree.push({
304+
data.frees.push({
418305
areaIds: [],
419306
freeCount: 1,
420307
freePrice: 1
@@ -424,7 +311,7 @@ const addFreeArea = () => {
424311
/** 删除包邮区域 */
425312
const deleteFreeArea = (index) => {
426313
const data = formData.value
427-
data.templateFree.splice(index, 1)
314+
data.frees.splice(index, 1)
428315
}
429316
430317
/** 初始化 **/

0 commit comments

Comments
 (0)