Commit 18ffa839 by wuqian

Merge branch 'dev' of 47.122.114.111:qinjianhui/factory_front into dev

parents f6b939d0 2b69d2ea
...@@ -20,6 +20,8 @@ declare module 'vue' { ...@@ -20,6 +20,8 @@ declare module 'vue' {
ElCol: typeof import('element-plus/es')['ElCol'] ElCol: typeof import('element-plus/es')['ElCol']
ElConfigProvider: typeof import('element-plus/es')['ElConfigProvider'] ElConfigProvider: typeof import('element-plus/es')['ElConfigProvider']
ElDatePicker: typeof import('element-plus/es')['ElDatePicker'] ElDatePicker: typeof import('element-plus/es')['ElDatePicker']
ElDescriptions: typeof import('element-plus/es')['ElDescriptions']
ElDescriptionsItem: typeof import('element-plus/es')['ElDescriptionsItem']
ElDialog: typeof import('element-plus/es')['ElDialog'] ElDialog: typeof import('element-plus/es')['ElDialog']
ElDrawer: typeof import('element-plus/es')['ElDrawer'] ElDrawer: typeof import('element-plus/es')['ElDrawer']
ElDropdown: typeof import('element-plus/es')['ElDropdown'] ElDropdown: typeof import('element-plus/es')['ElDropdown']
......
...@@ -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,
)
}
...@@ -11,7 +11,7 @@ import { ...@@ -11,7 +11,7 @@ import {
Tab, Tab,
InspectionData, InspectionData,
PaymentForm, PaymentForm,
RejectParams RejectParams,
} from '@/types/api/order' } from '@/types/api/order'
import { import {
apiSubmitPodOrderForm, apiSubmitPodOrderForm,
...@@ -22,7 +22,7 @@ import { ...@@ -22,7 +22,7 @@ import {
ProductionOrder, ProductionOrder,
ShipmentOrderDetailData, ShipmentOrderDetailData,
updatePriceForm, updatePriceForm,
IUpdatePrice, IUpdatePrice, PodUsDetailData,
} from '@/types/api/deliveryNote' } from '@/types/api/deliveryNote'
import { import {
AccountStatementNote, AccountStatementNote,
...@@ -30,7 +30,7 @@ import { ...@@ -30,7 +30,7 @@ import {
BillOrderDetailData, BillOrderDetailData,
ConfirmOrderForm, ConfirmOrderForm,
CountStatus, CountStatus,
LogList, LogList, OrderDetails, ProductDetails,
} from '@/types/api/billOrder' } from '@/types/api/billOrder'
export function getOrderList( export function getOrderList(
...@@ -84,6 +84,7 @@ export function reCreateScriptUrlApi(id: number) { ...@@ -84,6 +84,7 @@ export function reCreateScriptUrlApi(id: number) {
}, },
) )
} }
export function apiGetCraftGroup(id?: number | string) { export function apiGetCraftGroup(id?: number | string) {
return axios.get<never, BaseRespData<never>>( return axios.get<never, BaseRespData<never>>(
'pod/podReconciliation/getCraftGroup', 'pod/podReconciliation/getCraftGroup',
...@@ -94,6 +95,7 @@ export function apiGetCraftGroup(id?: number | string) { ...@@ -94,6 +95,7 @@ export function apiGetCraftGroup(id?: number | string) {
}, },
) )
} }
// 打印生产单 // 打印生产单
export function printOrder(ids: number[]) { export function printOrder(ids: number[]) {
return axios.post<never, BaseRespData<never>>( return axios.post<never, BaseRespData<never>>(
...@@ -144,12 +146,13 @@ export function qaFinishedApi(data: InspectionData[]) { ...@@ -144,12 +146,13 @@ export function qaFinishedApi(data: InspectionData[]) {
data, data,
) )
} }
export function apiSetCraftData({ export function apiSetCraftData({
id, id,
craftTotalPrice, craftTotalPrice,
recNumber, recNumber,
craftPriceList, craftPriceList,
}: { }: {
id: number | undefined id: number | undefined
craftTotalPrice: number | undefined craftTotalPrice: number | undefined
recNumber: string | undefined recNumber: string | undefined
...@@ -165,6 +168,7 @@ export function apiSetCraftData({ ...@@ -165,6 +168,7 @@ export function apiSetCraftData({
}, },
) )
} }
// 发货保存 // 发货保存
export function saveOrder( export function saveOrder(
sumbitSendOutList: ShipmentOrderRes[], sumbitSendOutList: ShipmentOrderRes[],
...@@ -195,6 +199,7 @@ export function loadSendOutList(id: number) { ...@@ -195,6 +199,7 @@ export function loadSendOutList(id: number) {
}, },
) )
} }
// 设置备注 // 设置备注
export function backEndCommentsApi(id: number, remark: string) { export function backEndCommentsApi(id: number, remark: string) {
return axios.get<never, BaseRespData<SendOrderData[]>>( return axios.get<never, BaseRespData<SendOrderData[]>>(
...@@ -207,6 +212,7 @@ export function backEndCommentsApi(id: number, remark: string) { ...@@ -207,6 +212,7 @@ export function backEndCommentsApi(id: number, remark: string) {
}, },
) )
} }
//重新生成 //重新生成
export function regenerateSingle(subNumber: string | number) { export function regenerateSingle(subNumber: string | number) {
return axios.get<never, BaseRespData<SendOrderData[]>>( return axios.get<never, BaseRespData<SendOrderData[]>>(
...@@ -218,6 +224,7 @@ export function regenerateSingle(subNumber: string | number) { ...@@ -218,6 +224,7 @@ export function regenerateSingle(subNumber: string | number) {
}, },
) )
} }
// 操作日志 // 操作日志
export function getLogList(id: number) { export function getLogList(id: number) {
return axios.get<never, BaseRespData<LogListData[]>>( return axios.get<never, BaseRespData<LogListData[]>>(
...@@ -256,6 +263,7 @@ export function refreshProductInfo(data: number[]) { ...@@ -256,6 +263,7 @@ export function refreshProductInfo(data: number[]) {
data, data,
) )
} }
export function getDeliveryNoteList( export function getDeliveryNoteList(
data: DeliveryNoteSearchForm, data: DeliveryNoteSearchForm,
currentPage: number, currentPage: number,
...@@ -301,6 +309,21 @@ export function podReconciliationList( ...@@ -301,6 +309,21 @@ export function podReconciliationList(
) )
} }
export function podUsReconciliationList(
data: AccountStatementNoteSearchForm,
currentPage: number,
pageSize: number,
) {
return axios.post<never, BasePaginationData<AccountStatementNote>>(
'pod_us/reconciliation/list',
{
...data,
currentPage,
pageSize,
},
)
}
export function printDeliveryNote(data: string[], userMark?: string) { export function printDeliveryNote(data: string[], userMark?: string) {
return axios.post<never, BaseRespData<never>>( return axios.post<never, BaseRespData<never>>(
'factory/customJomallShipment/printInvoiceStatistics', 'factory/customJomallShipment/printInvoiceStatistics',
...@@ -363,6 +386,17 @@ export function podReconciliation(id?: number) { ...@@ -363,6 +386,17 @@ export function podReconciliation(id?: number) {
) )
} }
export function podUsReconciliation(id?: number) {
return axios.get<never, BaseRespData<CountStatus[]>>(
'pod_us/reconciliation/groupCount',
{
params: {
id,
},
},
)
}
export function getCustomJomallReconciliationById(id?: number) { export function getCustomJomallReconciliationById(id?: number) {
return axios.get<never, BaseRespData<OrderData>>( return axios.get<never, BaseRespData<OrderData>>(
'factory/customJomallReconciliation/getById', 'factory/customJomallReconciliation/getById',
...@@ -391,6 +425,7 @@ export function updateReconciliation(data: AccountStatementNote) { ...@@ -391,6 +425,7 @@ export function updateReconciliation(data: AccountStatementNote) {
data, data,
) )
} }
export function exportExcelApi(ids: string) { export function exportExcelApi(ids: string) {
return axios.get<never, BaseRespData<never>>('reconciliation/exportExcel', { return axios.get<never, BaseRespData<never>>('reconciliation/exportExcel', {
params: { params: {
...@@ -398,6 +433,7 @@ export function exportExcelApi(ids: string) { ...@@ -398,6 +433,7 @@ export function exportExcelApi(ids: string) {
}, },
}) })
} }
export function exportPodExcelApi(ids: string) { export function exportPodExcelApi(ids: string) {
return axios.get<never, BaseRespData<never>>( return axios.get<never, BaseRespData<never>>(
'pod/podReconciliation/exportExcel', 'pod/podReconciliation/exportExcel',
...@@ -408,12 +444,25 @@ export function exportPodExcelApi(ids: string) { ...@@ -408,12 +444,25 @@ export function exportPodExcelApi(ids: string) {
}, },
) )
} }
export function exportPodUsExcelApi(ids: string) {
return axios.get<never, BaseRespData<never>>(
'pod_us/reconciliation/exportExcel',
{
params: {
ids,
},
},
)
}
export function getShipmentDetailsById(data: DetailForm) { export function getShipmentDetailsById(data: DetailForm) {
return axios.post<never, BasePaginationData<BillOrderDetailData>>( return axios.post<never, BasePaginationData<BillOrderDetailData>>(
'reconciliation/getItemList', 'reconciliation/getItemList',
data, data,
) )
} }
export function apiupdateByPodExcel(formData: never) { export function apiupdateByPodExcel(formData: never) {
return axios.post('pod/podReconciliation/updateByExcel', formData, { return axios.post('pod/podReconciliation/updateByExcel', formData, {
headers: { headers: {
...@@ -421,18 +470,49 @@ export function apiupdateByPodExcel(formData: never) { ...@@ -421,18 +470,49 @@ export function apiupdateByPodExcel(formData: never) {
}, },
}) })
} }
export function apiRejectedPodReconciliation(params?: RejectParams) { export function apiRejectedPodReconciliation(params?: RejectParams) {
return axios.post<never, BaseRespData<never>>( return axios.post<never, BaseRespData<never>>(
'pod/podReconciliation/rejectedLocal', 'pod/podReconciliation/rejectedLocal',
params, params,
) )
} }
export function getPodShipmentDetailsById(data: DetailForm) { export function getPodShipmentDetailsById(data: DetailForm) {
return axios.post<never, BasePaginationData<BillOrderDetailData>>( return axios.post<never, BasePaginationData<BillOrderDetailData>>(
'pod/podReconciliation/getItemList', 'pod/podReconciliation/getItemList',
data, data,
) )
} }
export function getPodShipmentGetById(data: DetailForm) {
return axios.post<never, BasePaginationData<ProductDetails>>(
'pod_us/reconciliation/getDetailById',
data,
)
}
export function getPodUsShipmentDetailsById(data: DetailForm) {
return axios.post<never, BasePaginationData<OrderDetails>>(
'pod_us/reconciliation/getItemList',
data,
)
}
export function getPodUsDetailData(id?: number | string) {
return axios.get<never, BaseRespData<PodUsDetailData>>(
'pod_us/reconciliation/getWithProductById',
{ params: { id } },
)
}
export function delPodUsOrderData(ids?: number | string[]) {
return axios.post<never, BaseRespData<never>>(
'pod_us/reconciliation/delItem',
{ids},
)
}
export function apiLogList(id?: number) { export function apiLogList(id?: number) {
return axios.get<never, BaseRespData<LogListsData[]>>( return axios.get<never, BaseRespData<LogListsData[]>>(
'pod/podReconciliation/getLog', 'pod/podReconciliation/getLog',
...@@ -475,6 +555,36 @@ export function updateRecPrice(data: updatePriceForm) { ...@@ -475,6 +555,36 @@ export function updateRecPrice(data: updatePriceForm) {
) )
} }
export function updatePodUsCarriageAmount(data: { ids: number[], carriage_amount: number }) {
return axios.post<never, BaseRespData<never>>(
'pod_us/reconciliation/updateCarriage',
data,
)
}
interface BatchUpdatePrice {
info_id?: number |string | undefined,
itemList: {
id: number |string,
craft_price: number |string,
template_price: number |string
}[]
}
export function batchUpdatePrice(data: BatchUpdatePrice) {
return axios.post<never, BaseRespData<never>>(
'pod_us/reconciliation/batchEdit',
data,
)
}
export function getReconciliationById(data: updatePriceForm) {
return axios.get<never, BaseRespData<never>>(
'pod_us/reconciliation/getDetailByItemIds',
{ params: data },
)
}
export function getLogListApi(id?: number) { export function getLogListApi(id?: number) {
return axios.get<never, BaseRespData<LogList[]>>('reconciliation/getLog', { return axios.get<never, BaseRespData<LogList[]>>('reconciliation/getLog', {
params: { id }, params: { id },
...@@ -489,6 +599,16 @@ export function getPodLogListApi(id?: number) { ...@@ -489,6 +599,16 @@ export function getPodLogListApi(id?: number) {
}, },
) )
} }
export function getPodUsLogListApi(id?: number) {
return axios.get<never, BaseRespData<LogList[]>>(
'pod_us/reconciliation/getLog',
{
params: { id },
},
)
}
export function auditOrderApi(url: string, data: string) { export function auditOrderApi(url: string, data: string) {
return axios.get(url, { return axios.get(url, {
params: { params: {
...@@ -496,6 +616,7 @@ export function auditOrderApi(url: string, data: string) { ...@@ -496,6 +616,7 @@ export function auditOrderApi(url: string, data: string) {
}, },
}) })
} }
export function getShipmentOrderDetailById(id?: number | string) { export function getShipmentOrderDetailById(id?: number | string) {
return axios.get<never, BaseRespData<ShipmentOrderDetailData>>( return axios.get<never, BaseRespData<ShipmentOrderDetailData>>(
'reconciliation/getShipmentByShipmentId', 'reconciliation/getShipmentByShipmentId',
...@@ -517,11 +638,19 @@ export function confirmPodOrderApi(data: ConfirmOrderForm) { ...@@ -517,11 +638,19 @@ export function confirmPodOrderApi(data: ConfirmOrderForm) {
data, data,
) )
} }
export function confirmPodUsOrderApi(data: ConfirmOrderForm) {
return axios.post<never, BaseRespData<never>>(
'pod_us/reconciliation/confirm',
data,
)
}
export function apiRejectionOfReview({ export function apiRejectionOfReview({
ids, ids,
description, description,
recNumbers, recNumbers,
}: { }: {
ids: string ids: string
recNumbers: string recNumbers: string
description: string description: string
...@@ -535,17 +664,19 @@ export function apiRejectionOfReview({ ...@@ -535,17 +664,19 @@ export function apiRejectionOfReview({
}, },
) )
} }
export function apiBillPodPayment(data: PaymentForm) { export function apiBillPodPayment(data: PaymentForm) {
return axios.post<never, BaseRespData<never>>( return axios.post<never, BaseRespData<never>>(
'pod/podReconciliation/payment', 'pod/podReconciliation/payment',
data, data,
) )
} }
export function rejectOrderApi({ export function rejectOrderApi({
ids, ids,
description, description,
pass, pass,
}: { }: {
ids: string ids: string
pass: number pass: number
description: string description: string
......
...@@ -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>
...@@ -18,6 +18,7 @@ import DeliveryNotePage from '@/views/DeliveryNotePage.vue' ...@@ -18,6 +18,7 @@ import DeliveryNotePage from '@/views/DeliveryNotePage.vue'
import AccountStatementNote from '@/views/AccountStatementNote.vue' import AccountStatementNote from '@/views/AccountStatementNote.vue'
// import Product from '@/views/product/index.vue' // import Product from '@/views/product/index.vue'
import PodBillOrder from '@/views/podBillOrder/index.vue' import PodBillOrder from '@/views/podBillOrder/index.vue'
import PodUsBillOrder from '@/views/podUsBillOrder/index.vue'
import TypeseetingManagement from '@/views/typesetting/TypesettingManagement.vue' import TypeseetingManagement from '@/views/typesetting/TypesettingManagement.vue'
import PodOrderList from '@/views/order/pod/index.vue' import PodOrderList from '@/views/order/pod/index.vue'
import PodDeliveryNoteList from '@/views/order/pod/deliveryOrderList.vue' import PodDeliveryNoteList from '@/views/order/pod/deliveryOrderList.vue'
...@@ -161,9 +162,15 @@ const router = createRouter({ ...@@ -161,9 +162,15 @@ const router = createRouter({
{ {
path: '/account/pod-bill-order', path: '/account/pod-bill-order',
meta: { meta: {
title: 'POD对账单', title: 'POD(CN)对账单',
}, },
component: PodBillOrder, component: PodBillOrder,
},{
path: '/account/pod-us-bill-order',
meta: {
title: 'POD(US)对账单',
},
component: PodUsBillOrder,
}, },
{ {
path: '/typesetting-management/list', path: '/typesetting-management/list',
...@@ -229,6 +236,13 @@ const router = createRouter({ ...@@ -229,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: '物流跟踪',
},
], ],
}, },
{ {
...@@ -144,7 +149,12 @@ const menu: MenuItem[] = [ ...@@ -144,7 +149,12 @@ const menu: MenuItem[] = [
{ {
index: '/account/pod-bill-order', index: '/account/pod-bill-order',
id: 2, id: 2,
label: 'POD对账单', label: 'POD(CN)对账单',
},
{
index: '/account/pod-us-bill-order',
id: 3,
label: 'POD(US)对账单',
}, },
], ],
}, },
......
...@@ -95,6 +95,145 @@ export interface ItemList { ...@@ -95,6 +95,145 @@ export interface ItemList {
id: number id: number
factory_order_number?: string factory_order_number?: string
} }
export interface OrderDetails {
pass_num: number;
num: number;
not_pass_num: number;
erp_order_number: string | null;
product_total_amount: number;
carriage_total_amount: number;
craft_total_price: number;
info_id: number;
template_total_price: number;
id: number;
order_id: string;
factory_order_number: string;
order: {
receiver_post_code: string;
payment_time: string | null;
actual_amount: number;
adjusted_amount: number;
factory_no: number;
factory_online_id: string | null;
total_product_amount: number | null;
process_number: string;
track_status: number;
id: string;
receiver_country: string;
factory_order_number: string;
prepaid_amount: number;
receiver_province: string;
create_time: string;
weight: number;
product_num: number;
version: number;
finish_time: string;
start_stocking_time: string;
payment_type: string | null;
warehouse_name: string;
total_amount: number;
logistics_way_code: string;
third_order_number: string;
shop_number: string;
express_sheet: string;
status: string;
production_client: string;
statusStr: string;
receiver_city: string;
remark: string | null;
exception_reason: string | null;
platform: string;
update_time: string;
receiver_address2: string;
receiver_address1: string;
receiver_name: string;
tracking_number: string;
product_amount: number;
carriage_amount: number | null;
pay_freight: number;
logistics_way_name: string;
factory_code: string;
receiver_district: string | null;
temu_logistics_way_id: string | null;
logistics_way_id: number;
user_mark: string;
namespace: string;
receiver_phone: string;
exception_handling: number;
shipment_type: number;
warehouse_id: number;
};
}
export interface ProductDetails {
diy_id: string;
diy_bianma: string;
base_sku: string;
sub_order_number: string;
price_update_remark: string | null;
price_status: boolean;
template_item_sku: string | null;
product_id: string;
id: number;
shipment_num: number;
product_item_id: string | null;
template_price: number;
product: {
diy_id: string;
end_product_id: string;
category_name: string;
craft_name: string;
base_sku: string;
num: number;
is_production: boolean;
pick_finish: number;
remark: string | null;
product_price: number;
third_stock_sku: string | null;
customized_quantity: number;
template_price: number;
tag_ids: string | null;
create_time: string;
third_sub_order_number: string;
factory_sub_order_number: string;
variant_image: string;
craft_code: string;
pass_num: number;
factory_code: string;
pay_amount: number;
weight: number;
is_replenishment: number;
image_ary: Array<{ title: string; url: string }>;
design_images: Array<{
imageUrl: string;
fileUrl: string;
id: string;
title: string;
materialId: string;
materialImage: string;
}>;
not_pass_num: number;
version: number;
supplier_product_no: string | null;
pod_jomall_order_us_id: string;
craft_price: number;
customs_value: number;
variant_sku: string;
batch_arrange_number: string;
trim_design_images: string | null;
};
product_item_sku: string | null;
item_id: number;
variant_image: string;
pass_num: number;
not_pass_num: number | null;
craft_price: number;
price_update_time: string | null;
variant_sku: string;
info_id: number;
shop_number: string;
template_item_id: string | null;
order_id: string;
}
export interface ConfirmOrderForm { export interface ConfirmOrderForm {
pass?: number | null pass?: number | null
......
...@@ -187,6 +187,58 @@ export interface DbFactory { ...@@ -187,6 +187,58 @@ export interface DbFactory {
authorize_number?: number authorize_number?: number
status?: number status?: number
} }
export interface IDetailData {
statusStr?: string;
id: string;
erp_id?: string;
namespace?: string;
dbFactory?: DbFactory | null;
factory?: DbFactory | null;
productList?: Product[];
order_number?: string;
factory_order_number?: string;
erp_order_number?: string;
third_order_number?: string;
shop_number?: string;
product_num?: string | number;
start_stocking_time?: string;
finish_time?: string;
delivery_type?: string;
logistics_way_name?: string;
lanshou_name?: string;
receiver_name?: string;
lanshou_phone?: string;
receiver_phone?: string;
lanshou_region?: string;
receiver_province?: string;
lanshou_address?: string;
receiver_city?: string;
receiver_district?: string;
receiver_address1?: string;
lanshou_post?: string;
receiver_post_code?: string;
user_mark?: string;
price?: number
customized_quantityStr?: string
product_price?:string
customized_quantity:number
image_ary?:string | null
[propName: string]: string | number | boolean | undefined | unknown;
}
export interface PodUsDetailData {
id: number
erp_id?: string;
price?: number;
customized_quantityStr?: string;
product_price?: number;
// 其他已有属性...
customized_quantity: number; // 添加缺失属性
image_ary?: string | null; // 添加缺失属性
productList:IDetailData[]
[propName: string]: string | number | boolean | undefined | unknown;
}
export interface LogListsData { export interface LogListsData {
id: number id: number
diy_id: number diy_id: number
...@@ -203,10 +255,13 @@ export interface LogListData { ...@@ -203,10 +255,13 @@ export interface LogListData {
employeeAccount?: string employeeAccount?: string
description?: string description?: string
createTime?: string createTime?: string
create_time?: string
employee_account?: string
} }
export interface DetailForm { export interface DetailForm {
billNumber?: string billNumber?: string
orderNumber?: string orderNumber?: string
craftCode?: string
baseSku?: string baseSku?: string
shipmentNumber?: string shipmentNumber?: string
process?: string process?: string
...@@ -217,6 +272,7 @@ export interface DetailForm { ...@@ -217,6 +272,7 @@ export interface DetailForm {
subOrderNumber?: string subOrderNumber?: string
rows?: number rows?: number
page?: number page?: number
currentPage?: number
pageSize?: number pageSize?: number
infoId?: number infoId?: number
} }
......
<template>
<div class="page card h-100 flex-gap-10 overflow-hidden flex">
<div class="left">
<ElTree
ref="treeRef"
default-expand-all
:expand-on-click-node="false"
:default-expanded-keys="[]"
:highlight-current="true"
node-key="status"
:data="treeData"
:props="{ children: 'children', label: 'name' }"
@node-click="nodeClick"
>
<template #default="{ data }">
<div class="tree-node">
<div class="tree-node-label">{{ data.name }}</div>
<div v-if="data.num || data.num === 0" class="tree-node-count">
{{ `(${data.num})` }}
</div>
</div>
</template>
</ElTree>
</div>
<div class="right">
<split-div>
<template #top>
<el-card>
<el-form inline :model="searchForm">
<el-form-item label="店铺单号">
<el-input
v-model="searchForm.shopNumber"
style="width: 180px"
placeholder="请输入店铺单号"
clearable
></el-input>
</el-form-item>
<el-form-item label="物流跟踪号">
<el-input
v-model="searchForm.trackNumber"
style="width: 180px"
placeholder="请输入物流跟踪号"
clearable
></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="getData">查询</el-button>
<el-button
v-if="nodeId === 0 || nodeId === 11"
type="success"
@click="batchRegister"
>
批量注册跟踪
</el-button>
<el-button
v-if="nodeId !== -1 && nodeId !== 0 && nodeId !== 11"
type="warning"
@click="batchPushOrder"
>
批量同步跟踪
</el-button>
</el-form-item>
</el-form>
</el-card>
</template>
<template #bottom>
<el-card style="height: 100%">
<div class="manage">
<div class="table-flex">
<div class="left-table">
<div class="table-container">
<TableView
ref="tableRef"
:columns="tableColumns"
:serial-numberable="true"
:selectionable="true"
:paginated-data="leftData"
:is-more="true"
highlight-current-row
@selection-change="handleSelectionChange"
>
<template #orderStatus="{ row }">
<div>{{ getStatus(row.orderStatus) }}</div>
</template>
<template #shipmentType="{ row }">
{{ ['自有物流', '工厂物流'][row.shipmentType] }}
</template>
</TableView>
</div>
<div class="pagination">
<el-pagination
v-model:current-page="pagination.currentPage"
v-model:page-size="pagination.pageSize"
:page-sizes="[50, 100, 150, 200]"
layout="total, sizes, prev, pager, next, jumper"
:total="pagination.total"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
/>
</div>
</div>
</div>
</div>
</el-card>
</template>
</split-div>
</div>
</div>
</template>
<script setup lang="ts">
import { nextTick, ref, onMounted, computed } from 'vue'
import { ElMessage, ElTree } from 'element-plus'
import SplitDiv from '@/components/splitDiv/splitDiv.vue'
import TableView from '@/components/TableView.vue'
import {
ILogisticsCompany,
ILogisticsCompanyData,
logisticsTrackingPage,
logisticStatusList,
logisticsTrackingBatchRegister,
logisticsTrackingBatchPushOrder,
} from '@/api/logistics.ts'
import { getOrderTabData } from '@/api/podUsOrder'
import { LogisticsTrackingTree } from '@/views/logistics/types/logistics'
import { Tab } from '@/types/api/podUsOrder'
interface SearchForm {
shopNumber: string
trackNumber: string | number
}
const searchForm = ref<SearchForm>({
shopNumber: '',
trackNumber: '',
})
const treeData = ref<LogisticsTrackingTree[]>()
const treeRef = ref<InstanceType<typeof ElTree>>()
const tableRef = ref<{ internalIsMore?: boolean }>()
const nodeId = ref<number>(-1)
const selections = ref<ILogisticsCompany[]>([])
const leftData = ref<ILogisticsCompany[]>([])
const pagination = ref<ILogisticsCompanyData>({
pageSize: 50,
currentPage: 1,
total: 0,
})
// 表格列配置
const tableColumns = computed(() => {
return [
{
label: '订单号',
prop: 'factoryOrderNumber',
width: 160,
align: 'center',
},
{
label: '第三方订单号',
prop: 'thirdOrderNumber',
width: 240,
align: 'center',
},
{
label: '店铺单号',
prop: 'shopNumber',
width: 160,
align: 'center',
},
{
label: '订单状态',
prop: 'orderStatus',
slot: 'orderStatus',
width: 160,
align: 'center',
},
{
label: '物流类型',
slot: 'shipmentType',
prop: 'shipmentType',
width: 120,
align: 'center',
},
{
label: '物流跟踪号',
prop: 'trackingNumber',
width: 200,
align: 'center',
showOverflowTooltip: true,
},
{
label: '总克重(g)',
prop: 'weight',
width: 100,
align: 'center',
},
{
label: '生产端',
prop: 'productionClient',
width: 100,
align: 'center',
},
{
label: '发货仓库',
prop: 'warehouseName',
width: 120,
align: 'center',
},
{
label: '物流方式',
prop: 'logisticsWayName',
width: 120,
align: 'center',
},
{
label: '收货人',
prop: 'receiverName',
width: 150,
align: 'center',
showOverflowTooltip: true,
},
{
label: '收货人电话',
prop: 'receiverPhone',
width: 140,
align: 'center',
showOverflowTooltip: true,
},
{
label: '收货人邮编',
prop: 'receiverPostCode',
width: 140,
align: 'center',
},
{
label: '收货地址',
prop: 'lanshouAddress',
width: 500,
align: 'center',
showOverflowTooltip: true,
},
]
})
// 获取菜单树
const getTree = async () => {
try {
const res = await logisticStatusList()
treeData.value = res.data
await nextTick(() => {
treeRef.value!.setCurrentKey(nodeId.value, true)
})
} catch (e) {
console.error(e)
}
}
// 列表查询
async function getData() {
const res = await logisticsTrackingPage({
trackingStatus: nodeId.value,
shopNumber: searchForm.value.shopNumber,
trackNumber: searchForm.value.trackNumber,
})
leftData.value = res.data.records
pagination.value.total = res.data.total
}
// 批量注册
const batchRegister = async () => {
if (selections.value.length === 0) {
ElMessage.warning('请选择要注册的订单')
return
}
try {
await ElMessageBox.confirm(`确定批量注册?`, '重要提示', {
confirmButtonText: '确定',
type: 'warning',
})
} catch (error) {
return
}
const loading = ElLoading.service({
fullscreen: true,
text: '操作中...',
background: 'rgba(0, 0, 0, 0.3)',
})
try {
await logisticsTrackingBatchRegister({
idList: tableRef.value?.internalIsMore
? []
: selections.value.map((d) => d.id),
selectAll: tableRef.value?.internalIsMore || false,
})
loading.close()
selections.value = []
ElMessage.success('操作成功')
getData()
} catch (err) {
console.log(err)
} finally {
loading.close()
}
}
// 批量同步
const batchPushOrder = async () => {
if (selections.value.length === 0) {
ElMessage.warning('请选择要同步的订单')
return
}
try {
await ElMessageBox.confirm(`确定批量同步?`, '重要提示', {
confirmButtonText: '确定',
type: 'warning',
})
} catch (error) {
return
}
const loading = ElLoading.service({
fullscreen: true,
text: '操作中...',
background: 'rgba(0, 0, 0, 0.3)',
})
try {
await logisticsTrackingBatchPushOrder({
idList: selections.value.map((d) => d.id),
selectAll: false,
})
loading.close()
selections.value = []
ElMessage.success('操作成功')
getData()
} catch (err) {
console.log(err)
} finally {
loading.close()
}
}
const tabsNav = ref<Tab[]>([])
const loadTabData = async () => {
try {
const res = await getOrderTabData()
tabsNav.value = res.data.filter((el) => el.status !== 'BATCH_DOWNLOAD')
} catch (error) {
// showError(error)
}
}
function getStatus(status: string) {
const item = tabsNav.value.find((el) => el.status === status)
if (item) {
return item.statusName
}
return ''
}
const nodeClick = (data: LogisticsTrackingTree) => {
nodeId.value = data.status ?? 0
getData()
}
const handleSelectionChange = (data: ILogisticsCompany[]) => {
selections.value = data
}
const handleSizeChange = (pageSize: number) => {
pagination.value.pageSize = pageSize
getData()
}
const handleCurrentChange = (currentPage: number) => {
pagination.value.currentPage = currentPage
getData()
}
onMounted(() => {
getTree()
getData()
loadTabData()
})
</script>
<style scoped lang="scss">
.el-card {
::v-deep(.el-card__body) {
height: 100%;
}
}
.manage {
height: 100%;
display: flex;
flex-direction: column;
.header {
margin-bottom: 10px;
}
.table-flex {
flex: 1;
flex-shrink: 0;
overflow: hidden;
display: flex;
}
.right-table {
flex: 1;
margin-left: 10px;
flex-shrink: 0;
}
.left-table {
height: 100%;
display: flex;
width: 100%;
flex-direction: column;
.pagination {
display: flex;
margin-top: 10px;
justify-content: center;
}
.table-container {
flex: 1;
flex-shrink: 0;
overflow: hidden;
}
}
}
.left {
width: 160px;
:deep(.el-tree-node__content) {
height: 30px;
line-height: 30px;
}
:deep(.el-tree-node__label) {
font-size: 13px;
cursor: pointer;
display: inline-block;
width: 100%;
color: black !important;
padding: 3px 7px;
}
:deep(.el-tree-node__expand-icon) {
display: none;
}
.tree-node {
display: flex;
color: #333;
font-weight: 500;
}
:deep(.is-current) {
.tree-node-label,
.tree-node-count {
background-color: #ecf5ff;
color: #409eff !important;
}
.el-tree-node__children {
.tree-node-label,
.tree-node-count {
background-color: transparent !important;
color: black !important;
}
}
}
}
.right {
flex: 1;
flex-shrink: 0;
background: white;
overflow: hidden;
}
</style>
...@@ -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
}
...@@ -6,6 +6,7 @@ import { AddressInfo } from '@/types/api/podUsOrder.ts' ...@@ -6,6 +6,7 @@ import { AddressInfo } from '@/types/api/podUsOrder.ts'
const emits = defineEmits(['success']) const emits = defineEmits(['success'])
defineProps<{ defineProps<{
countryList: { countryCode: string }[] countryList: { countryCode: string }[]
type: 1 | 2
}>() }>()
const visible = defineModel<boolean>('visible') const visible = defineModel<boolean>('visible')
const form = defineModel<AddressInfo>('form', { const form = defineModel<AddressInfo>('form', {
...@@ -63,13 +64,14 @@ const submitForm = async () => { ...@@ -63,13 +64,14 @@ const submitForm = async () => {
<el-dialog <el-dialog
v-model="visible" v-model="visible"
:close-on-click-modal="false" :close-on-click-modal="false"
title="修改揽收信息" :title="type === 1 ? '修改揽收信息' : '地址信息'"
width="50%" width="50%"
> >
<el-form ref="formRef" :model="form" :rules="rules" label-width="120px"> <el-form ref="formRef" :model="form" :rules="rules" label-width="120px">
<el-form-item label="姓名" prop="receiverName"> <el-form-item label="姓名" prop="receiverName">
<el-input <el-input
v-model="form.receiverName" v-model="form.receiverName"
:disabled="type === 2"
clearable clearable
placeholder="请输入姓名" placeholder="请输入姓名"
/> />
...@@ -77,12 +79,18 @@ const submitForm = async () => { ...@@ -77,12 +79,18 @@ const submitForm = async () => {
<el-form-item label="电话" prop="receiverPhone"> <el-form-item label="电话" prop="receiverPhone">
<el-input <el-input
v-model="form.receiverPhone" v-model="form.receiverPhone"
:disabled="type === 2"
clearable clearable
placeholder="请输入电话" placeholder="请输入电话"
/> />
</el-form-item> </el-form-item>
<el-form-item label="国家" prop="receiverCountry"> <el-form-item label="国家" prop="receiverCountry">
<el-select v-model="form.receiverCountry" clearable filterable> <el-select
v-model="form.receiverCountry"
clearable
filterable
:disabled="type === 2"
>
<el-option <el-option
v-for="it in countryList" v-for="it in countryList"
:key="it.countryCode" :key="it.countryCode"
...@@ -94,6 +102,7 @@ const submitForm = async () => { ...@@ -94,6 +102,7 @@ const submitForm = async () => {
<el-form-item label="省/州" prop="receiverProvince"> <el-form-item label="省/州" prop="receiverProvince">
<el-input <el-input
v-model="form.receiverProvince" v-model="form.receiverProvince"
:disabled="type === 2"
clearable clearable
placeholder="请输入省/州" placeholder="请输入省/州"
/> />
...@@ -101,6 +110,7 @@ const submitForm = async () => { ...@@ -101,6 +110,7 @@ const submitForm = async () => {
<el-form-item label="市" prop="receiverCity"> <el-form-item label="市" prop="receiverCity">
<el-input <el-input
v-model="form.receiverCity" v-model="form.receiverCity"
:disabled="type === 2"
clearable clearable
placeholder="请输入市" placeholder="请输入市"
/> />
...@@ -108,6 +118,7 @@ const submitForm = async () => { ...@@ -108,6 +118,7 @@ const submitForm = async () => {
<el-form-item label="区/县" prop="receiverDistrict"> <el-form-item label="区/县" prop="receiverDistrict">
<el-input <el-input
v-model="form.receiverDistrict" v-model="form.receiverDistrict"
:disabled="type === 2"
clearable clearable
placeholder="请输入区/县" placeholder="请输入区/县"
/> />
...@@ -115,6 +126,7 @@ const submitForm = async () => { ...@@ -115,6 +126,7 @@ const submitForm = async () => {
<el-form-item label="地址1" prop="receiverAddress1"> <el-form-item label="地址1" prop="receiverAddress1">
<el-input <el-input
v-model="form.receiverAddress1" v-model="form.receiverAddress1"
:disabled="type === 2"
clearable clearable
placeholder="请输入地址1" placeholder="请输入地址1"
maxlength="50" maxlength="50"
...@@ -124,6 +136,7 @@ const submitForm = async () => { ...@@ -124,6 +136,7 @@ const submitForm = async () => {
<el-form-item label="地址2" prop="receiverAddress2"> <el-form-item label="地址2" prop="receiverAddress2">
<el-input <el-input
v-model="form.receiverAddress2" v-model="form.receiverAddress2"
:disabled="type === 2"
clearable clearable
placeholder="请输入地址2" placeholder="请输入地址2"
maxlength="50" maxlength="50"
...@@ -133,6 +146,7 @@ const submitForm = async () => { ...@@ -133,6 +146,7 @@ const submitForm = async () => {
<el-form-item label="邮政编码" prop="receiverPostCode"> <el-form-item label="邮政编码" prop="receiverPostCode">
<el-input <el-input
v-model="form.receiverPostCode" v-model="form.receiverPostCode"
:disabled="type === 2"
clearable clearable
placeholder="请输入邮政编码" placeholder="请输入邮政编码"
/> />
...@@ -140,8 +154,10 @@ const submitForm = async () => { ...@@ -140,8 +154,10 @@ const submitForm = async () => {
</el-form> </el-form>
<template #footer> <template #footer>
<span v-if="type === 1">
<el-button @click="visible = false">取消</el-button> <el-button @click="visible = false">取消</el-button>
<el-button type="primary" @click="submitForm">提交</el-button> <el-button type="primary" @click="submitForm">提交</el-button>
</span>
</template> </template>
</el-dialog> </el-dialog>
</template> </template>
......
...@@ -717,6 +717,18 @@ ...@@ -717,6 +717,18 @@
}" }"
>{{ item.quantity }}</span >{{ item.quantity }}</span
> >
<span
v-if="
item.status === 'INTERCEPTED' &&
(interceptionStatus.production['0'] ||
interceptionStatus.shipment['0'])
"
class="tabs-node-quantity"
>+{{
(interceptionStatus.production['0'] || 0) +
(interceptionStatus.shipment['0'] || 0) || ''
}}</span
>
</div> </div>
<!-- <div <!-- <div
v-if="item.status === 'EXCEPTION_ORDER'" v-if="item.status === 'EXCEPTION_ORDER'"
...@@ -1383,7 +1395,7 @@ ...@@ -1383,7 +1395,7 @@
{{ row.logisticsWayName }} {{ row.logisticsWayName }}
</span> </span>
</div> </div>
<div class="order-detail-item"> <!-- <div class="order-detail-item">
<span class="order-detail-item-label">收货人:</span> <span class="order-detail-item-label">收货人:</span>
<span class="order-detail-item-value" :title="row.receiverName"> <span class="order-detail-item-value" :title="row.receiverName">
{{ row.receiverName }} {{ row.receiverName }}
...@@ -1406,7 +1418,7 @@ ...@@ -1406,7 +1418,7 @@
> >
{{ row.receiverPostCode }} {{ row.receiverPostCode }}
</span> </span>
</div> </div> -->
<!-- <div class="order-detail-item"> <!-- <div class="order-detail-item">
<span class="order-detail-item-label">收货地址:</span> <span class="order-detail-item-label">收货地址:</span>
<span <span
...@@ -1535,6 +1547,16 @@ ...@@ -1535,6 +1547,16 @@
{{ row.finishTime?.replace('T', ' ') }} {{ row.finishTime?.replace('T', ' ') }}
</div> </div>
</template> </template>
<template #automaticComposing="{ row }">
<div style="white-space: pre-line">
{{ row.automaticComposing ? '是' : '否' }}
</div>
</template>
<template #composingParam="{ row }">
<div style="white-space: pre-line">
{{ row.composingParam?.split(';').join('\n') }}
</div>
</template>
<template #failTime="{ row }"> <template #failTime="{ row }">
<div style="white-space: pre-line"> <div style="white-space: pre-line">
{{ row.failTime?.replace('T', ' ') }} {{ row.failTime?.replace('T', ' ') }}
...@@ -1550,15 +1572,15 @@ ...@@ -1550,15 +1572,15 @@
> >
<span class="operate-item"> <span class="operate-item">
<ElButton <ElButton
:disabled="!row.url" :disabled="!row.url && !row.tiffUrl"
link link
type="primary" type="primary"
@click="handleDownload(row, 'png')" @click="handleDownload(row)"
> >
PNG下载 下载
</ElButton> </ElButton>
</span> </span>
<span class="operate-item"> <!-- <span class="operate-item">
<ElButton <ElButton
:disabled="!row.tiffUrl" :disabled="!row.tiffUrl"
link link
...@@ -1567,7 +1589,7 @@ ...@@ -1567,7 +1589,7 @@
> >
TIF下载 TIF下载
</ElButton> </ElButton>
</span> </span> -->
<span class="operate-item"> <span class="operate-item">
<ElButton <ElButton
link link
...@@ -1610,6 +1632,15 @@ ...@@ -1610,6 +1632,15 @@
<span v-if="status !== 'BATCH_DOWNLOAD'" class="operate-item"> <span v-if="status !== 'BATCH_DOWNLOAD'" class="operate-item">
<ElButton <ElButton
link link
type="warning"
@click="handleUpdateAddress(row, 2)"
>
地址信息
</ElButton>
</span>
<span v-if="status !== 'BATCH_DOWNLOAD'" class="operate-item">
<ElButton
link
type="primary" type="primary"
@click="operationLog(row.id, null, row)" @click="operationLog(row.id, null, row)"
> >
...@@ -1648,7 +1679,11 @@ ...@@ -1648,7 +1679,11 @@
" "
class="operate-item" class="operate-item"
> >
<ElButton link type="primary" @click="handleUpdateAddress(row)"> <ElButton
link
type="primary"
@click="handleUpdateAddress(row, 1)"
>
修改地址 修改地址
</ElButton> </ElButton>
</span> </span>
...@@ -2120,16 +2155,30 @@ ...@@ -2120,16 +2155,30 @@
</el-button> </el-button>
</div> </div>
</div> </div>
<div
v-if="currentItem?.lanshouAddress"
style="margin-top: 10px; color: #606266"
>
<span>地址:</span>
<span>{{ currentItem?.lanshouAddress }}</span>
</div>
</template> </template>
<LogList :log-list="logList" /> <LogList :log-list="logList" />
</el-dialog> </el-dialog>
<el-dialog
v-model="addressInfoVisible"
class="address-info-dialog"
title="地址信息"
width="800px"
>
<el-descriptions :column="1" border>
<el-descriptions-item label="收货人">
{{ currentItem?.receiverName }}
</el-descriptions-item>
<el-descriptions-item label="收货人电话">
{{ currentItem?.receiverPhone }}
</el-descriptions-item>
<el-descriptions-item label="收货人邮编">
{{ currentItem?.receiverPostCode }}
</el-descriptions-item>
<el-descriptions-item label="收货地址">
{{ currentItem?.lanshouAddress }}
</el-descriptions-item>
</el-descriptions>
</el-dialog>
<FastProduction <FastProduction
v-model:detail-visible="detailVisible" v-model:detail-visible="detailVisible"
:current-status="status" :current-status="status"
...@@ -2267,6 +2316,7 @@ ...@@ -2267,6 +2316,7 @@
v-model:visible="updateAddVisible" v-model:visible="updateAddVisible"
:country-list="countryList" :country-list="countryList"
@success="search" @success="search"
:type="updateAddressType"
></UpdateAddress> ></UpdateAddress>
<ElDialog <ElDialog
v-model="exceptionDialogVisible" v-model="exceptionDialogVisible"
...@@ -2429,12 +2479,28 @@ ...@@ -2429,12 +2479,28 @@
width="500px" width="500px"
:close-on-click-modal="false" :close-on-click-modal="false"
> >
<el-form :model="typesettingForm" label-width="100px"> <el-form :model="typesettingForm">
<el-form-item
label="自动排版 (烫画工艺推荐自动排版)"
prop="bool"
v-if="typesettingType == 2"
>
<el-switch
v-model="isAuto"
class="ml-2"
style="--el-switch-on-color: #13ce66; --el-switch-off-color: #ff4949"
inline-prompt
active-text="是"
inactive-text="否"
@change="changeSwitch"
/>
</el-form-item>
<div v-if="isAuto">
<el-form-item label="排版类型:" prop="type"> <el-form-item label="排版类型:" prop="type">
<el-checkbox-group v-model="typesettingForm.typeArr"> <el-radio-group v-model="typesettingForm.type">
<el-checkbox label="tiff">tiff排版</el-checkbox> <el-radio label="tiff">tiff排版</el-radio>
<el-checkbox label="png">png排版</el-checkbox> <el-radio label="png">png排版</el-radio>
</el-checkbox-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-form-item label="排版宽度:" prop="type"> <el-form-item label="排版宽度:" prop="type">
<el-radio-group v-model="typesettingForm.templateWidth"> <el-radio-group v-model="typesettingForm.templateWidth">
...@@ -2442,9 +2508,18 @@ ...@@ -2442,9 +2508,18 @@
<el-radio :value="60">60cm</el-radio> <el-radio :value="60">60cm</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
</div>
</el-form> </el-form>
<template #footer> <template #footer>
<el-button @click="typesettingVisible = false">取消</el-button> <el-button
@click="
() => {
isAuto = true
typesettingVisible = false
}
"
>取消</el-button
>
<el-button type="primary" @click="submitTypesetting">确认</el-button> <el-button type="primary" @click="submitTypesetting">确认</el-button>
</template> </template>
</ElDialog> </ElDialog>
...@@ -2588,7 +2663,7 @@ declare global { ...@@ -2588,7 +2663,7 @@ declare global {
} }
} }
const tabsNav = ref<Tab[]>() const tabsNav = ref<Tab[]>()
const isAuto = ref(true)
const countryList = ref([]) const countryList = ref([])
const currentRow = ref<AddressInfo>({ const currentRow = ref<AddressInfo>({
receiverName: '', receiverName: '',
...@@ -2865,14 +2940,16 @@ const handleRefreshAddress = async (row: PodUsOrderListData) => { ...@@ -2865,14 +2940,16 @@ const handleRefreshAddress = async (row: PodUsOrderListData) => {
}, },
) )
} }
const handleUpdateAddress = async (row: PodUsOrderListData) => { const updateAddressType = ref<1 | 2>(1)
const handleUpdateAddress = async (row: PodUsOrderListData, type: 1 | 2) => {
const { data } = await getAllCountryApi() const { data } = await getAllCountryApi()
countryList.value = data countryList.value = data
currentRow.value = JSON.parse(JSON.stringify(row)) currentRow.value = JSON.parse(JSON.stringify(row))
updateAddVisible.value = true updateAddVisible.value = true
updateAddressType.value = type
} }
// 批量下载 下载 // 批量下载 下载
const handleDownload = async (row: PodUsOrderListData, type: string) => { const handleDownload = async (row: PodUsOrderListData) => {
try { try {
await showConfirm('确定下载吗?', { await showConfirm('确定下载吗?', {
confirmButtonText: '确认', confirmButtonText: '确认',
...@@ -2887,6 +2964,8 @@ const handleDownload = async (row: PodUsOrderListData, type: string) => { ...@@ -2887,6 +2964,8 @@ const handleDownload = async (row: PodUsOrderListData, type: string) => {
text: '操作中...', text: '操作中...',
background: 'rgba(0, 0, 0, 0.3)', background: 'rgba(0, 0, 0, 0.3)',
}) })
const type = row.url && row.tiffUrl ? 'tiff' : row.url ? 'png' : 'tiff'
try { try {
const url = const url =
type === 'png' type === 'png'
...@@ -2969,10 +3048,10 @@ const handleReComposingDesign = async () => { ...@@ -2969,10 +3048,10 @@ const handleReComposingDesign = async () => {
} = { } = {
id: row.id, id: row.id,
} }
const { templateWidth, typeArr } = typesettingForm.value const { templateWidth, type } = typesettingForm.value
if (templateWidth && typeArr?.length) { if (templateWidth && type) {
params.templateWidth = templateWidth params.templateWidth = templateWidth
params.type = typeArr.join(',') params.type = type
} }
try { try {
const res = await batchDownloadRecomposingApi(params) const res = await batchDownloadRecomposingApi(params)
...@@ -2995,31 +3074,31 @@ const tableColumns = computed(() => { ...@@ -2995,31 +3074,31 @@ const tableColumns = computed(() => {
{ {
label: '批次号', label: '批次号',
prop: 'batchArrangeNum', prop: 'batchArrangeNum',
width: 150, width: 120,
align: 'center', align: 'center',
}, },
{ {
label: '下载状态', label: '下载状态',
slot: 'downloadStatus', slot: 'downloadStatus',
width: 100, width: 90,
prop: 'downloadStatus', prop: 'downloadStatus',
align: 'center', align: 'center',
}, },
{ {
label: '订单数量', label: '订单数量',
prop: 'productNum', prop: 'productNum',
width: 90, width: 85,
align: 'center', align: 'center',
}, },
{ {
label: '素材数量', label: '素材数量',
width: 90, width: 85,
prop: 'materialNum', prop: 'materialNum',
align: 'center', align: 'center',
}, },
{ {
label: '创建人', label: '创建人',
width: 100, width: 85,
prop: 'employeeAccount', prop: 'employeeAccount',
align: 'center', align: 'center',
}, },
...@@ -3044,17 +3123,24 @@ const tableColumns = computed(() => { ...@@ -3044,17 +3123,24 @@ const tableColumns = computed(() => {
slot: 'finishTime', slot: 'finishTime',
align: 'center', align: 'center',
}, },
// { {
// label: '失败时间', label: '自动下载',
// width: 250, width: 85,
// prop: 'failTime', prop: 'automaticComposing',
// slot: 'failTime', slot: 'automaticComposing',
// align: 'center', align: 'center',
// }, },
{
label: '排版参数',
width: 140,
prop: 'composingParam',
slot: 'composingParam',
align: 'center',
},
{ {
label: '操作', label: '操作',
slot: 'operate', slot: 'operate',
width: 450, width: 350,
align: 'center', align: 'center',
fixed: 'right', fixed: 'right',
prop: 'operate', prop: 'operate',
...@@ -3655,23 +3741,22 @@ const downloadTifItem = async () => { ...@@ -3655,23 +3741,22 @@ const downloadTifItem = async () => {
}) })
try { try {
const { templateWidth, typeArr } = typesettingForm.value const { templateWidth, type } = typesettingForm.value
const type = typeArr?.join(',') || ''
typesettingVisible.value = false typesettingVisible.value = false
// 处理下载逻辑 // // 处理下载逻辑
if ((typeArr as string[]).length > 1) { // if ((type as string[]).length > 1) {
// 并行处理多个类型 // // 并行处理多个类型
await Promise.allSettled( // await Promise.allSettled(
(typeArr as string[]).map((el) => // (type as string[]).map((el) =>
downloadSingleType(row.id, el, templateWidth), // downloadSingleType(row.id, el, templateWidth),
), // ),
) // )
} else { // } else {
// 处理单个类型 // 处理单个类型
await downloadSingleType(row.id, type, templateWidth) await downloadSingleType(row.id, type as string, templateWidth)
} // }
} catch (error) { } catch (error) {
console.error('下载过程中出错:', error) console.error('下载过程中出错:', error)
} finally { } finally {
...@@ -4355,10 +4440,10 @@ const arrangeFinish = async () => { ...@@ -4355,10 +4440,10 @@ const arrangeFinish = async () => {
} = { } = {
productIdList: selectedIds, productIdList: selectedIds,
} }
const { templateWidth, typeArr } = typesettingForm.value const { templateWidth, type } = typesettingForm.value
if (templateWidth && typeArr?.length) { if (templateWidth && type) {
params.templateWidth = templateWidth params.templateWidth = templateWidth
params.type = typeArr.join(',') params.type = type
} }
console.log(4233, params) console.log(4233, params)
...@@ -4377,23 +4462,42 @@ const arrangeFinish = async () => { ...@@ -4377,23 +4462,42 @@ const arrangeFinish = async () => {
} }
const submitTypesetting = () => { const submitTypesetting = () => {
const { templateWidth, typeArr } = typesettingForm.value const { templateWidth, type } = typesettingForm.value
if (templateWidth && !typeArr?.length) {
return ElMessage.warning('请选择排版类型') // 如果是自动排版且没有填必选项
} else if (!templateWidth && typeArr?.length) { if (isAuto.value && (!templateWidth || !type)) {
return ElMessage.warning('排版类型和排版宽度为必选项')
}
// 针对排版宽度和类型分别判断
if (!templateWidth && type) {
return ElMessage.warning('请选择排版宽度') return ElMessage.warning('请选择排版宽度')
} }
if (typesettingType.value == 3) { if (templateWidth && !type) {
if (!templateWidth && !typeArr?.length) { return ElMessage.warning('请选择排版类型')
}
// 针对类型 3 的特殊判断
if (typesettingType.value === 3 && (!templateWidth || !type)) {
return ElMessage.warning('排版类型和排版宽度为必选项') return ElMessage.warning('排版类型和排版宽度为必选项')
} }
// 设置为自动排版
isAuto.value = true
// 根据排版类型执行相应的操作
switch (typesettingType.value) {
case 1:
return handleReComposingDesign()
case 2:
return arrangeFinish()
default:
return downloadTifItem()
} }
}
return typesettingType.value == 1 const changeSwitch = () => {
? handleReComposingDesign() typesettingForm.value = {}
: typesettingType.value == 2
? arrangeFinish()
: downloadTifItem()
} }
interface timeLineType { interface timeLineType {
...@@ -4443,6 +4547,9 @@ const operationLog = async ( ...@@ -4443,6 +4547,9 @@ const operationLog = async (
console.error(e) console.error(e)
} }
} }
const addressInfoVisible = ref(false)
const handleSuccess = () => { const handleSuccess = () => {
loadTabData() loadTabData()
search() search()
...@@ -5974,4 +6081,11 @@ useRouter().beforeEach((to, from, next) => { ...@@ -5974,4 +6081,11 @@ useRouter().beforeEach((to, from, next) => {
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
} }
.tabs-node-quantity {
position: relative;
color: red;
font-size: 12px;
top: -10px;
right: 0px;
}
</style> </style>
<template>
<el-dialog
v-model="visible"
title="订单详情"
top="40px"
draggable
width="90%"
:close-on-click-modal="false"
class="order-detail-dialog"
>
<el-card
style="margin-bottom: 10px"
v-if="detailData"
class="!border-none mt-2"
shadow="never"
>
<el-descriptions class="margin-top" :column="3" :border="true">
<el-descriptions-item :title="detailData.namespace" label="订单来源"
>{{ detailData.namespace }}
</el-descriptions-item>
<el-descriptions-item
:title="detailData.factory_order_number"
label="订单号"
>{{ detailData.factory_order_number }}
</el-descriptions-item>
<el-descriptions-item :title="detailData.shop_number" label="店铺单号"
>{{ detailData.shop_number }}
</el-descriptions-item>
<el-descriptions-item
:title="detailData.third_order_number"
label="第三方订单号"
>{{ detailData.third_order_number }}
</el-descriptions-item>
<el-descriptions-item :title="detailData.statusStr" label="订单状态"
>{{ detailData.statusStr }}
</el-descriptions-item>
<el-descriptions-item :title="detailData.product_num" label="产品数量"
>{{ detailData.product_num }}
</el-descriptions-item>
<el-descriptions-item
:title="detailData.start_stocking_time"
label="确认时间"
>{{ detailData.start_stocking_time }}
</el-descriptions-item>
<el-descriptions-item :title="detailData.finish_time" label="完成时间"
>{{ detailData.finish_time }}
</el-descriptions-item>
<el-descriptions-item
:title="detailData.delivery_type"
label="交运方式"
>
<span v-if="detailData.delivery_type === 'lanshou'">上门揽收 </span>
<span v-if="detailData.delivery_type === 'zisong'">卖家自送 </span>
</el-descriptions-item>
<el-descriptions-item
:title="detailData.logistics_way_name"
label="物流方式"
>
{{ detailData.logistics_way_name }}
</el-descriptions-item>
<el-descriptions-item
:title="detailData.lanshou_name || detailData.receiver_name"
label="收货人"
>{{ detailData.lanshou_name || detailData.receiver_name }}
</el-descriptions-item>
<el-descriptions-item
:title="detailData.lanshou_phone || detailData.receiver_phone"
label="收货电话"
>{{ detailData.lanshou_phone || detailData.receiver_phone }}
</el-descriptions-item>
<el-descriptions-item
:title="detailData.lanshou_region || detailData.receiver_province"
label="收货区域"
>{{ detailData.lanshou_region || detailData.receiver_province }}
</el-descriptions-item>
<el-descriptions-item
:title="
detailData.lanshou_address ||
[
detailData.receiver_province,
detailData.receiver_city,
detailData.receiver_district,
detailData.receiver_address1,
].join(' ')
"
label="收货地址"
>{{
detailData.lanshou_address ||
[
detailData.receiver_province,
detailData.receiver_city,
detailData.receiver_district,
detailData.receiver_address1,
].join(' ')
}}
</el-descriptions-item>
<el-descriptions-item
:title="detailData.lanshou_post || detailData.receiver_post_code"
label="收货邮政编码"
>{{ detailData.lanshou_post || detailData.receiver_post_code }}
</el-descriptions-item>
<el-descriptions-item :title="detailData.user_mark" label="客户"
>{{ detailData.user_mark }}
</el-descriptions-item>
</el-descriptions>
</el-card>
<el-card v-if="detailData" class="!border-none mt-2" shadow="never">
<div class="font-bold">商品</div>
<div class="flex mt-4">
<el-table
border
class="mt-4"
size="large"
height="400"
:data="detailData.productList"
>
<el-table-column
show-overflow-tooltip
label="商品图片"
width="100"
prop="variant_image"
>
<template #default="{ row }">
<el-image
v-if="row.variant_image"
preview-teleported
style="width: 60px; height: 60px"
:preview-src-list="[row.variant_image]"
:src="row.variant_image"
></el-image>
</template>
</el-table-column>
<el-table-column
label="生产单号"
width="150"
show-overflow-tooltip
prop="third_sub_order_number"
></el-table-column>
<el-table-column
label="工厂单号"
width="150"
show-overflow-tooltip
prop="factory_sub_order_number"
></el-table-column>
<el-table-column
label="商品名称"
show-overflow-tooltip
prop="product_name"
></el-table-column>
<el-table-column
show-overflow-tooltip
width="100"
label="价格(¥)"
prop="price"
></el-table-column>
<el-table-column
show-overflow-tooltip
width="100"
label="商品数量"
prop="num"
></el-table-column>
<el-table-column
label="店铺单号"
width="150"
prop="shop_number"
show-overflow-tooltip
>
<template #default>
{{ detailData.shop_number }}
</template>
</el-table-column>
<el-table-column
show-overflow-tooltip
label="baseSKU"
width="150"
prop="base_sku"
></el-table-column>
<el-table-column
show-overflow-tooltip
label="变体SKU"
width="150"
prop="variant_sku"
></el-table-column>
<el-table-column
show-overflow-tooltip
label="已发货数量"
width="120"
prop="shipment_num"
></el-table-column>
</el-table>
</div>
</el-card>
</el-dialog>
</template>
<script lang="ts" setup>
import { getPodUsDetailData } from '@/api/order'
import { PodUsDetailData } from '@/types/api/deliveryNote.ts'
// 定义props
interface Props {
orderId?: number | string | null
dialogVisible: boolean
loading?: boolean
}
const visible = ref(false)
const props = withDefaults(defineProps<Props>(), {
orderId: null,
dialogVisible: false,
loading: false,
})
// 定义事件
const emit = defineEmits(['close', 'update'])
const detailData = ref<PodUsDetailData | null>(null)
const getData = async () => {
if (!props.orderId) return
const res = await getPodUsDetailData(props.orderId || '')
res.data.productList.forEach((it) => {
it.price = Number(it.product_price)
it.customized_quantityStr = it.customized_quantity > 1 ? '多面' : '单面'
it.image_ary =
it.image_ary && it.image_ary.startsWith('[')
? JSON.parse(it.image_ary).filter((el: { title: string }) => el.title)
: []
})
detailData.value = res.data
console.log(detailData.value)
}
// 监听props变化,重新获取数据
watch(
() => props.orderId,
(newId) => {
if (newId) {
getData()
}
},
)
onMounted(() => {
if (props.orderId) {
getData()
}
})
onActivated(() => {
if (props.orderId) {
getData()
}
})
watch(
() => props.dialogVisible,
() => {
visible.value = props.dialogVisible
},
)
watch(
() => visible.value,
() => {
emit('update', visible.value)
},
)
</script>
<style lang="scss" scoped>
.img-list {
display: flex;
gap: 5px;
}
.order-detail-dialog {
:deep(.el-dialog__body) {
height: 70vh !important;
overflow-y: auto;
padding: 20px;
}
}
.detail-loading-container {
min-height: 400px;
display: flex;
align-items: center;
justify-content: center;
}
</style>
<script setup lang="ts">
import { ElMessage, ElTable } from 'element-plus'
import { ProductDetails } from '@/types/api/billOrder.ts'
const selection = ref<ProductDetails[]>([])
defineProps({
list: {
type: Array,
default: () => [],
},
})
const handleDetailSelectionChange = (arr:ProductDetails[]) => {
selection.value = arr
}
const batchUpdate = async (arr:ProductDetails[], title:string, field: 'craft_price' | 'template_price') => {
let { value } = await ElMessageBox.prompt(title, '更新价格', {
confirmButtonText: '确定',
cancelButtonText: '取消',
inputPattern: /^\d+(\.\d+)?$/,
inputErrorMessage: '请输入数字',
})
if (value) {
if ( Number(value) < 0) {
ElMessage.error('价格必须为大于等于0的数字')
return
}
arr.forEach((item:ProductDetails) => {
item[field] = Number(value)
})
}
}
</script>
<template>
<div>
<div style="margin-bottom: 10px">
<el-button
:disabled="!selection.length" type="success"
@click="batchUpdate(selection,'批量修改底胚价格','template_price')">批量修改底胚价格
</el-button>
<el-button
:disabled="!selection.length" type="warning"
@click="batchUpdate(selection,'批量修改工艺价格','craft_price')">批量修改工艺价格
</el-button>
</div>
<ElTable
ref="deTableRef"
:data="list"
height="500px"
border
row-key="id"
@selection-change="handleDetailSelectionChange"
>
<el-table-column
show-overflow-tooltip
label="商品图片"
width="100"
prop="variant_image"
align="center"
>
<template #default="{ row }">
<el-image
v-if="row.variant_image"
preview-teleported="body"
style="width: 60px; height: 60px"
:preview-src-list="[row.variant_image]"
:src="row.variant_image"
></el-image>
</template>
</el-table-column>
<el-table-column
type="selection"
width="50"
header-align="center"
align="center"
fixed
/>
<ElTableColumn
show-overflow-tooltip
width="60"
align="center"
label="序号"
type="index"
fixed
/>
<el-table-column
label="生产单号"
prop="sub_order_number"
header-align="center"
align="center"
min-width="220"
show-overflow-tooltip
/>
<el-table-column
label="第三方生产单号"
prop="product.factory_sub_order_number"
header-align="center"
align="center"
min-width="160"
show-overflow-tooltip
/>
<el-table-column
show-overflow-tooltip
label="底胚SKU"
align="center"
width="150"
prop="product.base_sku"
/>
<el-table-column
label="底胚价格($)"
width="200"
align="center"
prop="template_price"
>
<template #default="{row}">
<el-input-number v-model="row.template_price" />
</template>
</el-table-column>
<el-table-column
label="工艺价格($)"
width="200"
align="center"
prop="craft_price"
>
<template #default="{row}">
<el-input-number v-model="row.craft_price" />
</template>
</el-table-column>
<el-table-column
show-overflow-tooltip
label="变体SKU"
align="center"
width="150"
prop="product.variant_sku"
/>
<el-table-column
label="商品名"
prop="product.product_name"
header-align="center"
align="center"
width="180"
show-overflow-tooltip
/>
<el-table-column
show-overflow-tooltip
label="工艺编码"
width="100"
align="center"
prop="product.craft_code"
></el-table-column>
<el-table-column
show-overflow-tooltip
label="工艺名称"
width="140"
align="center"
prop="product.craft_name"
></el-table-column>
<el-table-column
show-overflow-tooltip
label="已发货数量"
width="100"
align="center"
prop="shipment_num"
></el-table-column>
<el-table-column
show-overflow-tooltip
label="产品价格($)"
width="100"
align="center"
prop="product_price"
>
<template #default="{ row }">
<span>{{
row.template_price + row.craft_price || 0
}}</span>
</template>
</el-table-column>
<el-table-column
label="工厂"
prop="product.factory_code"
header-align="center"
align="center"
min-width="100"
show-overflow-tooltip
/>
<el-table-column
label="备注"
prop="product.remark"
header-align="center"
align="center"
min-width="160"
show-overflow-tooltip
></el-table-column>
<el-table-column
label="创建时间"
prop="product.create_time"
header-align="center"
align="center"
min-width="180"
show-overflow-tooltip
></el-table-column>
</ElTable>
</div>
</template>
<style scoped lang="scss">
</style>
<template>
<div class="page card h-100 flex-gap-10 overflow-hidden flex">
<div class="left">
<ElTree
ref="treeRef"
default-expand-all
:expand-on-click-node="false"
:default-expanded-keys="[]"
:highlight-current="true"
node-key="code"
:data="treeData"
:props="{ children: 'children', label: 'remark' }"
@node-click="nodeClick"
>
<template #default="{ data }">
<div class="tree-node">
<div class="tree-node-label">{{ data.remark }}</div>
<div v-if="data.count || data.count === 0" class="tree-node-count">
{{ `(${data.count})` }}
</div>
</div>
</template>
</ElTree>
</div>
<div class="right">
<!-- <pending-reconciliation></pending-reconciliation> -->
<div class="delivery-note-page flex-column card h-100 overflow-hidden">
<splitDiv size="50">
<template #top>
<div class="header-filter-form">
<ElForm :model="searchForm" inline>
<ElFormItem label="账期(发货时间)">
<div style="display: flex">
<el-date-picker
v-model="dateRange"
:default-time="[
new Date(0, 0, 0, 0, 0, 0),
new Date(0, 0, 0, 23, 59, 59),
]"
type="datetimerange"
start-placeholder="开始时间"
end-placeholder="结束时间"
unlink-panels
clearable
style="width: 260px"
format="YYYY-MM-DD HH:mm:ss"
value-format="YYYY-MM-DD HH:mm:ss"
/>
</div>
</ElFormItem>
<ElFormItem style="margin-right: 10px" label="对账单号">
<ElInput
v-model="searchForm.recNumber"
clearable
placeholder="对账单号"
style="width: 160px"
/>
</ElFormItem>
<ElFormItem style="margin-right: 10px" label="订单号">
<ElInput
v-model="searchForm.orderNumber"
clearable
placeholder="订单号"
style="width: 160px"
/>
</ElFormItem>
<ElFormItem>
<ElButton type="primary" @click="search">查询</ElButton>
</ElFormItem>
<ElFormItem>
<ElButton @click="reset">重置</ElButton>
</ElFormItem>
<ElFormItem v-if="nodeId === 15">
<el-button type="warning" @click="rejectOrder">
驳回
</el-button>
</ElFormItem>
<ElFormItem>
<el-button type="success" @click="exportExcel">
导出
</el-button>
</ElFormItem>
<ElFormItem v-if="nodeId === 30">
<el-button type="danger" @click="auditOrder('archive')">
归档
</el-button>
</ElFormItem>
</ElForm>
</div>
<div
class="delivery-note-content flex-1 flex-column overflow-hidden"
>
<div class="delivery-note-list flex-1 overflow-hidden">
<ElTable
ref="singleTableRef"
highlight-current-row
:data="tableData"
show-summary
:summary-method="getSummaries"
default-expand-all
size="small"
style="width: 100%; height: 100%"
border
@current-change="rowClick"
@selection-change="handleSelectionChange"
>
<el-table-column
type="selection"
width="70"
header-align="center"
align="center"
/>
<el-table-column
label="序号"
type="index"
width="80"
align="center"
header-align="center"
></el-table-column>
<el-table-column
label="对账单号"
prop="rec_number"
header-align="center"
align="center"
min-width="160"
show-overflow-tooltip
></el-table-column>
<el-table-column
label="账期(发货时间)"
header-align="center"
align="center"
min-width="340"
>
<template #default="scope">
{{ scope.row.start_time }} - {{ scope.row.end_time }}
</template>
</el-table-column>
<el-table-column
label="底胚总价($)"
header-align="center"
prop="product_total_amount"
width="100"
align="center"
show-overflow-tooltip
>
</el-table-column>
<el-table-column
label="总发货(件)"
header-align="center"
prop="num"
width="100"
align="center"
show-overflow-tooltip
>
</el-table-column>
<el-table-column
label="工艺总价($)"
header-align="center"
prop="craft_total_price"
width="130"
align="center"
show-overflow-tooltip
></el-table-column>
<el-table-column
label="商品总价($)"
header-align="center"
prop="product_total_amount"
width="130"
align="center"
show-overflow-tooltip
>
</el-table-column>
<el-table-column
label="物流总价($)"
header-align="center"
prop="carriage_total_amount"
width="130"
align="center"
show-overflow-tooltip
></el-table-column>
<el-table-column
label="应付金额($)"
header-align="center"
prop="total_amount"
width="130"
align="center"
show-overflow-tooltip
>
</el-table-column>
<el-table-column
label="实付金额($)"
header-align="center"
prop="actual_amount"
width="130"
align="center"
show-overflow-tooltip
></el-table-column>
<el-table-column
label="已付金额($)"
header-align="center"
prop="total_amount_str"
width="130"
align="center"
show-overflow-tooltip
></el-table-column>
<el-table-column
label="水单"
header-align="center"
min-width="140"
align="center"
show-overflow-tooltip
>
<template #default="{ row }">
<div
v-if="row.water_list"
style="display: flex; gap: 2px; align-items: center"
>
<div
v-for="item in (typeof row.water_list === 'string'
? row.water_list
: ''
).split(',')"
:key="item"
style="width: 30px"
>
<ImageView :src="item" />
</div>
</div>
</template>
</el-table-column>
<el-table-column
label="创建时间"
prop="create_time"
width="180"
header-align="center"
align="center"
show-overflow-tooltip
/>
<el-table-column
label="操作"
width="100"
header-align="center"
align="center"
fixed="right"
>
<template #default="{ row }">
<div>
<el-button
v-if="row.status === 10"
type="success"
size="small"
@click="confirmOrder(row)"
>
确认
</el-button>
</div>
</template>
</el-table-column>
</ElTable>
</div>
<ElPagination
v-model:current-page="currentPage"
v-model:page-size="pageSize"
:page-sizes="[100, 200, 300, 400, 500]"
background
layout="total, sizes, prev, pager, next, jumper"
:total="total"
style="margin: 10px auto 0; text-align: right"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
></ElPagination>
</div>
</template>
<template #bottom>
<el-tabs v-model="tabsValue" @tab-click="tabsClick">
<el-tab-pane name="0" label="对账单详情">
<el-form :model="detailForm" inline>
<el-form-item label="生产单号">
<el-input
v-model="detailForm.subOrderNumber"
placeholder="请输入订单号"
clearable
style="width: 130px"
/>
</el-form-item>
<el-form-item label="底胚Sku">
<el-input
v-model="detailForm.baseSku"
placeholder="请输入底胚Sku"
clearable
style="width: 130px"
/>
</el-form-item>
<el-form-item label="工艺编码">
<el-input
v-model="detailForm.craftCode"
placeholder="请输入工艺编码"
clearable
style="width: 130px"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="searchDetail"
>查询
</el-button>
</el-form-item>
<el-form-item>
<el-button
v-if="[0, 1].some((id) => id === Number(nodeId))"
type="success"
@click="batchUpdate(detailSelections, 1)"
>批量编辑
</el-button>
</el-form-item>
</el-form>
<div class="table-wrap">
<ElTable
ref="deTableRef"
:data="detailList"
height="100%"
border
row-key="id"
@selection-change="handleDetailSelectionChange"
>
<el-table-column
show-overflow-tooltip
label="商品图片"
width="100"
prop="variant_image"
align="center"
>
<template #default="{ row }">
<el-image
v-if="row.variant_image"
preview-teleported
style="width: 60px; height: 60px"
:preview-src-list="[row.variant_image]"
:src="row.variant_image"
></el-image>
</template>
</el-table-column>
<el-table-column
type="selection"
width="50"
header-align="center"
align="center"
fixed
/>
<ElTableColumn
show-overflow-tooltip
width="60"
align="center"
label="序号"
type="index"
fixed
/>
<el-table-column
label="生产单号"
prop="sub_order_number"
header-align="center"
align="center"
min-width="220"
show-overflow-tooltip
/>
<el-table-column
label="第三方生产单号"
prop="product.factory_sub_order_number"
header-align="center"
align="center"
min-width="160"
show-overflow-tooltip
/>
<el-table-column
show-overflow-tooltip
label="底胚SKU"
align="center"
width="150"
prop="product.base_sku"
/>
<el-table-column
show-overflow-tooltip
label="变体SKU"
align="center"
width="150"
prop="product.variant_sku"
/>
<el-table-column
label="商品名"
prop="product.product_name"
header-align="center"
align="center"
width="180"
show-overflow-tooltip
/>
<el-table-column
show-overflow-tooltip
label="工艺编码"
width="100"
align="center"
prop="product.craft_code"
></el-table-column>
<el-table-column
show-overflow-tooltip
label="工艺名称"
width="140"
align="center"
prop="product.craft_name"
></el-table-column>
<el-table-column
show-overflow-tooltip
label="已发货数量"
width="100"
align="center"
prop="shipment_num"
></el-table-column>
<el-table-column
show-overflow-tooltip
label="产品价格($)"
width="100"
align="center"
prop="product_price"
>
<template #default="{ row }">
<span>{{
row.template_price + row.craft_price || 0
}}</span>
</template>
</el-table-column>
<el-table-column
show-overflow-tooltip
label="底胚价格($)"
width="100"
align="center"
prop="template_price"
></el-table-column>
<el-table-column
show-overflow-tooltip
label="工艺价格($)"
width="100"
align="center"
prop="craft_price"
></el-table-column>
<el-table-column
label="工厂"
prop="product.factory_code"
header-align="center"
align="center"
min-width="100"
show-overflow-tooltip
/>
<el-table-column
label="备注"
prop="product.remark"
header-align="center"
align="center"
min-width="160"
show-overflow-tooltip
></el-table-column>
<el-table-column
label="创建时间"
prop="product.create_time"
header-align="center"
align="center"
min-width="180"
show-overflow-tooltip
></el-table-column>
<el-table-column
v-if="[0, 1].includes(nodeId)"
show-overflow-tooltip
align="center"
fixed="right"
header-align="center"
label="操作"
width="60"
>
<template #default="{ row }">
<div class="flex items-center justify-center gap-2">
<img
src="@/assets/images/edit.png"
width="24"
title="编辑"
style="cursor: pointer"
@click="batchUpdate([row], 1)"
/>
</div>
</template>
</el-table-column>
</ElTable>
</div>
<ElPagination
v-model:current-page="detailPager.page"
v-model:page-size="detailPager.rows"
:page-sizes="[100, 200, 300, 400, 500]"
background
layout="total, sizes, prev, pager, next, jumper"
:total="detailPager.total"
style="margin: 10px auto 0; text-align: right"
@size-change="handleDetailSizeChange"
@current-change="handleDetailCurrentChange"
></ElPagination>
</el-tab-pane>
<el-tab-pane name="1" label="订单详情">
<el-form :model="orderForm" inline>
<el-form-item label="订单号">
<el-input
v-model="orderForm.orderNumber"
placeholder="请输入订单号"
clearable
style="width: 130px"
/>
</el-form-item>
<el-form-item label="生产单号">
<el-input
v-model="orderForm.subOrderNumber"
placeholder="请输入订单号"
clearable
style="width: 130px"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="getUsOrderList"
>查询
</el-button>
</el-form-item>
<el-form-item>
<el-button
v-if="[0, 1].some((id) => id === Number(nodeId))"
type="success"
@click="batchUpdate(orderSelections, 2)"
>批量编辑
</el-button>
</el-form-item>
<el-form-item>
<el-button
v-if="[0, 1].some((id) => id === Number(nodeId))"
type="primary"
@click="priceModification"
>修改物流价格
</el-button>
</el-form-item>
</el-form>
<div class="table-wrap">
<ElTable
ref="deTableRef"
:data="orderList"
height="100%"
border
row-key="id"
@selection-change="handleOrderSelectionChange"
>
<el-table-column
type="selection"
width="50"
header-align="center"
align="center"
fixed
/>
<ElTableColumn
show-overflow-tooltip
width="60"
align="center"
label="序号"
type="index"
fixed
/>
<el-table-column
label="订单号"
prop="order.order_number"
header-align="center"
align="center"
min-width="220"
show-overflow-tooltip
>
<template #default="{ row }">
<span>{{
row.erp_order_number || row.factory_order_number
}}</span>
</template>
</el-table-column>
<el-table-column
label="店铺单号"
prop="order.shop_number"
header-align="center"
align="center"
min-width="160"
show-overflow-tooltip
></el-table-column>
<el-table-column
label="客户"
prop="order.user_mark"
header-align="center"
align="center"
min-width="80"
show-overflow-tooltip
></el-table-column>
<el-table-column
label="发货数(件)"
prop="order.product_num"
header-align="center"
align="center"
min-width="100"
show-overflow-tooltip
></el-table-column>
<el-table-column
label="产品总价格($)"
prop="order.product_amount"
header-align="center"
align="center"
min-width="120"
show-overflow-tooltip
/>
<el-table-column
label="底胚总价($)"
prop="template_total_price"
header-align="center"
align="center"
min-width="120"
show-overflow-tooltip
/>
<el-table-column
label="工艺总价($)"
prop="craft_total_price"
header-align="center"
align="center"
min-width="120"
show-overflow-tooltip
/>
<el-table-column
label="商品总价($)"
prop="product_total_amount"
header-align="center"
align="center"
min-width="120"
show-overflow-tooltip
/>
<el-table-column
label="运费($)"
prop="order.pay_freight"
header-align="center"
align="center"
min-width="120"
show-overflow-tooltip
></el-table-column>
<el-table-column
label="物流总价($)"
prop="carriage_total_amount"
header-align="center"
align="center"
min-width="120"
show-overflow-tooltip
/>
<el-table-column
label="实付金额($)"
prop="order.actual_amount"
header-align="center"
align="center"
min-width="120"
show-overflow-tooltip
/>
<el-table-column
label="完成时间"
prop="order.finish_time"
header-align="center"
align="center"
min-width="160"
show-overflow-tooltip
></el-table-column>
<el-table-column
label="订单来源"
prop="order.namespace"
header-align="center"
align="center"
min-width="160"
show-overflow-tooltip
></el-table-column>
<el-table-column
label="重量"
prop="order.weight"
header-align="center"
align="center"
min-width="160"
show-overflow-tooltip
></el-table-column>
<el-table-column
label="商品备注"
prop="order.remark"
header-align="center"
align="center"
min-width="160"
show-overflow-tooltip
></el-table-column>
<el-table-column
label="送货方式"
header-align="center"
align="center"
min-width="160"
show-overflow-tooltip
>
<template #default="{ row }">
<span v-if="row.order">{{
row.order.shipment_type == 1 ? '工厂物流' : '自我物流'
}}</span>
</template>
</el-table-column>
<el-table-column
label="物流名称"
prop="order.logistics_way_name"
header-align="center"
align="center"
min-width="160"
show-overflow-tooltip
></el-table-column>
<el-table-column
label="揽收-姓名"
prop="order.receiver_name"
header-align="center"
align="center"
min-width="160"
show-overflow-tooltip
></el-table-column>
<el-table-column
label="揽收-电话"
prop="order.receiver_phone"
header-align="center"
align="center"
min-width="160"
show-overflow-tooltip
></el-table-column>
<el-table-column
label="揽收-国家"
prop="order.receiver_country"
header-align="center"
align="center"
min-width="160"
show-overflow-tooltip
></el-table-column>
<el-table-column
label="揽收-省/州"
prop="order.receiver_province"
header-align="center"
align="center"
min-width="160"
show-overflow-tooltip
></el-table-column>
<el-table-column
label="揽收-邮政编码"
prop="order.receiver_post_code"
header-align="center"
align="center"
min-width="160"
show-overflow-tooltip
></el-table-column>
<el-table-column
label="创建时间"
prop="order.create_time"
header-align="center"
align="center"
min-width="180"
show-overflow-tooltip
></el-table-column>
<el-table-column
v-if="[0, 1].includes(nodeId)"
show-overflow-tooltip
align="center"
fixed="right"
header-align="center"
label="操作"
width="120"
>
<template #default="{ row }">
<div
style="gap: 5px"
class="flex items-center justify-center flex-gap-5"
>
<img
@click="batchUpdate([row], 2)"
src="@/assets/images/edit.png"
width="24"
title="编辑"
style="cursor: pointer"
/>
<img
@click="handleDelete(row.id)"
src="@/assets/images/delete.png"
width="24"
title="删除"
style="cursor: pointer"
/>
<img
@click="getDetails(row)"
src="@/assets/images/view.png"
width="24"
title="查看详情"
style="cursor: pointer"
/>
</div>
</template>
</el-table-column>
</ElTable>
</div>
<ElPagination
v-model:current-page="orderPager.page"
v-model:page-size="orderPager.rows"
:page-sizes="[100, 200, 300, 400, 500]"
background
layout="total, sizes, prev, pager, next, jumper"
:total="orderPager.total"
style="margin: 10px auto 0; text-align: right"
@size-change="handleOrderSizeChange"
@current-change="handleOrderCurrentChange"
></ElPagination>
</el-tab-pane>
<el-tab-pane name="2" label="操作日志">
<ul
style="
color: #333;
font-size: 12px;
height: 100%;
overflow: auto;
"
>
<li
v-for="(item, index) in logList"
:key="index"
style="display: flex"
>
<span style="display: inline-block">
{{ item.create_time }}
</span>
<span style="margin: 0 5px 0 20px">{{
item.employee_account
}}</span>
<span style="display: inline-block">{{
item.description
}}</span>
</li>
</ul>
</el-tab-pane>
</el-tabs>
</template>
</splitDiv>
</div>
</div>
</div>
<DetailView
:order-id="safeOrderId"
:dialog-visible="detailDialogVisible"
@close="detailDialogVisible = false"
@update="detailDialogVisible = $event"
/>
<ElDialog
v-model="confirmOrderVisible"
title="确认对账单"
width="70%"
:close-on-click-modal="false"
>
<el-row>
<el-col :span="6"> 对账单号:{{ currentRow?.rec_number }}</el-col>
<el-col :span="12">
账期(发货时间) {{ currentRow?.start_time }} -
{{ currentRow?.end_time }}
</el-col>
<el-col :span="6">
成本总价($) {{ currentRow?.product_total_amount }}
</el-col>
</el-row>
<el-row style="margin: 10px 0">
<el-col :span="6">
工艺总价($){{ currentRow?.craft_total_amount }}
</el-col>
<el-col :span="6">
物流总价($) {{ currentRow?.carriage_total_amount }}
</el-col>
<el-col :span="6"> 应付金额($){{ currentRow?.total_amount }}</el-col>
<el-col :span="6"> 实付金额($){{ currentRow?.actual_amount }}</el-col>
</el-row>
<el-row style="margin: 10px 0">
<el-col v-if="currentRow?.water_list" :span="6">
水单:
<span
v-for="item in (typeof currentRow?.water_list === 'string'
? currentRow.water_list
: ''
).split(',')"
:key="item"
style="width: 30px"
>
<ImageView :src="item" />
</span>
</el-col>
<el-col :span="6"> 总发货() {{ currentRow?.num }}</el-col>
<el-col :span="6"> 创建时间: {{ currentRow?.create_time }}</el-col>
</el-row>
<div></div>
<ElForm ref="auditFormRef" :model="auditForm" label-width="80px">
<ElFormItem label="驳回原因" prop="description">
<ElInput v-model="auditForm.description" type="textarea" />
</ElFormItem>
</ElForm>
<template #footer>
<span class="dialog-footer">
<!-- <el-button @click="confirmOrderVisible = false">取消</el-button> -->
<el-button type="success" @click="submitConfirmOrder(1)"
>确认</el-button
>
<el-button type="danger" @click="submitConfirmOrder(2)">驳回</el-button>
</span>
</template>
</ElDialog>
<el-dialog
v-model="processPriceDialogVisible"
title="修改工艺价格"
width="50%"
:close-on-click-modal="false"
>
<el-table :data="craftPriceList" border style="width: 100%" height="330px">
<el-table-column
prop="process"
label="工艺简称"
width="260"
align="center"
/>
<el-table-column prop="base_price" label="基础价格($)" align="center">
<template #default="scope">
<el-input
v-model="scope.row.base_price"
placeholder="请输入基础价格"
clearable
oninput="value=value.replace(/[^\-?\d.]/g,'')"
style="width: 100%"
/>
</template>
</el-table-column>
<el-table-column prop="add_price" label="加价($)" align="center">
<template #default="scope">
<el-input
v-model="scope.row.add_price"
placeholder="请输入加价"
clearable
oninput="value=value.replace(/[^\-?\d.]/g,'')"
style="width: 100%"
/>
</template>
</el-table-column>
</el-table>
<template #footer>
<el-button @click="processPriceDialogVisible = false">取消</el-button>
<el-button type="primary" @click="submitPodPrice">确定</el-button>
</template>
</el-dialog>
<el-dialog v-model="batchUpdateVisible" width="1400px" title="批量编辑">
<edit-order :list="updateProductList" />
<template #footer>
<el-button @click="batchUpdateVisible = false">取消</el-button>
<el-button type="primary" @click="batchSave">保存</el-button>
</template>
</el-dialog>
</template>
<script setup lang="ts">
import DetailView from './detail.vue'
import EditOrder from './editOrder.vue'
import { ElMessage, ElTable, ElTree, TableColumnCtx } from 'element-plus'
import splitDiv from '@/components/splitDiv/splitDiv.vue'
import usePageList from '@/utils/hooks/usePageList'
import { useValue } from '@/utils/hooks/useValue'
import BigNumber from 'bignumber.js'
import {
auditOrderApi,
confirmPodOrderApi,
apiRejectionOfReview,
apiSetCraftData,
podUsReconciliation,
podUsReconciliationList,
exportPodUsExcelApi,
getPodUsShipmentDetailsById,
getPodUsLogListApi,
getPodShipmentGetById,
confirmPodUsOrderApi,
updatePodUsCarriageAmount,
getReconciliationById,
batchUpdatePrice,
delPodUsOrderData,
} from '@/api/order'
import { nextTick, onMounted, ref, watch } from 'vue'
import 'element-plus/dist/index.css'
import {
AccountStatementNote,
AccountStatementNoteSearchForm,
CountStatus,
OrderDetails,
ProductDetails,
} from '@/types/api/billOrder'
import { DetailForm, LogListData, IUpdatePrice } from '@/types/api/deliveryNote'
import ImageView from '@/components/ImageView.vue'
interface Tree {
remark?: string
count?: number
code?: number
children?: Tree[]
}
interface SummaryMethodProps<T = AccountStatementNote> {
columns: TableColumnCtx<T>[]
data: T[]
}
const updateProductList = ref<ProductDetails[]>([])
const batchUpdateVisible = ref(false)
const detailDialogVisible = ref(false)
const safeOrderId = ref()
const logList = ref<LogListData[]>([])
// const nameSpaceList = ref<string[]>([])
const treeData = ref<CountStatus[]>()
const [searchForm, resetSearchForm] = useValue<AccountStatementNoteSearchForm>(
{},
)
const dateRange = ref<string[]>([])
const selections = ref<AccountStatementNote[]>([])
const detailSelections = ref<ProductDetails[]>([])
const orderSelections = ref<OrderDetails[]>([])
const detailList = ref<ProductDetails[]>([])
const orderList = ref<OrderDetails[]>([])
const tabsValue = ref<string>('0')
const singleTableRef = ref<InstanceType<typeof ElTable>>()
const currentRow = ref<AccountStatementNote | null>(null)
const batchSave = async () => {
for (const item of updateProductList.value) {
if (!item.craft_price && item.craft_price !== 0)
return ElMessage.warning('请输入工艺价格')
if (!item.template_price && item.craft_price !== 0)
return ElMessage.warning('请输入模板价格')
}
await batchUpdatePrice({
info_id: currentRow.value?.id,
itemList: updateProductList.value.map((el: ProductDetails) => {
return {
id: el.id,
craft_price: el.craft_price,
template_price: el.template_price,
}
}),
})
ElMessage.success('保存成功')
search()
batchUpdateVisible.value = false
await tabsClick()
}
const getDetails = async (row: OrderDetails) => {
console.log(row)
safeOrderId.value = row.order?.id
detailDialogVisible.value = true
}
const batchUpdate = async (
arr: ProductDetails[] | OrderDetails[],
type: 1 | 2,
) => {
if (!arr.length) return ElMessage.warning('请选择数据')
if (type === 1) {
updateProductList.value = JSON.parse(JSON.stringify(arr))
} else if (type === 2) {
const { data } = await getReconciliationById({
ids: arr.map((el) => el.id).join(','),
})
updateProductList.value = data
}
batchUpdateVisible.value = true
}
const getSelectionsProperty = (property: keyof AccountStatementNote) => {
return selections.value
.map((el: AccountStatementNote) => el[property])
.join(',')
}
const handleDetailSizeChange = (size: number) => {
detailPager.value.rows = size
searchDetail()
}
const handleDetailCurrentChange = (size: number) => {
detailPager.value.page = size
searchDetail()
}
const handleOrderSizeChange = (size: number) => {
orderPager.value.rows = size
getUsOrderList()
}
const handleOrderCurrentChange = (size: number) => {
orderPager.value.page = size
getUsOrderList()
}
const nodeId = ref<number>(0)
const treeRef = ref<InstanceType<typeof ElTree>>()
const {
currentPage,
pageSize,
total,
data: tableData,
refresh: search,
onCurrentPageChange: handleCurrentChange,
onPageSizeChange: handleSizeChange,
} = usePageList({
query: (page, pageSize) =>
podUsReconciliationList(
{
...searchForm.value,
status: nodeId.value === -1 ? null : nodeId.value,
startTime: dateRange.value && dateRange.value[0],
endTime: dateRange.value && dateRange.value[1],
},
page,
pageSize,
).then((res) => res.data),
})
watch(
() => tableData.value,
() => {
;(tableData.value as AccountStatementNote[]).forEach((item) => {
item.total_amount = computedPrice(item)
})
},
{ immediate: true, deep: true },
)
const reset = () => {
dateRange.value = []
resetSearchForm()
}
const priceModification = () => {
if (orderSelections.value.length === 0) {
ElMessage.warning('至少选择一条对账单')
return
}
ElMessageBox.prompt('修改物流价格', {
confirmButtonText: '确定',
cancelButtonText: '取消',
inputPattern: /\d+/,
inputErrorMessage: '请输入数字',
}).then(async ({ value }: { value: string }) => {
const price = parseFloat(value)
if (isNaN(price) || price < 0) {
ElMessage.error('价格必须为大于等于0的数字')
return
}
await updatePodUsCarriageAmount({
ids: orderSelections.value.map((item: OrderDetails) => item.id),
carriage_amount: price,
})
ElMessage.success('操作成功')
orderSelections.value = []
search()
await getUsOrderList()
})
}
const getTreeNum = async () => {
try {
const res = await podUsReconciliation()
treeData.value = res.data
await nextTick(() => {
treeRef.value!.setCurrentKey(nodeId.value, true)
})
} catch (e) {
console.error(e)
}
}
const rowClick = (row: AccountStatementNote) => {
if (!row) {
currentRow.value = null
}
currentRow.value = row
tabsClick()
}
const tabsClick = async () => {
if (!currentRow.value) {
detailList.value = []
logList.value = []
return
}
await nextTick()
if (tabsValue.value === '1') {
await getUsOrderList()
} else if (tabsValue.value === '2') {
await getLogList()
} else if (tabsValue.value === '0') {
await searchDetail()
}
}
// 删除
const handleDelete = async (id: string) => {
await ElMessageBox.confirm('确定要删除吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
await delPodUsOrderData([id])
ElMessage.success('删除成功')
await getTreeNum()
search()
}
const computedPrice = (row: AccountStatementNote) => {
return new BigNumber(row.product_total_amount || 0)
.plus(new BigNumber(row.carriage_total_amount || 0))
.plus(new BigNumber(row.craft_total_amount || 0))
.toString()
}
const craftPriceList = ref<IUpdatePrice[]>([])
const processPriceDialogVisible = ref(false)
const submitPodPrice = async () => {
const filteredList = craftPriceList.value.filter(
(item: IUpdatePrice) => item.base_price && item.add_price,
)
if (filteredList.length > 0) {
try {
const res = await apiSetCraftData({
id: currentRow.value?.id,
craftTotalPrice: currentRow.value?.craft_total_amount,
recNumber: currentRow.value?.rec_number,
craftPriceList: filteredList,
})
if (res.code !== 200) return
ElMessage.success('修改成功')
processPriceDialogVisible.value = false
search()
await getTreeNum()
} catch (error) {
console.error(error)
}
} else {
ElMessage.error('至少提交一条数据')
}
}
const handleSelectionChange = (v: AccountStatementNote[]) => {
selections.value = v
}
const handleDetailSelectionChange = (v: ProductDetails[]) => {
detailSelections.value = v
}
const handleOrderSelectionChange = (v: OrderDetails[]) => {
orderSelections.value = v
}
const getSummaries = (param: SummaryMethodProps) => {
const { columns, data } = param
const sums: string[] = []
columns.forEach(
(column: TableColumnCtx<AccountStatementNote>, index: number) => {
if (index === 0) {
sums[index] = '合计'
return
}
const values = data.map((item: AccountStatementNote) => {
return Number(item[column.property as keyof AccountStatementNote])
})
if (!values.every((value: number) => !isNaN(value))) {
return
}
sums[index] = values
.reduce((prev: BigNumber, curr: number) => {
const value = new BigNumber(curr)
return prev.plus(value) // 直接处理 BigNumber 类型
}, new BigNumber(0))
.toString()
},
)
return sums
}
const confirmOrderVisible = ref<boolean>(false)
const auditForm = ref({
description: '',
})
const auditFormRef = ref()
const auditOrder = (key: string) => {
let url = ''
let text = ''
switch (key) {
case 'pay':
url = 'pod/podReconciliation/payment'
text = '确认付款'
break
case 'archive':
url = 'pod/podReconciliation/archiving'
text = '确认归档'
break
}
if (selections.value.length === 0) {
return ElMessage.warning('请选择要操作的数据')
}
ElMessageBox.confirm(`${text}对账单?`, '重要提示', {
confirmButtonText: '确定',
type: 'warning',
}).then(async () => {
const ids = selections.value
.map((el: AccountStatementNote) => el.id)
.join(',')
await auditOrderApi(url, ids)
ElMessage.success('操作成功')
search()
await getTreeNum()
})
}
const rejectOrder = () => {
if (selections.value.length === 0) {
return ElMessage.warning('请选择要操作的数据')
}
ElMessageBox.prompt('请输入驳回原因', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
inputPattern: /.+/,
customClass: 'reject',
inputErrorMessage: '请输入驳回原因',
inputPlaceholder: '驳回原因',
}).then(async ({ value }: { value: string }) => {
const ids = getSelectionsProperty('id')
const recNumbers = getSelectionsProperty('rec_number')
try {
await apiRejectionOfReview({
ids: ids,
description: value,
recNumbers: recNumbers,
})
ElMessage.success('操作成功')
search()
await getTreeNum()
} catch (e) {
console.error(e)
}
})
}
const confirmOrder = async (item: AccountStatementNote) => {
currentRow.value = item
confirmOrderVisible.value = true
}
interface ConfirmOrderPayload {
ids: string
description?: string
pass?: number
}
const submitConfirmOrder = async (type: number) => {
// const ids = selections.value
// .map((el: AccountStatementNote) => el.id)
// .join(',')
let apiPayload: ConfirmOrderPayload = { ids: `${currentRow.value?.id}` }
if (type === 1) {
// 确认操作
await confirmPodUsOrderApi(apiPayload)
} else {
// 驳回操作
try {
await auditFormRef.value?.validate()
} catch {
return // 验证失败,终止操作
}
apiPayload = {
...apiPayload,
description: auditForm.value.description,
pass: 0,
}
await confirmPodOrderApi(apiPayload)
}
confirmOrderVisible.value = false
ElMessage.success('操作成功')
search()
await getTreeNum()
if (singleTableRef.value) {
singleTableRef.value!.setCurrentRow(currentRow.value)
}
}
watch(
() => tableData.value,
() => {
if (tableData.value && tableData.value.length > 0) {
if (singleTableRef.value) {
singleTableRef.value!.setCurrentRow(tableData.value[0])
currentRow.value = (tableData.value as never)[0]
}
} else {
detailList.value = []
}
},
{ immediate: true },
)
const nodeClick = (data: Tree) => {
nodeId.value = data.code || 0
// if (data.code !== 0) {
search()
// }
}
const detailForm = ref({} as DetailForm)
const orderForm = ref({} as DetailForm)
const detailPager = ref({
page: 1,
rows: 100,
total: 0,
})
const orderPager = ref({
page: 1,
rows: 100,
total: 0,
})
const searchDetail = async () => {
try {
detailSelections.value = []
const res = await getPodShipmentGetById({
...detailForm.value,
// startTime: detailForm.value.dateRange && detailForm.value.dateRange[0],
// endTime: detailForm.value.dateRange && detailForm.value.dateRange[1],
currentPage: detailPager.value.page,
pageSize: detailPager.value.rows,
infoId: currentRow.value?.id,
})
detailList.value = res.data.records || []
detailPager.value.total = res.data.total
} catch (e) {
console.error(e)
}
}
const getUsOrderList = async () => {
try {
const res = await getPodUsShipmentDetailsById({
...orderForm.value,
currentPage: orderPager.value.page,
pageSize: orderPager.value.rows,
infoId: currentRow.value?.id,
})
orderList.value = res.data.records || []
orderPager.value.total = res.data.total
} catch (e) {
console.error(e)
}
}
const getLogList = async () => {
try {
const res = await getPodUsLogListApi(currentRow.value?.id)
logList.value = res.data
} catch (e) {
console.error(e)
}
}
const exportExcel = async () => {
if (selections.value.length !== 1) {
return ElMessage.warning('请选择一条数据')
}
const ids = selections.value
.map((el: AccountStatementNote) => el.id)
.join(',')
try {
const res = await exportPodUsExcelApi(ids)
window.open(res.data)
} catch (e) {
console.error(e)
}
}
onMounted(() => {
getTreeNum()
})
</script>
<style lang="scss" scoped>
.img-list {
display: flex;
flex-wrap: wrap;
gap: 10px;
}
.img-item {
font-size: 28px;
color: #8c939d;
width: 58px;
height: 58px;
text-align: center;
border: 1px solid #d9d9d9;
cursor: pointer;
position: relative;
.close-bill {
position: absolute;
font-size: 14px;
top: -8px;
right: -8px;
color: #666;
}
}
.header-filter-form {
:deep(.el-form-item) {
margin-right: 14px;
margin-bottom: 10px;
}
}
$border: solid 1px #ddd;
.send-order-list {
display: grid;
grid-template-columns: 2fr 1fr;
border-left: $border;
border-top: $border;
}
.send-order-column {
padding: 10px 16px;
line-height: 1.5;
}
.send-order-header {
font-weight: bold;
text-align: center;
background-color: #f8f8f9;
}
.send-order-product-item {
display: flex;
justify-content: space-between;
gap: 20px;
&:not(:first-child) {
border-top: $border;
padding: 10px 0;
}
.send-order-prop-list {
flex: 1;
}
}
.send-order-product-image {
width: 100px;
}
.dialog-footer {
display: flex;
justify-content: center;
}
.delivery-note-list {
:deep(.vertical-align-top) {
vertical-align: top;
}
}
.left {
width: 160px;
:deep(.el-tree-node__content) {
height: 30px;
line-height: 30px;
}
:deep(.el-tree-node__label) {
font-size: 13px;
cursor: pointer;
display: inline-block;
width: 100%;
color: black !important;
padding: 3px 7px;
}
:deep(.el-tree-node__expand-icon) {
display: none;
}
:deep(.is-current) {
.tree-node-label,
.tree-node-count {
background-color: #ecf5ff;
color: #409eff !important;
}
.el-tree-node__children {
.tree-node-label,
.tree-node-count {
background-color: transparent !important;
color: black !important;
}
}
}
}
.tree-node {
display: flex;
color: #333;
font-weight: 500;
}
.right {
flex: 1;
flex-shrink: 0;
background: white;
overflow: hidden;
}
::v-deep(.el-tree-node__label) {
font-size: 13px;
color: rgb(96, 98, 102);
cursor: pointer;
}
::v-deep(.el-tree-node__expand-icon) {
display: none;
}
::v-deep(.el-tree-node__label) {
display: inline-block;
width: 100%;
color: black !important;
padding: 3px 7px;
}
::v-deep(.is-current) {
.el-tree-node__label {
background-color: #ecf5ff;
color: #409eff !important;
}
.el-tree-node__children {
.el-tree-node__label {
background-color: transparent !important;
color: black !important;
}
}
}
::v-deep(.splitpanes__pane) {
display: flex;
flex-direction: column;
}
::v-deep(.splitpanes--horizontal > .splitpanes__splitter) {
min-height: 5px;
margin-top: 10px;
}
.draw-line {
width: 100%;
height: 5px;
background: #eff3f6;
}
.btn-list {
margin-bottom: 10px;
}
::v-deep(.el-tree-node) {
cursor: pointer;
margin-bottom: 5px;
}
::v-deep(.el-tree-node__label) {
font-size: 14px;
}
::v-deep(.el-tabs) {
display: flex;
// flex-direction: column;
height: 100%;
.el-tabs__content {
flex: 1;
flex-shrink: 0;
overflow: hidden;
.el-tab-pane {
height: 100%;
display: flex;
flex-direction: column;
overflow: hidden;
}
}
}
.delivery-note-page {
:deep(#top) {
height: 100%;
}
}
::v-deep(.el-form--inline .el-form-item) {
margin-right: 10px;
}
</style>
<script setup lang="ts">
import { ElTable } from 'element-plus'
import usePageList from '@/utils/hooks/usePageList.ts'
import {
getPodShipmentDetailsById,
apiPodUpdatePrice,
apiItemLogList,
} from '@/api/order.ts'
import { useValue } from '@/utils/hooks/useValue.ts'
import { AccountStatementNote, AccountStatementNoteSearchForm } from '@/types/api/billOrder.ts'
import { ref } from 'vue'
import { LogListsData } from '@/types/api/deliveryNote.ts'
const [searchForm, resetSearchForm] = useValue<AccountStatementNoteSearchForm>(
{},
)
const logList = ref<LogListsData[]>([])
const craftPrice = ref<string | undefined>('')
const costPrice = ref<string | undefined>('')
const logDialogVisible = ref<boolean>(false)
const viewTheLog = async (id: number) => {
const res = await apiItemLogList(id)
logList.value = res.data || []
logDialogVisible.value = true
}
const selections = ref<AccountStatementNote[]>([])
const dateRange = ref<string[]>([])
const {
currentPage,
pageSize,
total,
data: tableData,
refresh: search,
onCurrentPageChange: handleCurrentChange,
onPageSizeChange: handleSizeChange,
} = usePageList({
query: (page, pageSize) =>
getPodShipmentDetailsById(
{
...searchForm.value,
page,
pageSize,
startTime: dateRange.value && dateRange.value[0],
endTime: dateRange.value && dateRange.value[1],
},
).then((res) => {
craftPrice.value = res.data?.craftPrice
costPrice.value = res.data?.costPrice
return res.data
}) as never,
})
const handleSelectionChange = (v: AccountStatementNote[]) => {
selections.value = v
}
const reset = () => {
dateRange.value = []
resetSearchForm()
}
const priceModification = (type: 1 | 3 | 4) => {
if (selections.value.length === 0) {
ElMessage.warning('至少选择一条对账单')
return
}
const pricePrompts: Record<1 | 3 | 4, { title: string; param: string }> =
{
1: { title: '修改工厂价格', param: 'costPrice' },
3: { title: '修改工艺价格', param: 'craftPrice' },
4: { title: '修改物流价格', param: 'carriageAmount' },
}
const promptConfig = pricePrompts[type]
if (!promptConfig) {
ElMessage.error('无效的操作类型')
return
}
ElMessageBox.prompt(promptConfig.title, {
confirmButtonText: '确定',
cancelButtonText: '取消',
inputPattern: /\d+/,
inputErrorMessage: '请输入数字',
}).then(async ({ value }) => {
const price = parseFloat(value)
if (isNaN(price) || price < 0) {
ElMessage.error('价格必须为大于等于0的数字')
return
}
await apiPodUpdatePrice({
ids: selections.value.map(item => item.id).join(),
...{ [promptConfig.param]: price },
})
ElMessage.success('操作成功')
selections.value = []
search()
})
}
</script>
<template>
<el-dialog v-model="logDialogVisible" title="操作日志" width="30%">
<ul style="color: #333; font-size: 12px; height: 100%; overflow: auto">
<li v-for="(item, index) in logList" :key="index" style="display: flex">
<span style="display: inline-block; width: 23%">
{{ item.create_time }}
</span>
<div style="display: inline-block; width: 80%">
<span style="word-break: normal"> {{ item.employee_name }}:</span>
<span v-html="item.description"></span>
</div>
</li>
</ul>
</el-dialog>
<div class="delivery-note-page flex-column card h-100 overflow-hidden">
<div class="header-filter-form">
<ElForm :model="searchForm" inline>
<ElFormItem style="margin-right: 10px" label="发货时间">
<el-date-picker
v-model="dateRange"
:default-time="[
new Date(0, 0, 0, 0, 0, 0),
new Date(0, 0, 0, 23, 59, 59),
]"
type="datetimerange"
start-placeholder="开始时间"
end-placeholder="结束时间"
unlink-panels
clearable
style="width: 260px"
format="YYYY-MM-DD HH:mm:ss"
value-format="YYYY-MM-DD HH:mm:ss"
/>
</ElFormItem>
<ElFormItem style="margin-right: 10px" label="发货单号">
<ElInput
v-model="searchForm.shipmentNumber"
clearable
placeholder="发货单号"
style="width: 130px"
/>
</ElFormItem>
<ElFormItem style="margin-right: 10px" label="订单号">
<ElInput
v-model="searchForm.orderNumber"
clearable
placeholder="订单号"
style="width: 130px"
/>
</ElFormItem>
<ElFormItem style="margin-right: 10px" label="生产单号">
<ElInput
v-model="searchForm.subOrderNumber"
clearable
placeholder="生产单号"
style="width: 130px"
/>
</ElFormItem>
<ElFormItem>
<ElButton type="primary" @click="search">查询</ElButton>
</ElFormItem>
<ElFormItem>
<ElButton @click="reset">重置</ElButton>
</ElFormItem>
</ElForm>
</div>
<div class="btn-list" style="margin-bottom: 5px">
<el-button
type="primary"
@click="priceModification(1)"
>修改工厂价格
</el-button
>
<el-button type="warning" @click="priceModification(3)"
>修改工艺价格
</el-button
>
<el-button type="primary" @click="priceModification(4)"
>修改物流价格
</el-button
>
</div>
<div
class="delivery-note-content flex-1 flex-column overflow-hidden"
>
<div class="delivery-note-list flex-1 overflow-hidden">
<ElTable
ref="singleTableRef"
highlight-current-row
:data="tableData"
show-summary
default-expand-all
size="small"
style="width: 100%; height: 100%"
border
@selection-change="handleSelectionChange"
>
<el-table-column
type="selection"
width="70"
header-align="center"
align="center"
/>
<el-table-column
label="序号"
type="index"
width="80"
align="center"
header-align="center"
></el-table-column>
<el-table-column
label="发货单号"
prop="shipment_number"
header-align="center"
align="center"
min-width="160"
show-overflow-tooltip
></el-table-column>
<el-table-column
label="订单号"
prop="factory_order_number"
header-align="center"
align="center"
min-width="160"
show-overflow-tooltip
></el-table-column>
<el-table-column
label="发货数(件)"
prop="shipment_num"
header-align="center"
align="center"
min-width="160"
show-overflow-tooltip
></el-table-column>
<el-table-column
label="工厂价格(¥)"
prop="cost_price"
header-align="center"
align="center"
min-width="160"
show-overflow-tooltip
></el-table-column>
<el-table-column
label="工艺价格(¥)"
prop="craft_price"
header-align="center"
align="center"
min-width="160"
show-overflow-tooltip
></el-table-column>
<el-table-column
label="物流价格(¥)"
prop="carriage_amount"
header-align="center"
align="center"
min-width="160"
show-overflow-tooltip
></el-table-column>
<el-table-column
label="生产单号"
prop="factory_sub_order_number"
header-align="center"
align="center"
min-width="160"
show-overflow-tooltip
></el-table-column>
<el-table-column
label="店铺单号"
prop="shop_number"
header-align="center"
align="center"
min-width="160"
show-overflow-tooltip
></el-table-column>
<el-table-column
label="供应货号"
prop="supplier_item_no"
header-align="center"
align="center"
min-width="160"
show-overflow-tooltip
></el-table-column>
<el-table-column
label="产品名称"
prop="product_name"
header-align="center"
align="center"
min-width="180"
show-overflow-tooltip
></el-table-column>
<el-table-column
label="工厂编码"
prop="factory_code"
header-align="center"
align="center"
width="100"
show-overflow-tooltip
></el-table-column>
<el-table-column
label="订单来源"
prop="namespace"
header-align="center"
align="center"
min-width="160"
show-overflow-tooltip
></el-table-column>
<el-table-column
label="客户"
prop="user_mark"
header-align="center"
align="center"
min-width="160"
show-overflow-tooltip
></el-table-column>
<!-- <el-table-column
label="ERP订单号"
prop="erp_order_number"
header-align="center"
align="center"
min-width="160"
show-overflow-tooltip
></el-table-column>
<el-table-column
label="erp子单号"
prop="erp_sub_order_number"
header-align="center"
align="center"
min-width="160"
show-overflow-tooltip
></el-table-column> -->
<el-table-column
label="baseSKU"
prop="base_sku"
header-align="center"
align="center"
min-width="160"
show-overflow-tooltip
></el-table-column>
<el-table-column
label="变体SKU"
prop="variant_sku"
header-align="center"
align="center"
min-width="160"
show-overflow-tooltip
></el-table-column>
<el-table-column
label="工艺简称"
prop="process"
header-align="center"
align="center"
min-width="160"
show-overflow-tooltip
></el-table-column>
<el-table-column
label="工艺全称"
prop="process_name"
header-align="center"
align="center"
min-width="160"
show-overflow-tooltip
></el-table-column>
<el-table-column
label="重量"
prop="weight"
header-align="center"
align="center"
min-width="160"
show-overflow-tooltip
></el-table-column>
<el-table-column
label="商品备注"
prop="remark"
header-align="center"
align="center"
min-width="160"
show-overflow-tooltip
></el-table-column>
<el-table-column
label="模版类型"
header-align="center"
width="140"
align="center"
show-overflow-tooltip
>
<template #default="{ row }">
{{ row.diy_type == 0 ? '公模' : '私模' }}
</template>
</el-table-column>
<el-table-column
label="设计面数"
prop="face_count"
header-align="center"
align="center"
min-width="160"
show-overflow-tooltip
></el-table-column>
<el-table-column
label="送货方式"
header-align="center"
align="center"
min-width="160"
show-overflow-tooltip
>
<template #default="{ row }">
{{ row.shipping_way == 1 ? '送货上门' : '快递' }}
</template>
</el-table-column
>
<el-table-column
label="运费(¥)"
prop="carriage_amount"
header-align="center"
align="center"
min-width="160"
show-overflow-tooltip
></el-table-column>
<el-table-column
label="物流名称"
prop="carriage_name"
header-align="center"
align="center"
min-width="160"
show-overflow-tooltip
></el-table-column>
<el-table-column
label="物流跟踪号"
prop="logistics_tracking"
header-align="center"
align="center"
min-width="160"
show-overflow-tooltip
></el-table-column>
<el-table-column
label="揽收-姓名"
prop="lanshou_name"
header-align="center"
align="center"
min-width="160"
show-overflow-tooltip
></el-table-column>
<el-table-column
label="揽收-电话"
prop="lanshou_phone"
header-align="center"
align="center"
min-width="160"
show-overflow-tooltip
></el-table-column>
<el-table-column
label="揽收-区域"
prop="lanshou_region"
header-align="center"
align="center"
min-width="160"
show-overflow-tooltip
></el-table-column>
<el-table-column
label="揽收-地址"
prop="lanshou_address"
header-align="center"
align="center"
min-width="160"
show-overflow-tooltip
></el-table-column>
<el-table-column
label="揽收-邮政编码"
prop="lanshou_post"
header-align="center"
align="center"
min-width="160"
show-overflow-tooltip
></el-table-column>
<el-table-column
label="创建时间"
prop="create_time"
header-align="center"
align="center"
min-width="180"
show-overflow-tooltip
></el-table-column>
<!-- <el-table-column
label="付款时间"
prop="payment_time"
header-align="center"
align="center"
min-width="180"
show-overflow-tooltip
></el-table-column>
<el-table-column
label="确认时间"
prop="start_stocking_time"
header-align="center"
align="center"
min-width="180"
show-overflow-tooltip
></el-table-column> -->
<el-table-column
label="更新时间"
prop="update_time"
header-align="center"
align="center"
min-width="180"
show-overflow-tooltip
></el-table-column>
<el-table-column
label="操作"
width="100"
header-align="center"
align="center"
fixed="right"
>
<template #default="{ row }">
<div>
<el-button type="primary" link @click="viewTheLog(row.id)"
>操作日志
</el-button
>
</div>
</template>
</el-table-column>
</ElTable>
</div>
<div class="pagination" style="display: flex;align-items:center;justify-content: center">
<div style="display:flex; position: relative;left: 200px;color: rgb(255, 153, 0);font-weight: bold" class="total-price">
<div style="display:flex;margin-right: 10px" class="total">
<div class="total-title">
工艺总价(¥):
</div>
<div class="total-price">
{{ craftPrice }}元
</div>
</div>
<div style="display:flex;" class="total">
<div class="total-title">
工厂价格(¥):
</div>
<div class="total-price">
{{ costPrice }}元
</div>
</div>
</div>
<ElPagination
v-model:current-page="currentPage"
v-model:page-size="pageSize"
:page-sizes="[100, 200, 300, 400, 500]"
background
layout="total, sizes, prev, pager, next, jumper"
:total="total"
style="margin: 10px auto 0; text-align: right"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
></ElPagination>
</div>
</div>
</div>
</template>
<style scoped lang="scss">
</style>
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