Commit 00ff1ac5 by wusiyi

feat: 新增物流跟踪页面

parent e90edaec
...@@ -4,6 +4,8 @@ import { ...@@ -4,6 +4,8 @@ import {
LogisticsMethod, LogisticsMethod,
LogisticsMethodList, LogisticsMethodList,
UpdateLogisticsMethodStatus, UpdateLogisticsMethodStatus,
LogisticsTrackingParams,
LogisticsTrackingTree,
} from '@/views/logistics/types/logistics' } from '@/views/logistics/types/logistics'
import { AddDeclarationRuleObj } from '@/views/logistics/types/declarationRule' import { AddDeclarationRuleObj } from '@/views/logistics/types/declarationRule'
import { LogisticsQuotation } from '@/views/logistics/types/logisticsQuotation' import { LogisticsQuotation } from '@/views/logistics/types/logisticsQuotation'
...@@ -473,3 +475,40 @@ export function deleteSortingApi(ids: string) { ...@@ -473,3 +475,40 @@ export function deleteSortingApi(ids: string) {
}, },
) )
} }
// 物流跟踪 获取菜单树
export function logisticStatusList() {
return axios.get<never, BaseRespData<LogisticsTrackingTree[]>>(
'factory/logisticsTracking/statusList',
)
}
// 物流跟踪 分页
export function logisticsTrackingPage(params: LogisticsTrackingParams) {
return axios.post<never, BasePaginationData<ILogisticsCompany>>(
'/factory/logisticsTracking/list_page',
params,
)
}
// 物流跟踪 批量注册
export function logisticsTrackingBatchRegister(params: {
idList: number[]
selectAll: boolean
}) {
return axios.post<never, BaseRespData<never>>(
'/factory/logisticsTracking/batchRegister',
params,
)
}
// 物流跟踪 批量同步
export function logisticsTrackingBatchPushOrder(params: {
idList: number[]
selectAll: boolean
}) {
return axios.post<never, BaseRespData<never>>(
'/factory/logisticsTracking/batchPushOrder',
params,
)
}
...@@ -8,6 +8,8 @@ ...@@ -8,6 +8,8 @@
header-align="center" header-align="center"
height="100%" height="100%"
v-bind="attrs" v-bind="attrs"
:class="internalIsMore ? 'is-more-active' : ''"
@header-click="handleTableHeaderClick"
> >
<ElTableColumn <ElTableColumn
v-if="selectionable" v-if="selectionable"
...@@ -16,7 +18,8 @@ ...@@ -16,7 +18,8 @@
fixed="left" fixed="left"
header-align="center" header-align="center"
align="center" align="center"
></ElTableColumn> >
</ElTableColumn>
<ElTableColumn <ElTableColumn
v-if="serialNumberable" v-if="serialNumberable"
label="序号" label="序号"
...@@ -25,6 +28,7 @@ ...@@ -25,6 +28,7 @@
fixed="left" fixed="left"
header-align="center" header-align="center"
align="center" align="center"
:class="isMore ? 'is-more-active' : ''"
></ElTableColumn> ></ElTableColumn>
<template v-for="column in columns" :key="column.key"> <template v-for="column in columns" :key="column.key">
<ElTableColumn <ElTableColumn
...@@ -60,16 +64,26 @@ ...@@ -60,16 +64,26 @@
</div> </div>
</template> </template>
<script setup lang="tsx" generic="T"> <script setup lang="tsx" generic="T">
import { type Slot, useAttrs, useSlots, type PropType, shallowRef } from 'vue' import {
type Slot,
useAttrs,
useSlots,
type PropType,
shallowRef,
ref,
nextTick,
} from 'vue'
import type { CustomColumn } from '@/types/table' import type { CustomColumn } from '@/types/table'
import RenderColumn from './RenderColumn.vue' import RenderColumn from './RenderColumn.vue'
import { ElTable } from 'element-plus' import { ElTable } from 'element-plus'
import type { TableInstance } from 'element-plus' import type { TableInstance } from 'element-plus'
const tableRef = shallowRef<TableInstance>() const tableRef = shallowRef<TableInstance>()
const internalIsMore = ref(false)
const selectionHeaderClickCount = ref(0)
// eslint-disable-next-line @typescript-eslint/no-explicit-any // eslint-disable-next-line @typescript-eslint/no-explicit-any
defineProps({ const props = defineProps({
paginatedData: { paginatedData: {
type: Array, type: Array,
required: true, required: true,
...@@ -90,6 +104,10 @@ defineProps({ ...@@ -90,6 +104,10 @@ defineProps({
type: Boolean, type: Boolean,
default: false, default: false,
}, },
isMore: {
type: Boolean,
default: false,
},
}) })
const attrs = useAttrs() const attrs = useAttrs()
...@@ -110,12 +128,51 @@ const toggleAllSelection = () => { ...@@ -110,12 +128,51 @@ const toggleAllSelection = () => {
tableRef.value?.toggleAllSelection() tableRef.value?.toggleAllSelection()
} }
const handleTableHeaderClick = (column: { type?: string }, event: Event) => {
if (column.type === 'selection' && props.isMore) {
event.preventDefault()
event.stopPropagation()
selectionHeaderClickCount.value++
const count = selectionHeaderClickCount.value
const actions = {
1: () => selectAllRows(true),
2: () => selectAllRows(true, true),
3: () => selectAllRows(false, false),
}
if (actions[count as keyof typeof actions]) {
actions[count as keyof typeof actions]()
}
}
}
const selectAllRows = (select: boolean, setInternalIsMore?: boolean) => {
nextTick(() => {
if (tableRef.value && props.paginatedData.length > 0) {
props.paginatedData.forEach((row) => {
tableRef.value?.toggleRowSelection(row, select)
})
}
if (setInternalIsMore !== undefined) {
internalIsMore.value = setInternalIsMore
}
if (!select && setInternalIsMore === false) {
selectionHeaderClickCount.value = 0
}
})
}
defineExpose({ defineExpose({
tableRef, tableRef,
setCurrentRow, setCurrentRow,
toggleRowSelection, toggleRowSelection,
clearSelection, clearSelection,
toggleAllSelection, toggleAllSelection,
internalIsMore,
}) })
</script> </script>
...@@ -125,4 +182,29 @@ defineExpose({ ...@@ -125,4 +182,29 @@ defineExpose({
overflow: hidden; overflow: hidden;
position: relative; position: relative;
} }
::v-deep .is-more-active {
.el-table__header .el-table-column--selection .cell {
height: auto !important;
padding: 0px 0 !important;
overflow: visible !important;
.el-checkbox {
position: relative;
transform: translateY(-7px);
&::after {
content: 'All';
color: #262626;
font-size: 12px;
position: absolute;
top: 100%;
left: 50%;
transform: translateX(-50%);
line-height: 1;
white-space: nowrap;
}
}
}
}
</style> </style>
...@@ -236,6 +236,13 @@ const router = createRouter({ ...@@ -236,6 +236,13 @@ const router = createRouter({
component: () => import('@/views/logistics/sortingConfiguration.vue'), component: () => import('@/views/logistics/sortingConfiguration.vue'),
}, },
{ {
path: '/logistics/logisticsTracking',
meta: {
title: '物流跟踪',
},
component: () => import('@/views/logistics/logisticsTracking.vue'),
},
{
path: '/warehouse/manage', path: '/warehouse/manage',
meta: { meta: {
title: '仓库管理', title: '仓库管理',
......
...@@ -61,6 +61,11 @@ const menu: MenuItem[] = [ ...@@ -61,6 +61,11 @@ const menu: MenuItem[] = [
id: 7, id: 7,
label: '分拣配置', label: '分拣配置',
}, },
{
index: '/logistics/logisticsTracking',
id: 8,
label: '物流跟踪',
},
], ],
}, },
{ {
......
...@@ -49,3 +49,14 @@ interface ruleRefObj { ...@@ -49,3 +49,14 @@ interface ruleRefObj {
ruleId: string | number ruleId: string | number
ruleName: string | number ruleName: string | number
} }
export interface LogisticsTrackingTree {
name: string
status: number
num: number
}
export interface LogisticsTrackingParams {
trackNumber?: number | string
shopNumber?: string | number
trackingStatus?: number
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment