订单列表

master
lzq 2026-02-10 18:19:08 +08:00
parent 8894d0bb48
commit 045d327230
26 changed files with 525 additions and 441 deletions

View File

@ -19,7 +19,7 @@ interface ADetailPanelType<D extends object> {
} }
const component = defineComponent( const component = defineComponent(
<T extends object & { id?: string }, D extends object>(props: ADetailPanelType<D>, {slots, expose}: SetupContext) => { <D extends object>(props: ADetailPanelType<D>, {slots, expose}: SetupContext) => {
const showDialog = ref(false) const showDialog = ref(false)
const loading = ref(false) const loading = ref(false)
@ -28,10 +28,10 @@ const component = defineComponent(
const dialogCloseHandler = () => { const dialogCloseHandler = () => {
detailData.$reset() detailData.$reset()
} }
const open = (data: T) => { const open = (id: string) => {
showDialog.value = true showDialog.value = true
loading.value = true loading.value = true
props.detailsLoader(data.id!) props.detailsLoader(id)
.then(res => { .then(res => {
detailData.$reset((res?.data ?? {}) as any) detailData.$reset((res?.data ?? {}) as any)
}) })
@ -70,8 +70,8 @@ const component = defineComponent(
}, },
) )
export interface ADetailPanelInstance<T extends object & { id?: string }> extends InstanceType<typeof component> { export interface ADetailPanelInstance extends InstanceType<typeof component> {
open: (data: T) => void open: (id: string) => void
} }

View File

@ -623,6 +623,8 @@ const component = defineComponent(
class="data-table" class="data-table"
span-method={props.table.spanMethod} span-method={props.table.spanMethod}
onSort-change={sortChangeHandler} onSort-change={sortChangeHandler}
summary-method={props.table.summaryMethod}
show-summary={props.table.summaryMethod != null}
> >
{ {
slots.columns?.() slots.columns?.()

View File

@ -0,0 +1,24 @@
import type { TableColumnCtx } from 'element-plus'
import type { DefaultRow } from 'element-plus/es/components/table/src/table/defaults'
export interface SummaryMethodProps<T extends object> {
columns: TableColumnCtx<T>[]
data: T[]
}
export type SummariesType<T extends object> = {
[key in keyof T]?: (data: T[]) => string
} & {
[key: string]: (data: T[]) => string
}
export default function buildSummaryMethod<T extends DefaultRow>(summaries: SummariesType<T>) {
return ({columns, data}: SummaryMethodProps<T>) => {
const summary: string[] = [ '合计' ]
for (let i = 1; i < columns.length; i++) {
const column = columns[i]
summary[i] = summaries[column.property]?.(data) ?? ''
}
return summary
}
}

View File

@ -44,7 +44,7 @@
</ElFormItem> </ElFormItem>
</template> </template>
<template #columns> <template #columns>
<ElTableColumn fixed="left" label="订单编号" prop="sn" width="140"/> <ElTableColumn fixed="left" label="订单编号" prop="sn" width="155"/>
<ElTableColumn label="客户姓名" prop="contacts" width="100"/> <ElTableColumn label="客户姓名" prop="contacts" width="100"/>
<ElTableColumn label="客户电话" prop="phone" width="120"/> <ElTableColumn label="客户电话" prop="phone" width="120"/>
<ElTableColumn label="货品名称" prop="goodsName" width="120"/> <ElTableColumn label="货品名称" prop="goodsName" width="120"/>
@ -57,21 +57,38 @@
<ElTableColumn label="运输单位" prop="transOrgName" show-overflow-tooltip width="100"/> <ElTableColumn label="运输单位" prop="transOrgName" show-overflow-tooltip width="100"/>
<ElTableColumn label="运距" prop="transDistance" width="100"> <ElTableColumn label="运距" prop="transDistance" width="100">
<template #default="{row}"> <template #default="{row}">
{{ `${row.transDistance == null ? '' : row.transDistance + ' 公里'}` }} {{ `${row.transDistance == null ? '' : (row.transDistance / 1000) + ' 公里'}` }}
</template> </template>
</ElTableColumn> </ElTableColumn>
<ElTableColumn label="车次" prop="trainNum" width="70"/> <ElTableColumn label="车次" prop="trainNum" width="70"/>
<ElTableColumn label="车牌号" prop="truckLicensePlate" width="120"/> <ElTableColumn label="车牌号" prop="truckLicensePlate" width="120">
<ElTableColumn label="司机姓名" prop="driverName" width="100"/>
<ElTableColumn label="司机电话" prop="driverPhone" width="120"/>
<ElTableColumn label="下单时间" prop="orderTime" width="175"/>
<ElTableColumn fixed="right" label="支付状态" prop="paymentStatusTxt" width="90">
<template #default="{row}"> <template #default="{row}">
<ElTag :data-cs="paymentStatusColor.cs(row.paymentStatus)"> {{ row.paymentStatusTxt }}</ElTag> {{ Strings.isBlank(row.truckLicensePlate) ? '-' : row.truckLicensePlate }}
</template> </template>
</ElTableColumn> </ElTableColumn>
<ElTableColumn fixed="right" label="订单状态" prop="transStatus" width="90"> <ElTableColumn label="司机姓名" prop="driverName" width="100">
<template #default="{row}">
{{ row.driverName ?? '-' }}
</template>
</ElTableColumn>
<ElTableColumn label="司机电话" prop="driverPhone" width="120">
<template #default="{row}">
{{ row.driverPhone ?? '-' }}
</template>
</ElTableColumn>
<ElTableColumn fixed="right" label="总金额" prop="settleMoney" width="80">
<template #default="{row}">
{{ `${row.settleMoney == null ? '' : row.settleMoney + ' 元'}` }}
</template>
</ElTableColumn>
<ElTableColumn label="下单时间" prop="orderTime" width="175"/>
<ElTableColumn fixed="right" label="支付状态" prop="paymentStatusTxt" width="120">
<template #default="{row}">
<ElTag :data-cs="paymentStatusColor.cs(row.paymentStatus,'info')"> {{ row.paymentStatusTxt ?? '暂无支付信息' }}</ElTag>
</template>
</ElTableColumn>
<ElTableColumn fixed="right" label="运输状态" prop="transStatus" width="90">
<template #default="{row}"> <template #default="{row}">
<ElTag :data-cs="transStatusColor.cs(row.transStatus)"> {{ row.transStatusTxt }}</ElTag> <ElTag :data-cs="transStatusColor.cs(row.transStatus)"> {{ row.transStatusTxt }}</ElTag>
</template> </template>
@ -79,7 +96,7 @@
</template> </template>
<BookForm ref="bookForm" :research="research"/> <BookForm ref="bookForm" :research="research"/>
<BookDetail ref="bookDetail"/> <BookDetail ref="bookDetail"/>
<DispatchForm ref="dispatchForm"/> <DispatchForm ref="dispatchForm" @succ="research"/>
</ATablePage> </ATablePage>
</template> </template>
@ -100,9 +117,10 @@ import BookDetail from '@/pages/order/book/BookDetail.vue'
import type { R } from '@/common/utils/http-util.ts' import type { R } from '@/common/utils/http-util.ts'
import DispatchForm from '@/pages/order/book/DispatchForm.vue' import DispatchForm from '@/pages/order/book/DispatchForm.vue'
import OrderApi from '@/pages/order/order-api.ts' import OrderApi from '@/pages/order/order-api.ts'
import Strings from '@/common/utils/strings.ts'
const props = defineProps<{ const props = defineProps<{
defaultOrderCategory: 'XiaoShou' | 'HuiShou' | 'DuanBo' bizType: 'XiaoShou' | 'HuiShou' | 'DuanBo'
}>() }>()
const tablePageIns = useTemplateRef<ATablePageInstance>('tablePage') const tablePageIns = useTemplateRef<ATablePageInstance>('tablePage')
@ -122,7 +140,8 @@ const tablePageProps = buildTablePageProps<OrderTypes.SearchOrderParam, OrderTyp
}, },
searchForm: { searchForm: {
defaultData: { defaultData: {
bizType: props.defaultOrderCategory, bizType: props.bizType,
orderType: 'YuYue',
}, },
highForm: { highForm: {
contentWidth: 342, contentWidth: 342,
@ -143,9 +162,12 @@ const tablePageProps = buildTablePageProps<OrderTypes.SearchOrderParam, OrderTyp
record.transRecodes = undefined record.transRecodes = undefined
for (let i = 0; i < transRecodes.length; i++) { for (let i = 0; i < transRecodes.length; i++) {
const it = transRecodes[i] const it = transRecodes[i]
const settleMoney = it.paymentRecords?.map(it1 => +(it1.settleMoney ?? 0)).reduce((a: number, b: number) => a + b, 0) ?? 0
dataList.push({ dataList.push({
...record, ...record,
...it, ...it,
settleMoney,
orderId: record.id,
rowCount: i === 0 ? transRecodes.length : 0, rowCount: i === 0 ? transRecodes.length : 0,
} as OrderTypes.TableData) } as OrderTypes.TableData)
} }
@ -185,7 +207,6 @@ const tablePageProps = buildTablePageProps<OrderTypes.SearchOrderParam, OrderTyp
icon: 'Postcard', icon: 'Postcard',
type: 'primary', type: 'primary',
action({row}) { action({row}) {
console.log(row)
bookDetailIns.value?.open(row) bookDetailIns.value?.open(row)
}, },
}, },
@ -198,7 +219,7 @@ const tablePageProps = buildTablePageProps<OrderTypes.SearchOrderParam, OrderTyp
icon: 'Position', icon: 'Position',
action({row}) { action({row}) {
dispatchFormIns.value?.open({ dispatchFormIns.value?.open({
orderId: row.id, orderId: row.orderId,
sn: row.sn, sn: row.sn,
transOrgId: row.transOrgId, transOrgId: row.transOrgId,
}) })

View File

@ -44,9 +44,21 @@
<ElDescriptionsItem :span="1"> <ElDescriptionsItem :span="1">
<TransRecode :trans-recodes="detailData.transRecodes" v-bind="transRecodeProps"> <TransRecode :trans-recodes="detailData.transRecodes" v-bind="transRecodeProps">
<ElTableColumn label="车次" prop="trainNum"/> <ElTableColumn label="车次" prop="trainNum"/>
<ElTableColumn label="司机姓名" prop="driverName"/> <ElTableColumn label="司机姓名" prop="driverName">
<ElTableColumn label="司机电话" prop="driverPhone"/> <template #default="{row}">
<ElTableColumn label="车牌号" prop="truckLicensePlate"/> <span> {{ row.driverName ?? '-' }}</span>
</template>
</ElTableColumn>
<ElTableColumn label="司机电话" prop="driverPhone">
<template #default="{row}">
<span> {{ row.driverName ?? '-' }}</span>
</template>
</ElTableColumn>
<ElTableColumn label="车牌号" prop="truckLicensePlate">
<template #default="{row}">
<span> {{ row.truckLicensePlate ?? '-' }}</span>
</template>
</ElTableColumn>
<ElTableColumn fixed="right" label="运输状态" prop="transStatusTxt" width="100"> <ElTableColumn fixed="right" label="运输状态" prop="transStatusTxt" width="100">
<template #default="{row}"> <template #default="{row}">
<ElTag :data-cs="transStatusColor.cs(row.transStatus)"> {{ row.transStatusTxt }}</ElTag> <ElTag :data-cs="transStatusColor.cs(row.transStatus)"> {{ row.transStatusTxt }}</ElTag>
@ -56,7 +68,7 @@
<template #default="{row}"> <template #default="{row}">
<div class="action-btn"> <div class="action-btn">
<ElTooltip content="派单" placement="top"> <ElTooltip content="派单" placement="top">
<ElButton :disabled="!Strings.isBlank(row.driverName)" :icon="elIcons.Position" class="icon-btn" plain type="primary" @click="dispatch(detailData, row.id, row.trainNum)"/> <ElButton :disabled="row.transStatus !== transStatus.DaiPaiDan" :icon="elIcons.Position" class="icon-btn" plain type="primary" @click="dispatch(detailData, row.id, row.trainNum)"/>
</ElTooltip> </ElTooltip>
</div> </div>
</template> </template>
@ -66,8 +78,8 @@
</ElDescriptions> </ElDescriptions>
</template> </template>
<template #footer="detailData"> <template #footer="detailData">
<ElButton :disabled="transRecodeProps.moduleValue.length<1" type="primary" @click="dispatch(detailData)"></ElButton> <ElButton :disabled="transRecodeProps.moduleValue.length < 1 " type="primary" @click="dispatch(detailData)"></ElButton>
<DispatchForm ref="dispatchForm"/> <DispatchForm ref="dispatchForm" @succ="succ"/>
</template> </template>
</ADetailPanel> </ADetailPanel>
</template> </template>
@ -79,14 +91,17 @@ import ADetailPanel, {
} from '@/components/a-detail-panel/ADetailPanel.tsx' } from '@/components/a-detail-panel/ADetailPanel.tsx'
import TransRecode, { buildTransRecodeProps } from '@/pages/order/trans-recode/TransRecode.tsx' import TransRecode, { buildTransRecodeProps } from '@/pages/order/trans-recode/TransRecode.tsx'
import DispatchForm from '@/pages/order/book/DispatchForm.vue' import DispatchForm from '@/pages/order/book/DispatchForm.vue'
import { transStatusColor } from '@/pages/order/constants.ts' import {
transStatus,
transStatusColor,
} from '@/pages/order/constants.ts'
import { elIcons } from '@/common/element/element.ts' import { elIcons } from '@/common/element/element.ts'
import Strings from '@/common/utils/strings.ts' import Strings from '@/common/utils/strings.ts'
import OrderApi from '@/pages/order/order-api.ts' import OrderApi from '@/pages/order/order-api.ts'
const detailPanelIns = useTemplateRef<ADetailPanelInstance<OrderTypes.TableData>>('detailPanel') const detailPanelIns = useTemplateRef<ADetailPanelInstance>('detailPanel')
const dispatchFormIns = useTemplateRef<InstanceType<typeof DispatchForm>>('dispatchForm') const dispatchFormIns = useTemplateRef<InstanceType<typeof DispatchForm>>('dispatchForm')
let orderId = ''
const transRecodeProps = buildTransRecodeProps({ const transRecodeProps = buildTransRecodeProps({
moduleValue: [], moduleValue: [],
selectable: true, selectable: true,
@ -97,7 +112,7 @@ const transRecodeProps = buildTransRecodeProps({
function dispatch(data: OrderTypes.SearchOrderResult, transId?: string, trainNum?: number) { function dispatch(data: OrderTypes.SearchOrderResult, transId?: string, trainNum?: number) {
dispatchFormIns.value?.open({ dispatchFormIns.value?.open({
orderId: data.id, // orderId: data.id,
sn: data.sn, sn: data.sn,
transIds: transId == null ? transRecodeProps.moduleValue : [ transId ], transIds: transId == null ? transRecodeProps.moduleValue : [ transId ],
transOrgId: data.transOrgId, transOrgId: data.transOrgId,
@ -105,14 +120,21 @@ function dispatch(data: OrderTypes.SearchOrderResult, transId?: string, trainNum
}) })
} }
function succ() {
detailPanelIns.value?.open(orderId)
}
const detailPanelProps = buildDetailPanelProps<OrderTypes.SearchOrderResult>({ const detailPanelProps = buildDetailPanelProps<OrderTypes.SearchOrderResult>({
title: '订单详情', title: '订单详情',
width: '80vw', width: '80vw',
detailsLoader: OrderApi.detail, detailsLoader(id) {
return OrderApi.detail(id, 'YuYue')
},
}) })
defineExpose({ defineExpose({
open(data: OrderTypes.TableData) { open(data: OrderTypes.TableData) {
detailPanelIns.value?.open(data) orderId = data.orderId!
detailPanelIns.value?.open(data.orderId!)
}, },
}) })
</script> </script>

View File

@ -14,6 +14,7 @@ let transOrgId = ref<string | undefined>(undefined)
let sn = ref<string | undefined>(undefined) let sn = ref<string | undefined>(undefined)
let trainNum = ref<number | undefined>(undefined) let trainNum = ref<number | undefined>(undefined)
const emits = defineEmits([ 'succ' ])
const formPanelProps = buildFormPanelProps<OrderTypes.DispatchParam>({ const formPanelProps = buildFormPanelProps<OrderTypes.DispatchParam>({
title: '派单', title: '派单',
labelWidth: '0', labelWidth: '0',
@ -21,12 +22,14 @@ const formPanelProps = buildFormPanelProps<OrderTypes.DispatchParam>({
return Promise.resolve({}) return Promise.resolve({})
}, },
doSubmit(data) { doSubmit(data) {
return OrderApi.dispatch({ return OrderApi.assignmentDriver({
orderId: orderId!, orderId: orderId,
transIds: transIds!, orderTransId: transIds,
driverId: data.driverId, driverId: data.driverId,
}) })
.then(() => true) .then(() => {
emits('succ')
})
}, },
rules: () => { rules: () => {
return { return {

View File

@ -3,7 +3,7 @@ import Book from '@/pages/order/book/Book.vue'
</script> </script>
<template> <template>
<Book default-order-category="XiaoShou"/> <Book biz-type="XiaoShou"/>
</template> </template>
<style lang="stylus" scoped> <style lang="stylus" scoped>

View File

@ -3,7 +3,7 @@ import Book from '@/pages/order/book/Book.vue'
</script> </script>
<template> <template>
<Book default-order-category="HuiShou"/> <Book biz-type="HuiShou"/>
</template> </template>
<style lang="stylus" scoped> <style lang="stylus" scoped>

View File

@ -36,10 +36,10 @@
</ElFormItem> </ElFormItem>
</template> </template>
<template #columns> <template #columns>
<ElTableColumn fixed="left" label="订单编号" prop="sn" width="140"/> <ElTableColumn fixed="left" label="订单编号" prop="sn" width="155"/>
<!-- <ElTableColumn label="下单时间" prop="orderTime"/> --> <ElTableColumn label="下单时间" prop="orderTime"/>
<!-- <ElTableColumn label="客户姓名" prop="contacts"/> --> <ElTableColumn label="客户姓名" prop="contacts"/>
<!-- <ElTableColumn label="联系方式" prop="phone"/> --> <ElTableColumn label="联系方式" prop="phone"/>
<ElTableColumn label="货品名称" prop="goodsName"/> <ElTableColumn label="货品名称" prop="goodsName"/>
<!-- <ElTableColumn label="项目名称" show-overflow-tooltip width="100"> <!-- <ElTableColumn label="项目名称" show-overflow-tooltip width="100">
@ -56,7 +56,7 @@
<!-- <ElTableColumn label="司机姓名" prop="driverName"/> --> <!-- <ElTableColumn label="司机姓名" prop="driverName"/> -->
<!-- <ElTableColumn label="司机电话" prop="driverPhone"/> --> <!-- <ElTableColumn label="司机电话" prop="driverPhone"/> -->
<ElTableColumn label="毛重" prop="roughWeight"> <!-- <ElTableColumn label="毛重" prop="roughWeight">
<template #default="{row}"> <template #default="{row}">
{{ `${row.roughWeight == null ? '' : row.roughWeight + ' 吨'}` }} {{ `${row.roughWeight == null ? '' : row.roughWeight + ' 吨'}` }}
</template> </template>
@ -70,16 +70,16 @@
<template #default="{row}"> <template #default="{row}">
{{ `${row.settleWeight == null ? '' : row.settleWeight + ' 吨'}` }} {{ `${row.settleWeight == null ? '' : row.settleWeight + ' 吨'}` }}
</template> </template>
</ElTableColumn> </ElTableColumn> -->
<ElTableColumn label="进场时间" prop="inTime" width="175"/> <!-- <ElTableColumn label="进场时间" prop="inTime" width="175"/> -->
<!-- <ElTableColumn label="开始运输时间" prop="transTime"/> --> <!-- <ElTableColumn label="开始运输时间" prop="transTime"/> -->
<ElTableColumn label="出场时间" prop="outTime" width="175"/> <!-- <ElTableColumn label="出场时间" prop="outTime" width="175"/> -->
<!-- <ElTableColumn label="完结时间" prop="finishTime"/> --> <!-- <ElTableColumn label="完结时间" prop="finishTime"/> -->
<ElTableColumn fixed="right" label="支付状态" prop="paymentStatusTxt" width="90"> <!-- <ElTableColumn fixed="right" label="支付状态" prop="paymentStatusTxt" width="120">
<template #default="{row}"> <template #default="{row}">
<ElTag :data-cs="paymentStatusColor.cs(row.paymentStatus)"> {{ row.paymentStatusTxt }}</ElTag> <ElTag :data-cs="paymentStatusColor.cs(row.paymentStatus,'info')"> {{ row.paymentStatusTxt ?? '暂无支付信息' }}</ElTag>
</template> </template>
</ElTableColumn> </ElTableColumn>-->
<ElTableColumn fixed="right" label="勘料状态" prop="checkStatusTxt" width="90"> <ElTableColumn fixed="right" label="勘料状态" prop="checkStatusTxt" width="90">
<template #default="{row}"> <template #default="{row}">
<ElTag :data-cs="checkStatusColor.cs(row.checkStatus)"> {{ row.checkStatusTxt }}</ElTag> <ElTag :data-cs="checkStatusColor.cs(row.checkStatus)"> {{ row.checkStatusTxt }}</ElTag>
@ -105,16 +105,16 @@ import ATablePage, {
} from '@/components/a-page/a-table-page/ATablePage.tsx' } from '@/components/a-page/a-table-page/ATablePage.tsx'
import { import {
checkStatusColor, checkStatusColor,
paymentStatusColor,
transStatusColor, transStatusColor,
} from '@/pages/order/constants.ts' } from '@/pages/order/constants.ts'
import { useTemplateRef } from 'vue' import { useTemplateRef } from 'vue'
import type { R } from '@/common/utils/http-util.ts' import type { R } from '@/common/utils/http-util.ts'
import HistoryDetail from '@/pages/order/history/HistoryDetail.vue' import HistoryDetail from '@/pages/order/history/HistoryDetail.vue'
import CancelDetail from '@/pages/order/cancel/CancelDetail.vue' import CancelDetail from '@/pages/order/cancel/CancelDetail.vue'
import OrderApi from '@/pages/order/order-api.ts'
const props = defineProps<{ const props = defineProps<{
defaultOrderCategory: 'XiaoShou' | 'HuiShou' | 'DuanBo' bizType: 'XiaoShou' | 'HuiShou' | 'DuanBo'
}>() }>()
const tablePageIns = useTemplateRef<ATablePageInstance>('tablePage') const tablePageIns = useTemplateRef<ATablePageInstance>('tablePage')
const cancelDetailIns = useTemplateRef<InstanceType<typeof HistoryDetail>>('cancelDetail') const cancelDetailIns = useTemplateRef<InstanceType<typeof HistoryDetail>>('cancelDetail')
@ -132,12 +132,13 @@ const tablePageProps = buildTablePageProps<OrderTypes.SearchOrderParam, OrderTyp
}, },
searchForm: { searchForm: {
defaultData: { defaultData: {
orderCategory: props.defaultOrderCategory, bizType: props.bizType,
orderType: 'QuXiao',
}, },
highForm: { highForm: {
contentWidth: 342, contentWidth: 342,
}, },
/* paging(param: OrderTypes.SearchOrderParam) { paging(param: OrderTypes.SearchOrderParam) {
return OrderApi.paging(param) return OrderApi.paging(param)
.then(res => { .then(res => {
const records = res.data.records const records = res.data.records
@ -151,93 +152,13 @@ const tablePageProps = buildTablePageProps<OrderTypes.SearchOrderParam, OrderTyp
dataList.push({ dataList.push({
...record, ...record,
...it, ...it,
orderId: record.id,
rowCount: i === 0 ? transRecodes.length : 0, rowCount: i === 0 ? transRecodes.length : 0,
} as OrderTypes.TableData) } as OrderTypes.TableData)
} }
} }
return res as R<G.PageResult<OrderTypes.TableData>> return res as R<G.PageResult<OrderTypes.TableData>>
}) })
}, */
paging(param: OrderTypes.SearchOrderParam) {
return Promise.resolve({
code: 200,
data: {
current: param.current,
size: param.size,
total: 100,
records: [
{
rowCount: 3,
id: '123',
sn: '202308240001',
orderTime: '2023-08-24 10:00:00',
contacts: '张三',
phone: '13800000000',
projectName: '项目A',
stationName: '站点B',
goodsName: '商品X',
unit: '吨',
customerMemo: '客户备注',
estimatedQuantity: 100,
estimatedTrainNum: 2,
transDistance: 500,
orderCategoryTxt: '订单类型A',
transStatusTxt: '已进场',
transStatus: 'YiJinChang',
checkStatus: 'YiKanLiao',
checkStatusTxt: '未勘料',
paymentStatusTxt: '未支付',
truckLicensePlate: '苏A9B905',
},
{
rowCount: 0,
id: '123',
sn: '202308240001',
orderTime: '2023-08-24 10:00:00',
contacts: '张三',
phone: '13800000000',
projectName: '项目A',
stationName: '站点B',
goodsName: '商品X',
unit: '吨',
customerMemo: '客户备注',
estimatedQuantity: 100,
estimatedTrainNum: 2,
transDistance: 500,
orderCategoryTxt: '订单类型A',
transStatusTxt: '运输中',
transStatus: 'YunShuZhong',
checkStatus: 'WeiKanLiao',
checkStatusTxt: '未勘料',
paymentStatusTxt: '未支付',
truckLicensePlate: '苏A9B905',
},
{
rowCount: 0,
id: '123',
sn: '202308240001',
orderTime: '2023-08-24 10:00:00',
contacts: '张三',
phone: '13800000000',
projectName: '项目A',
stationName: '站点B',
goodsName: '商品X',
unit: '吨',
customerMemo: '客户备注',
estimatedQuantity: 100,
estimatedTrainNum: 2,
transDistance: 500,
orderCategoryTxt: '订单类型A',
transStatusTxt: '已进场',
transStatus: 'YiJinChang',
checkStatus: 'WeiKanLiao',
checkStatusTxt: '未勘料',
paymentStatusTxt: '未支付',
truckLicensePlate: '苏A9B905',
},
] as OrderTypes.TableData[],
},
} as R<G.PageResult<OrderTypes.TableData>>)
}, },
}, },
table: { table: {

View File

@ -72,9 +72,9 @@
{{ `${row.settleMoney == null ? '' : '¥:' + row.settleMoney + '元'}` }} {{ `${row.settleMoney == null ? '' : '¥:' + row.settleMoney + '元'}` }}
</template> </template>
</ElTableColumn> </ElTableColumn>
<ElTableColumn fixed="right" label="支付状态" prop="paymentStatusTxt" width="90"> <ElTableColumn fixed="right" label="支付状态" prop="paymentStatusTxt" width="120">
<template #default="{row}"> <template #default="{row}">
<ElTag :data-cs="paymentStatusColor.cs(row.paymentStatus)"> {{ row.paymentStatusTxt }}</ElTag> <ElTag :data-cs="paymentStatusColor.cs(row.paymentStatus,'info')"> {{ row.paymentStatusTxt ?? '暂无支付信息' }}</ElTag>
</template> </template>
</ElTableColumn> </ElTableColumn>
<ElTableColumn fixed="right" label="勘料状态" prop="checkStatusTxt" width="90"> <ElTableColumn fixed="right" label="勘料状态" prop="checkStatusTxt" width="90">
@ -132,14 +132,16 @@ import Strings from '@/common/utils/strings.ts'
import AIcon from '@/components/a-icon/AIcon.vue' import AIcon from '@/components/a-icon/AIcon.vue'
import OrderApi from '@/pages/order/order-api.ts' import OrderApi from '@/pages/order/order-api.ts'
const detailPanelIns = useTemplateRef<ADetailPanelInstance<OrderTypes.TableData>>('detailPanel') const detailPanelIns = useTemplateRef<ADetailPanelInstance>('detailPanel')
const transRecodeProps = buildTransRecodeProps({}) const transRecodeProps = buildTransRecodeProps({})
const detailPanelProps = buildDetailPanelProps<OrderTypes.SearchOrderResult>({ const detailPanelProps = buildDetailPanelProps<OrderTypes.SearchOrderResult>({
title: '订单详情', title: '订单详情',
width: '80vw', width: '80vw',
detailsLoader: OrderApi.detail, detailsLoader(id) {
return OrderApi.detail(id, 'QuXiao')
},
}) })
@ -158,7 +160,7 @@ function kanliao(data: OrderTypes.TransRecode) {
defineExpose({ defineExpose({
open(data: OrderTypes.TableData) { open(data: OrderTypes.TableData) {
detailPanelIns.value?.open(data) detailPanelIns.value?.open(data.orderId!)
}, },
}) })
</script> </script>

View File

@ -3,7 +3,7 @@ import Cancel from '@/pages/order/cancel/Cancel.vue'
</script> </script>
<template> <template>
<Cancel default-order-category="XiaoShou"/> <Cancel biz-type="XiaoShou"/>
</template> </template>
<style lang="stylus" scoped> <style lang="stylus" scoped>

View File

@ -3,7 +3,7 @@ import Cancel from '@/pages/order/cancel/Cancel.vue'
</script> </script>
<template> <template>
<Cancel default-order-category="HuiShou"/> <Cancel biz-type="HuiShou"/>
</template> </template>
<style lang="stylus" scoped> <style lang="stylus" scoped>

View File

@ -1,5 +1,6 @@
import { createEnum } from '@/common/utils/enums.ts' import { createEnum } from '@/common/utils/enums.ts'
import type { ColorSchemeType } from '@/common/utils/color-schemes.ts' import type { ColorSchemeType } from '@/common/utils/color-schemes.ts'
import buildSummaryMethod, { type SummariesType } from '@/components/a-page/a-table-page/build-summary-method.ts'
const orderCategoryList = [ const orderCategoryList = [
{ {
@ -165,3 +166,27 @@ export const paymentStatusColor: {
return defaultColorScheme return defaultColorScheme
}, },
} }
export const summaries: SummariesType<any> = {
roughWeight(data) {
const summaryResult = data.map(it => +(it.roughWeight ?? 0)).reduce((a, b) => (a + b), 0)
return summaryResult == null ? '-' : (summaryResult / 1000) + ' 吨'
},
tareWeight(data) {
const summaryResult = data.map(it => +(it.tareWeight ?? 0)).reduce((a, b) => (a + b), 0)
return summaryResult == null ? '-' : (summaryResult / 1000) + ' 吨'
},
settleWeight(data) {
const summaryResult = data.map(it => +(it.settleWeight ?? 0)).reduce((a, b) => (a + b), 0)
return summaryResult == null ? '-' : (summaryResult / 1000) + ' 吨'
},
settleMoney(data) {
const summaryResult = data
.map(it => it
.paymentRecords?.map((it1: any) => +(it1.settleMoney ?? 0))
.reduce((a: number, b: number) => (a + b), 0) ?? 0,
).reduce((a, b) => (a + b), 0)
return summaryResult == null ? '-' : summaryResult + ' 元'
},
}
export const summaryMethod = buildSummaryMethod(summaries)

View File

@ -36,12 +36,16 @@
</ElFormItem> </ElFormItem>
</template> </template>
<template #columns> <template #columns>
<ElTableColumn fixed="left" label="订单编号" prop="sn" width="140"/> <ElTableColumn fixed="left" label="订单编号" prop="sn" width="155"/>
<!-- <ElTableColumn label="下单时间" prop="orderTime"/> --> <!-- <ElTableColumn label="下单时间" prop="orderTime"/> -->
<!-- <ElTableColumn label="客户姓名" prop="contacts"/> --> <!-- <ElTableColumn label="客户姓名" prop="contacts"/> -->
<!-- <ElTableColumn label="联系方式" prop="phone"/> --> <!-- <ElTableColumn label="联系方式" prop="phone"/> -->
<ElTableColumn label="货品名称" prop="goodsName"/> <ElTableColumn label="货品名称" prop="goodsName" width="120"/>
<ElTableColumn label="运距" prop="transDistance" width="100">
<template #default="{row}">
{{ `${row.transDistance == null ? '' : (row.transDistance / 1000) + ' 公里'}` }}
</template>
</ElTableColumn>
<!-- <ElTableColumn label="项目名称" show-overflow-tooltip width="100"> <!-- <ElTableColumn label="项目名称" show-overflow-tooltip width="100">
<template #default="{row}"> <template #default="{row}">
{{ row.projectName ?? '-' }} {{ row.projectName ?? '-' }}
@ -56,28 +60,33 @@
<!-- <ElTableColumn label="司机姓名" prop="driverName"/> --> <!-- <ElTableColumn label="司机姓名" prop="driverName"/> -->
<!-- <ElTableColumn label="司机电话" prop="driverPhone"/> --> <!-- <ElTableColumn label="司机电话" prop="driverPhone"/> -->
<ElTableColumn label="毛重" prop="roughWeight"> <ElTableColumn label="毛重" prop="roughWeight" width="80">
<template #default="{row}"> <template #default="{row}">
{{ `${row.roughWeight == null ? '' : row.roughWeight + ' 吨'}` }} {{ `${row.roughWeight == null ? '' : (row.roughWeight / 1000) + ' 吨'}` }}
</template> </template>
</ElTableColumn> </ElTableColumn>
<ElTableColumn label="皮重" prop="tareWeight"> <ElTableColumn label="皮重" prop="tareWeight" width="80">
<template #default="{row}"> <template #default="{row}">
{{ `${row.tareWeight == null ? '' : row.tareWeight + ' 吨'}` }} {{ `${row.tareWeight == null ? '' : (row.tareWeight / 1000) + ' 吨'}` }}
</template> </template>
</ElTableColumn> </ElTableColumn>
<ElTableColumn label="净重" prop="settleWeight"> <ElTableColumn label="净重" prop="settleWeight" width="80">
<template #default="{row}"> <template #default="{row}">
{{ `${row.settleWeight == null ? '' : row.settleWeight + ' 吨'}` }} {{ `${row.settleWeight == null ? '' : (row.settleWeight / 1000) + ' 吨'}` }}
</template> </template>
</ElTableColumn> </ElTableColumn>
<ElTableColumn label="进场时间" prop="inTime" width="175"/> <ElTableColumn label="进场时间" prop="inTime" width="175"/>
<!-- <ElTableColumn label="开始运输时间" prop="transTime"/> --> <!-- <ElTableColumn label="开始运输时间" prop="transTime"/> -->
<ElTableColumn label="出场时间" prop="outTime" width="175"/> <ElTableColumn label="出场时间" prop="outTime" width="175"/>
<!-- <ElTableColumn label="完结时间" prop="finishTime"/> --> <!-- <ElTableColumn label="完结时间" prop="finishTime"/> -->
<ElTableColumn fixed="right" label="支付状态" prop="paymentStatusTxt" width="90"> <ElTableColumn fixed="right" label="总金额" prop="settleMoney" width="80">
<template #default="{row}"> <template #default="{row}">
<ElTag :data-cs="paymentStatusColor.cs(row.paymentStatus)"> {{ row.paymentStatusTxt }}</ElTag> {{ `${row.settleMoney == null ? '' : row.settleMoney + ' 元'}` }}
</template>
</ElTableColumn>
<ElTableColumn fixed="right" label="支付状态" prop="paymentStatusTxt" width="120">
<template #default="{row}">
<ElTag :data-cs="paymentStatusColor.cs(row.paymentStatus,'info')"> {{ row.paymentStatusTxt ?? '暂无支付信息' }}</ElTag>
</template> </template>
</ElTableColumn> </ElTableColumn>
<ElTableColumn fixed="right" label="勘料状态" prop="checkStatusTxt" width="90"> <ElTableColumn fixed="right" label="勘料状态" prop="checkStatusTxt" width="90">
@ -106,14 +115,16 @@ import ATablePage, {
import { import {
checkStatusColor, checkStatusColor,
paymentStatusColor, paymentStatusColor,
summaryMethod,
transStatusColor, transStatusColor,
} from '@/pages/order/constants.ts' } from '@/pages/order/constants.ts'
import { useTemplateRef } from 'vue' import { useTemplateRef } from 'vue'
import type { R } from '@/common/utils/http-util.ts' import type { R } from '@/common/utils/http-util.ts'
import HistoryDetail from '@/pages/order/history/HistoryDetail.vue' import HistoryDetail from '@/pages/order/history/HistoryDetail.vue'
import OrderApi from '@/pages/order/order-api.ts'
const props = defineProps<{ const props = defineProps<{
defaultOrderCategory: 'XiaoShou' | 'HuiShou' | 'DuanBo' bizType: 'XiaoShou' | 'HuiShou' | 'DuanBo'
}>() }>()
const tablePageIns = useTemplateRef<ATablePageInstance>('tablePage') const tablePageIns = useTemplateRef<ATablePageInstance>('tablePage')
const historyDetailIns = useTemplateRef<InstanceType<typeof HistoryDetail>>('historyDetail') const historyDetailIns = useTemplateRef<InstanceType<typeof HistoryDetail>>('historyDetail')
@ -131,12 +142,13 @@ const tablePageProps = buildTablePageProps<OrderTypes.SearchOrderParam, OrderTyp
}, },
searchForm: { searchForm: {
defaultData: { defaultData: {
orderCategory: props.defaultOrderCategory, bizType: props.bizType,
orderType: 'LiShi',
}, },
highForm: { highForm: {
contentWidth: 342, contentWidth: 342,
}, },
/* paging(param: OrderTypes.SearchOrderParam) { paging(param: OrderTypes.SearchOrderParam) {
return OrderApi.paging(param) return OrderApi.paging(param)
.then(res => { .then(res => {
const records = res.data.records const records = res.data.records
@ -147,96 +159,18 @@ const tablePageProps = buildTablePageProps<OrderTypes.SearchOrderParam, OrderTyp
record.transRecodes = undefined record.transRecodes = undefined
for (let i = 0; i < transRecodes.length; i++) { for (let i = 0; i < transRecodes.length; i++) {
const it = transRecodes[i] const it = transRecodes[i]
const settleMoney = it.paymentRecords?.map(it1 => +(it1.settleMoney ?? 0)).reduce((a: number, b: number) => a + b, 0) ?? 0
dataList.push({ dataList.push({
...record, ...record,
...it, ...it,
settleMoney,
orderId: record.id,
rowCount: i === 0 ? transRecodes.length : 0, rowCount: i === 0 ? transRecodes.length : 0,
} as OrderTypes.TableData) } as OrderTypes.TableData)
} }
} }
return res as R<G.PageResult<OrderTypes.TableData>> return res as R<G.PageResult<OrderTypes.TableData>>
}) })
}, */
paging(param: OrderTypes.SearchOrderParam) {
return Promise.resolve({
code: 200,
data: {
current: param.current,
size: param.size,
total: 100,
records: [
{
rowCount: 3,
id: '123',
sn: '202308240001',
orderTime: '2023-08-24 10:00:00',
contacts: '张三',
phone: '13800000000',
projectName: '项目A',
stationName: '站点B',
goodsName: '商品X',
unit: '吨',
customerMemo: '客户备注',
estimatedQuantity: 100,
estimatedTrainNum: 2,
transDistance: 500,
orderCategoryTxt: '订单类型A',
transStatusTxt: '已进场',
transStatus: 'YiJinChang',
checkStatus: 'YiKanLiao',
checkStatusTxt: '未勘料',
paymentStatusTxt: '未支付',
truckLicensePlate: '苏A9B905',
},
{
rowCount: 0,
id: '123',
sn: '202308240001',
orderTime: '2023-08-24 10:00:00',
contacts: '张三',
phone: '13800000000',
projectName: '项目A',
stationName: '站点B',
goodsName: '商品X',
unit: '吨',
customerMemo: '客户备注',
estimatedQuantity: 100,
estimatedTrainNum: 2,
transDistance: 500,
orderCategoryTxt: '订单类型A',
transStatusTxt: '运输中',
transStatus: 'YunShuZhong',
checkStatus: 'WeiKanLiao',
checkStatusTxt: '未勘料',
paymentStatusTxt: '未支付',
truckLicensePlate: '苏A9B905',
},
{
rowCount: 0,
id: '123',
sn: '202308240001',
orderTime: '2023-08-24 10:00:00',
contacts: '张三',
phone: '13800000000',
projectName: '项目A',
stationName: '站点B',
goodsName: '商品X',
unit: '吨',
customerMemo: '客户备注',
estimatedQuantity: 100,
estimatedTrainNum: 2,
transDistance: 500,
orderCategoryTxt: '订单类型A',
transStatusTxt: '已进场',
transStatus: 'YiJinChang',
checkStatus: 'WeiKanLiao',
checkStatusTxt: '未勘料',
paymentStatusTxt: '未支付',
truckLicensePlate: '苏A9B905',
},
] as OrderTypes.TableData[],
},
} as R<G.PageResult<OrderTypes.TableData>>)
}, },
}, },
table: { table: {
@ -252,8 +186,9 @@ const tablePageProps = buildTablePageProps<OrderTypes.SearchOrderParam, OrderTyp
colspan: 1, colspan: 1,
} }
}, },
summaryMethod,
actionColumn: { actionColumn: {
width: 150, width: 140,
tableActions: [ tableActions: [
{ {
tooltip: '详情', tooltip: '详情',

View File

@ -72,9 +72,9 @@
{{ `${row.settleMoney == null ? '' : '¥:' + row.settleMoney + '元'}` }} {{ `${row.settleMoney == null ? '' : '¥:' + row.settleMoney + '元'}` }}
</template> </template>
</ElTableColumn> </ElTableColumn>
<ElTableColumn fixed="right" label="支付状态" prop="paymentStatusTxt" width="90"> <ElTableColumn fixed="right" label="支付状态" prop="paymentStatusTxt" width="120">
<template #default="{row}"> <template #default="{row}">
<ElTag :data-cs="paymentStatusColor.cs(row.paymentStatus)"> {{ row.paymentStatusTxt }}</ElTag> <ElTag :data-cs="paymentStatusColor.cs(row.paymentStatus,'info')"> {{ row.paymentStatusTxt ?? '暂无支付信息' }}</ElTag>
</template> </template>
</ElTableColumn> </ElTableColumn>
<ElTableColumn fixed="right" label="勘料状态" prop="checkStatusTxt" width="90"> <ElTableColumn fixed="right" label="勘料状态" prop="checkStatusTxt" width="90">
@ -132,14 +132,17 @@ import Strings from '@/common/utils/strings.ts'
import AIcon from '@/components/a-icon/AIcon.vue' import AIcon from '@/components/a-icon/AIcon.vue'
import OrderApi from '@/pages/order/order-api.ts' import OrderApi from '@/pages/order/order-api.ts'
const detailPanelIns = useTemplateRef<ADetailPanelInstance<OrderTypes.TableData>>('detailPanel') const detailPanelIns = useTemplateRef<ADetailPanelInstance>('detailPanel')
const transRecodeProps = buildTransRecodeProps({
const transRecodeProps = buildTransRecodeProps({}) enableSummary: true,
})
const detailPanelProps = buildDetailPanelProps<OrderTypes.SearchOrderResult>({ const detailPanelProps = buildDetailPanelProps<OrderTypes.SearchOrderResult>({
title: '订单详情', title: '订单详情',
width: '80vw', width: '80vw',
detailsLoader: OrderApi.detail, detailsLoader(id) {
return OrderApi.detail(id, 'LiShi')
},
}) })
@ -158,7 +161,7 @@ function kanliao(data: OrderTypes.TransRecode) {
defineExpose({ defineExpose({
open(data: OrderTypes.TableData) { open(data: OrderTypes.TableData) {
detailPanelIns.value?.open(data) detailPanelIns.value?.open(data.orderId!)
}, },
}) })
</script> </script>

View File

@ -3,7 +3,7 @@ import History from '@/pages/order/history/History.vue'
</script> </script>
<template> <template>
<History default-order-category="XiaoShou"/> <History biz-type="XiaoShou"/>
</template> </template>
<style lang="stylus" scoped> <style lang="stylus" scoped>

View File

@ -3,7 +3,7 @@ import History from '@/pages/order/history/History.vue'
</script> </script>
<template> <template>
<History default-order-category="HuiShou"/> <History biz-type="HuiShou"/>
</template> </template>
<style lang="stylus" scoped> <style lang="stylus" scoped>

View File

@ -5,27 +5,39 @@ import {
export default { export default {
paging(data: OrderTypes.SearchOrderParam) { paging(data: OrderTypes.SearchOrderParam) {
return get<G.PageResult<OrderTypes.SearchOrderResult>>("/order/paging", data); return get<G.PageResult<OrderTypes.SearchOrderResult>>('/order/paging', data)
}, },
detail(id: string) { detail(id: string, orderType?: 'YuYue' | 'ShiShi' | 'LiShi' | 'QuXiao') {
return get<OrderTypes.SearchOrderResult>("/order/detail", { id }); return get<OrderTypes.SearchOrderResult>('/order/detail', {id, orderType})
}, },
add(data: OrderTypes.AddOrderParam) { add(data: OrderTypes.AddOrderParam) {
return post("/order/add", data); return post('/order/add', data)
}, },
modify(data: OrderTypes.ModifyOrderParam) { modify(data: OrderTypes.ModifyOrderParam) {
return post("/order/modify", data); return post('/order/modify', data)
}, },
del(ids: string[]) { del(ids: string[]) {
return post("/order/del", ids); return post('/order/del', ids)
}, },
dispatch(data: OrderTypes.DispatchParam) { dispatch(data: OrderTypes.DispatchParam) {
return post('/order/dispatch', data) return post('/order/dispatch', data)
}, },
assignmentOrg(data: any) { assignmentOrg(data: any) {
return post("/order/assignmentOrg", data); return post('/order/assignmentOrg', data)
}, },
orderTrans(data: OrderTypes.SearchOrderParam) { orderTrans(data: OrderTypes.SearchOrderParam) {
return get<G.PageResult<OrderTypes.SearchOrderResult>>("/order_trans/paging", data); return get<G.PageResult<OrderTypes.SearchOrderResult>>('/order_trans/paging', data)
}, },
}; assignmentDriver(data: OrderTypes.AssignmentDriver) {
return post('/order/assignmentDriver', data)
},
truckComing(data: OrderTypes.TruckComingLeavingParam) {
return post('/order/truck_coming', data)
},
truckLeaving(data: OrderTypes.TruckComingLeavingParam) {
return post('/order/truck_leaving', data)
},
check(data: OrderTypes.CheckParam) {
return post('/order/check', data)
},
}

View File

@ -248,6 +248,7 @@ declare global {
rowCount: number rowCount: number
// Id // Id
id?: string id?: string
orderId?: string
// 订单编号 // 订单编号
sn?: string sn?: string
// 下单时间 // 下单时间
@ -408,5 +409,24 @@ declare global {
// 是否删除; 0-->未删除、1-->已删除 // 是否删除; 0-->未删除、1-->已删除
deleted?: boolean deleted?: boolean
} }
interface AssignmentDriver {
orderId?: string
orderTransId?: string[]
driverId?: string
}
interface TruckComingLeavingParam {
orderTransId?: string
weight?: number
frontPhoto?: string
bodyPhoto?: string
}
interface CheckParam {
orderTransId?: string
checkPhoto?: string[]
checkerMemo?: string
}
} }
} }

View File

@ -0,0 +1,117 @@
<script lang="ts" setup>
import Uploader from '@/components/uploader/Uploader.vue'
import Utils from '@/common/utils'
import ADialog from '@/components/a-dialog/ADialog.vue'
import { ElMessage } from 'element-plus'
import OrderApi from '@/pages/order/order-api.ts'
const orderData = Utils.resetAble(reactive<{
id: string
licensePlate: string,
}>({
id: '',
licensePlate: '',
}))
const title = computed(() => {
return `${orderData.licensePlate} 勘料`
})
const emits = defineEmits([ 'succ' ])
// const formIns = useTemplateRef<FormInstance>('formRef')
const inOutData = Utils.resetAble(reactive({
checkerMemo: '',
checkPhoto: [],
}))
const showDialog = ref(false)
const submiting = ref(false)
function dialogCloseHandler() {
inOutData.$reset()
}
function submitHandler() {
submiting.value = true
const data = {
orderTransId: orderData.id,
checkPhoto: inOutData.checkPhoto,
checkerMemo: inOutData.checkerMemo,
}
OrderApi.check(data)
.then(() => {
ElMessage.success(`${title.value}成功`)
showDialog.value = false
emits('succ')
})
.finally(() => {
submiting.value = false
})
}
defineExpose({
open(id: string, licensePlate: string) {
orderData.$reset({
id,
licensePlate,
})
showDialog.value = true
},
})
</script>
<template>
<ADialog
v-model:show="showDialog"
:closed="dialogCloseHandler"
:submit-handler="submitHandler"
:title="title"
>
<ElForm ref="formRef"
class="check-panel-form"
@submit.prevent>
<ElFormItem label="勘料照片" prop="headerPhoto">
<Uploader v-model:files="inOutData.checkPhoto"/>
</ElFormItem>
<ElFormItem label="勘料备注" prop="headerPhoto">
<ElInput v-model="inOutData.checkerMemo"/>
</ElFormItem>
</ElForm>
<template #footer>
<ElButton @click="showDialog = false">关闭</ElButton>
<ElButton type="danger" @click="showDialog = false">拒收</ElButton>
<ElButton :loading="submiting" type="primary" @click="submitHandler"></ElButton>
</template>
</ADialog>
</template>
<style lang="stylus" scoped>
.check-panel-form {
display grid
grid-template-areas "weight weight" \
"headerPhoto bodyPhoto"
gap: 0 20px;
padding: 10px;
:deep(.el-input-number) {
.el-input__suffix-inner {
padding-left 10px
}
}
:deep(.el-form-item) {
&:nth-child(1) {
grid-area weight
}
&:nth-child(2) {
grid-area headerPhoto
}
&:nth-child(3) {
grid-area bodyPhoto
}
}
}
</style>

View File

@ -7,6 +7,7 @@ import {
ElMessage, ElMessage,
type FormInstance, type FormInstance,
} from 'element-plus' } from 'element-plus'
import OrderApi from '@/pages/order/order-api.ts'
const orderData = Utils.resetAble(reactive<{ const orderData = Utils.resetAble(reactive<{
id: string id: string
@ -21,6 +22,8 @@ const title = computed(() => {
return `${orderData.licensePlate} ${orderData.state}` return `${orderData.licensePlate} ${orderData.state}`
}) })
const emits = defineEmits([ 'succ' ])
const formIns = useTemplateRef<FormInstance>('formRef') const formIns = useTemplateRef<FormInstance>('formRef')
const inOutData = Utils.resetAble(reactive({ const inOutData = Utils.resetAble(reactive({
@ -37,12 +40,25 @@ function dialogCloseHandler() {
function submitHandler() { function submitHandler() {
submiting.value = true submiting.value = true
FormUtil.submit(formIns, () => Promise.resolve()) const data = {
orderTransId: orderData.id,
weight: (inOutData.weight ?? 0) * 1000,
frontPhoto: inOutData.headerPhoto,
bodyPhoto: inOutData.bodyPhoto,
}
FormUtil.submit(formIns, () => {
if (orderData.state === '进场') {
return OrderApi.truckComing(data).then(() => true)
} else {
return OrderApi.truckLeaving(data).then(() => true)
}
})
.then(res => { .then(res => {
ElMessage.success(`${title.value}成功`) ElMessage.success(`${title.value}成功`)
if ((res ?? true)) { if ((res ?? true)) {
showDialog.value = false showDialog.value = false
} }
emits('succ')
}) })
.finally(() => { .finally(() => {
submiting.value = false submiting.value = false

View File

@ -36,11 +36,11 @@
</ElFormItem> </ElFormItem>
</template> </template>
<template #columns> <template #columns>
<ElTableColumn fixed="left" label="订单编号" prop="sn" width="140"/> <ElTableColumn fixed="left" label="订单编号" prop="sn" width="155"/>
<!-- <ElTableColumn label="下单时间" prop="orderTime"/> --> <!-- <ElTableColumn label="下单时间" prop="orderTime"/> -->
<!-- <ElTableColumn label="客户姓名" prop="contacts"/> --> <!-- <ElTableColumn label="客户姓名" prop="contacts"/> -->
<!-- <ElTableColumn label="联系方式" prop="phone"/> --> <!-- <ElTableColumn label="联系方式" prop="phone"/> -->
<ElTableColumn label="货品名称" prop="goodsName"/> <ElTableColumn label="货品名称" prop="goodsName" width="120"/>
<!-- <ElTableColumn label="项目名称" show-overflow-tooltip width="100"> <!-- <ElTableColumn label="项目名称" show-overflow-tooltip width="100">
<template #default="{row}"> <template #default="{row}">
@ -50,34 +50,57 @@
<!-- <ElTableColumn label="站点名称" prop="stationName" width="120"/> --> <!-- <ElTableColumn label="站点名称" prop="stationName" width="120"/> -->
<!-- <ElTableColumn label="运输单位" prop="transOrgName" show-overflow-tooltip width="140"/> --> <!-- <ElTableColumn label="运输单位" prop="transOrgName" show-overflow-tooltip width="140"/> -->
<!-- <ElTableColumn label="运距(米)" prop="transDistance"/> --> <!-- <ElTableColumn label="运距(米)" prop="transDistance"/> -->
<ElTableColumn label="运距" prop="transDistance" width="100">
<template #default="{row}">
{{ `${row.transDistance == null ? '' : (row.transDistance / 1000) + ' 公里'}` }}
</template>
</ElTableColumn>
<ElTableColumn label="车次" prop="trainNum" width="70"/> <ElTableColumn label="车次" prop="trainNum" width="70"/>
<ElTableColumn label="车牌号" prop="licensePlate" width="120"/> <ElTableColumn label="司机姓名" prop="driverName" width="120">
<template #default="{row}">
<span> {{ row.driverName ?? '-' }}</span>
</template>
</ElTableColumn>
<ElTableColumn label="司机电话" prop="driverPhone" width="120">
<template #default="{row}">
<span> {{ row.driverName ?? '-' }}</span>
</template>
</ElTableColumn>
<ElTableColumn label="车牌号" prop="truckLicensePlate" width="120">
<template #default="{row}">
<span> {{ row.truckLicensePlate ?? '-' }}</span>
</template>
</ElTableColumn>
<!-- <ElTableColumn label="司机姓名" prop="driverName"/> --> <!-- <ElTableColumn label="司机姓名" prop="driverName"/> -->
<!-- <ElTableColumn label="司机电话" prop="driverPhone"/> --> <!-- <ElTableColumn label="司机电话" prop="driverPhone"/> -->
<ElTableColumn label="毛重" prop="roughWeight"> <ElTableColumn label="毛重" prop="roughWeight" width="80">
<template #default="{row}"> <template #default="{row}">
{{ `${row.roughWeight == null ? '' : row.roughWeight + ' 吨'}` }} {{ `${row.roughWeight == null ? '' : (row.roughWeight / 1000) + ' 吨'}` }}
</template> </template>
</ElTableColumn> </ElTableColumn>
<ElTableColumn label="皮重" prop="tareWeight"> <ElTableColumn label="皮重" prop="tareWeight" width="80">
<template #default="{row}"> <template #default="{row}">
{{ `${row.tareWeight == null ? '' : row.tareWeight + ' 吨'}` }} {{ `${row.tareWeight == null ? '' : (row.tareWeight / 1000) + ' 吨'}` }}
</template> </template>
</ElTableColumn> </ElTableColumn>
<ElTableColumn label="净重" prop="settleWeight"> <ElTableColumn label="净重" prop="settleWeight" width="80">
<template #default="{row}"> <template #default="{row}">
{{ `${row.settleWeight == null ? '' : row.settleWeight + ' 吨'}` }} {{ `${row.settleWeight == null ? '' : (row.settleWeight / 1000) + ' 吨'}` }}
</template> </template>
</ElTableColumn> </ElTableColumn>
<ElTableColumn label="进场时间" prop="inTime" width="175"/> <ElTableColumn label="进场时间" prop="inTime" width="175"/>
<!-- <ElTableColumn label="开始运输时间" prop="transTime"/> --> <!-- <ElTableColumn label="开始运输时间" prop="transTime"/> -->
<ElTableColumn label="出场时间" prop="outTime" width="175"/> <ElTableColumn label="出场时间" prop="outTime" width="175"/>
<!-- <ElTableColumn label="完结时间" prop="finishTime"/> --> <!-- <ElTableColumn label="完结时间" prop="finishTime"/> -->
<ElTableColumn fixed="right" label="支付状态" prop="paymentStatusTxt" width="90"> <ElTableColumn fixed="right" label="支付状态" prop="paymentStatusTxt" width="120">
<template #default="{row}"> <template #default="{row}">
<ElTag :data-cs="paymentStatusColor.cs(row.paymentStatus)"> {{ row.paymentStatusTxt }}</ElTag> <ElTag :data-cs="paymentStatusColor.cs(row.paymentStatus,'info')"> {{ row.paymentStatusTxt ?? '暂无支付信息' }}</ElTag>
</template>
</ElTableColumn>
<ElTableColumn fixed="right" label="总金额" prop="settleMoney" width="80">
<template #default="{row}">
{{ `${row.settleMoney == null ? '' : row.settleMoney + ' 元'}` }}
</template> </template>
</ElTableColumn> </ElTableColumn>
<ElTableColumn fixed="right" label="勘料状态" prop="checkStatusTxt" width="90"> <ElTableColumn fixed="right" label="勘料状态" prop="checkStatusTxt" width="90">
@ -94,7 +117,8 @@
<!-- <ElTableColumn label="客户备注" prop="customerMemo"/> --> <!-- <ElTableColumn label="客户备注" prop="customerMemo"/> -->
</template> </template>
<RealtimeDetail ref="realtimeDetail"/> <RealtimeDetail ref="realtimeDetail"/>
<InOutPanel ref="inOutPanel"/> <InOutPanel ref="inOutPanel" @succ="research"/>
<CheckPanel ref="checkPanel" @succ="research"/>
</ATablePage> </ATablePage>
</template> </template>
@ -108,21 +132,24 @@ import {
checkStatus, checkStatus,
checkStatusColor, checkStatusColor,
paymentStatusColor, paymentStatusColor,
summaryMethod,
transStatus, transStatus,
transStatusColor, transStatusColor,
} from '@/pages/order/constants.ts' } from '@/pages/order/constants.ts'
import InOutPanel from '@/pages/order/realtime/InOutPanel.vue' import InOutPanel from '@/pages/order/realtime/InOutPanel.vue'
import { ElMessage } from 'element-plus'
import { useTemplateRef } from 'vue' import { useTemplateRef } from 'vue'
import type { R } from '@/common/utils/http-util.ts' import type { R } from '@/common/utils/http-util.ts'
import RealtimeDetail from '@/pages/order/realtime/RealtimeDetail.vue' import RealtimeDetail from '@/pages/order/realtime/RealtimeDetail.vue'
import CheckPanel from '@/pages/order/realtime/CheckPanel.vue'
import OrderApi from '@/pages/order/order-api.ts'
const props = defineProps<{ const props = defineProps<{
defaultOrderCategory: 'XiaoShou' | 'HuiShou' | 'DuanBo' bizType: 'XiaoShou' | 'HuiShou' | 'DuanBo'
}>() }>()
const tablePageIns = useTemplateRef<ATablePageInstance>('tablePage') const tablePageIns = useTemplateRef<ATablePageInstance>('tablePage')
const realtimeDetailIns = useTemplateRef<InstanceType<typeof RealtimeDetail>>('realtimeDetail') const realtimeDetailIns = useTemplateRef<InstanceType<typeof RealtimeDetail>>('realtimeDetail')
const inOutPanelIns = useTemplateRef<InstanceType<typeof InOutPanel>>('inOutPanel') const inOutPanelIns = useTemplateRef<InstanceType<typeof InOutPanel>>('inOutPanel')
const checkPanelIns = useTemplateRef<InstanceType<typeof CheckPanel>>('checkPanel')
function research() { function research() {
tablePageIns.value?.doSearch() tablePageIns.value?.doSearch()
@ -137,112 +164,35 @@ const tablePageProps = buildTablePageProps<OrderTypes.SearchOrderParam, OrderTyp
}, },
searchForm: { searchForm: {
defaultData: { defaultData: {
orderCategory: props.defaultOrderCategory, bizType: props.bizType,
orderType: 'ShiShi',
}, },
highForm: { highForm: {
contentWidth: 342, contentWidth: 342,
}, },
/* paging(param: OrderTypes.SearchOrderParam) { paging(param: OrderTypes.SearchOrderParam) {
return OrderApi.paging(param) return OrderApi.paging(param)
.then(res => { .then(res => {
const records = res.data.records const records = res.data.records
const dataList: OrderTypes.TableData[] = [] const dataList: OrderTypes.TableData[] = []
res.data.records = dataList res.data.records = dataList
for (const record of records) { for (const record of records) {
const transRecodes = record.transRecodes ?? [] const transRecodes = (record.transRecodes ?? []) as TransRecode[]
record.transRecodes = undefined record.transRecodes = undefined
for (let i = 0; i < transRecodes.length; i++) { for (let i = 0; i < transRecodes.length; i++) {
const it = transRecodes[i] const it = transRecodes[i] as TransRecode
const settleMoney = it.paymentRecords?.map(it1 => +(it1.settleMoney ?? 0)).reduce((a: number, b: number) => a + b, 0) ?? 0
dataList.push({ dataList.push({
...record, ...record,
...it, ...it,
settleMoney,
orderId: record.id,
rowCount: i === 0 ? transRecodes.length : 0, rowCount: i === 0 ? transRecodes.length : 0,
} as OrderTypes.TableData) } as OrderTypes.TableData)
} }
} }
return res as R<G.PageResult<OrderTypes.TableData>> return res as R<G.PageResult<OrderTypes.TableData>>
}) })
}, */
paging(param: OrderTypes.SearchOrderParam) {
return Promise.resolve({
code: 200,
data: {
current: param.current,
size: param.size,
total: 100,
records: [
{
rowCount: 3,
id: '123',
sn: '202308240001',
orderTime: '2023-08-24 10:00:00',
contacts: '张三',
phone: '13800000000',
projectName: '项目A',
stationName: '站点B',
goodsName: '商品X',
unit: '吨',
customerMemo: '客户备注',
estimatedQuantity: 100,
estimatedTrainNum: 2,
transDistance: 500,
orderCategoryTxt: '订单类型A',
transStatusTxt: '已进场',
transStatus: 'YiJinChang',
checkStatus: 'YiKanLiao',
checkStatusTxt: '未勘料',
paymentStatusTxt: '未支付',
truckLicensePlate: '苏A9B905',
},
{
rowCount: 0,
id: '123',
sn: '202308240001',
orderTime: '2023-08-24 10:00:00',
contacts: '张三',
phone: '13800000000',
projectName: '项目A',
stationName: '站点B',
goodsName: '商品X',
unit: '吨',
customerMemo: '客户备注',
estimatedQuantity: 100,
estimatedTrainNum: 2,
transDistance: 500,
orderCategoryTxt: '订单类型A',
transStatusTxt: '运输中',
transStatus: 'YunShuZhong',
checkStatus: 'WeiKanLiao',
checkStatusTxt: '未勘料',
paymentStatusTxt: '未支付',
truckLicensePlate: '苏A9B905',
},
{
rowCount: 0,
id: '123',
sn: '202308240001',
orderTime: '2023-08-24 10:00:00',
contacts: '张三',
phone: '13800000000',
projectName: '项目A',
stationName: '站点B',
goodsName: '商品X',
unit: '吨',
customerMemo: '客户备注',
estimatedQuantity: 100,
estimatedTrainNum: 2,
transDistance: 500,
orderCategoryTxt: '订单类型A',
transStatusTxt: '已进场',
transStatus: 'YiJinChang',
checkStatus: 'WeiKanLiao',
checkStatusTxt: '未勘料',
paymentStatusTxt: '未支付',
truckLicensePlate: '苏A9B905',
},
] as OrderTypes.TableData[],
},
} as R<G.PageResult<OrderTypes.TableData>>)
}, },
}, },
table: { table: {
@ -258,8 +208,9 @@ const tablePageProps = buildTablePageProps<OrderTypes.SearchOrderParam, OrderTyp
colspan: 1, colspan: 1,
} }
}, },
summaryMethod,
actionColumn: { actionColumn: {
width: 100, width: 185,
foldLimit: 5, foldLimit: 5,
tableActions: [ tableActions: [
{ {
@ -296,14 +247,11 @@ const tablePageProps = buildTablePageProps<OrderTypes.SearchOrderParam, OrderTyp
tooltip: '勘料', tooltip: '勘料',
type: 'warning', type: 'warning',
icon: 'chakanliaodan', icon: 'chakanliaodan',
confirm: {
title: '是否确认勘料',
},
show({row}) { show({row}) {
return row.transStatus === transStatus.YiJinChang && row.checkStatus === checkStatus.WeiKanLiao return row.transStatus === transStatus.YiJinChang && row.checkStatus === checkStatus.WeiKanLiao
}, },
action({row}) { action({row}) {
ElMessage.success(`${row.truckLicensePlate!}勘料成功`) checkPanelIns.value?.open(row.id!, row.truckLicensePlate!)
}, },
}, },
{ {

View File

@ -44,9 +44,21 @@
<ElDescriptionsItem :span="1"> <ElDescriptionsItem :span="1">
<TransRecode :trans-recodes="detailData.transRecodes" v-bind="transRecodeProps"> <TransRecode :trans-recodes="detailData.transRecodes" v-bind="transRecodeProps">
<ElTableColumn label="车次" prop="trainNum" width="60"/> <ElTableColumn label="车次" prop="trainNum" width="60"/>
<ElTableColumn label="司机姓名" prop="driverName" width="100"/> <ElTableColumn label="司机姓名" prop="driverName" width="120">
<ElTableColumn label="司机电话" prop="driverPhone" width="120"/> <template #default="{row}">
<ElTableColumn label="车牌号" prop="truckLicensePlate" width="120"/> <span> {{ row.driverName ?? '-' }}</span>
</template>
</ElTableColumn>
<ElTableColumn label="司机电话" prop="driverPhone" width="120">
<template #default="{row}">
<span> {{ row.driverName ?? '-' }}</span>
</template>
</ElTableColumn>
<ElTableColumn label="车牌号" prop="truckLicensePlate" width="120">
<template #default="{row}">
<span> {{ row.truckLicensePlate ?? '-' }}</span>
</template>
</ElTableColumn>
<ElTableColumn label="毛重" prop="roughWeight"> <ElTableColumn label="毛重" prop="roughWeight">
<template #default="{row}"> <template #default="{row}">
{{ `${row.roughWeight == null ? '' : row.roughWeight + ' 吨'}` }} {{ `${row.roughWeight == null ? '' : row.roughWeight + ' 吨'}` }}
@ -72,9 +84,9 @@
{{ `${row.settleMoney == null ? '' : '¥:' + row.settleMoney + '元'}` }} {{ `${row.settleMoney == null ? '' : '¥:' + row.settleMoney + '元'}` }}
</template> </template>
</ElTableColumn> </ElTableColumn>
<ElTableColumn fixed="right" label="支付状态" prop="paymentStatusTxt" width="90"> <ElTableColumn fixed="right" label="支付状态" prop="paymentStatusTxt" width="120">
<template #default="{row}"> <template #default="{row}">
<ElTag :data-cs="paymentStatusColor.cs(row.paymentStatus)"> {{ row.paymentStatusTxt }}</ElTag> <ElTag :data-cs="paymentStatusColor.cs(row.paymentStatus,'info')"> {{ row.paymentStatusTxt ?? '暂无支付信息' }}</ElTag>
</template> </template>
</ElTableColumn> </ElTableColumn>
<ElTableColumn fixed="right" label="勘料状态" prop="checkStatusTxt" width="90"> <ElTableColumn fixed="right" label="勘料状态" prop="checkStatusTxt" width="90">
@ -132,14 +144,19 @@ import Strings from '@/common/utils/strings.ts'
import AIcon from '@/components/a-icon/AIcon.vue' import AIcon from '@/components/a-icon/AIcon.vue'
import OrderApi from '@/pages/order/order-api.ts' import OrderApi from '@/pages/order/order-api.ts'
const detailPanelIns = useTemplateRef<ADetailPanelInstance<OrderTypes.TableData>>('detailPanel') const detailPanelIns = useTemplateRef<ADetailPanelInstance>('detailPanel')
const transRecodeProps = buildTransRecodeProps({}) const transRecodeProps = buildTransRecodeProps({
enableSummary: true,
})
const detailPanelProps = buildDetailPanelProps<OrderTypes.SearchOrderResult>({ const detailPanelProps = buildDetailPanelProps<OrderTypes.SearchOrderResult>({
title: '订单详情', title: '订单详情',
width: '80vw', width: '80vw',
detailsLoader: OrderApi.detail, detailsLoader(id) {
return OrderApi.detail(id, 'ShiShi')
},
}) })
@ -158,7 +175,7 @@ function kanliao(data: OrderTypes.TransRecode) {
defineExpose({ defineExpose({
open(data: OrderTypes.TableData) { open(data: OrderTypes.TableData) {
detailPanelIns.value?.open(data) detailPanelIns.value?.open(data.orderId!)
}, },
}) })
</script> </script>

View File

@ -3,7 +3,7 @@ import Realtime from '@/pages/order/realtime/Realtime.vue'
</script> </script>
<template> <template>
<Realtime default-order-category="XiaoShou"/> <Realtime biz-type="XiaoShou"/>
</template> </template>
<style lang="stylus" scoped> <style lang="stylus" scoped>

View File

@ -3,7 +3,7 @@ import Realtime from '@/pages/order/realtime/Realtime.vue'
</script> </script>
<template> <template>
<Realtime default-order-category="HuiShou"/> <Realtime biz-type="HuiShou"/>
</template> </template>
<style lang="stylus" scoped> <style lang="stylus" scoped>

View File

@ -7,24 +7,18 @@ import {
ElTable, ElTable,
ElTableColumn, ElTableColumn,
} from 'element-plus' } from 'element-plus'
import { type SummaryMethodProps } from '@/components/a-page/a-table-page/build-summary-method.ts'
import { summaryMethod } from '@/pages/order/constants.ts'
interface SummaryMethodProps {
columns: TableColumnCtx<OrderTypes.TransRecode>[]
data: OrderTypes.TransRecode[]
}
interface TransRecode { interface TransRecode {
transRecodes: OrderTypes.TransRecode[] transRecodes: OrderTypes.TransRecode[]
selectable: boolean selectable: boolean
disabledRowsMethod: (rows?: OrderTypes.TransRecode[]) => string[] | undefined disabledRowsMethod: (rows?: OrderTypes.TransRecode[]) => string[] | undefined
summaries: string[]
moduleValue: string[] moduleValue: string[]
'onUpdate:moduleValue': (value: string[]) => void 'onUpdate:moduleValue': (value: string[]) => void
summaryMethod: (data: SummaryMethodProps) => (string | VNode)[] summaryMethod?: (data: SummaryMethodProps<OrderTypes.TransRecode>) => (string | VNode)[]
} }
const component = defineComponent( const component = defineComponent(
(props: TransRecode, ctx) => { (props: TransRecode, ctx) => {
const transRecodes = computed(() => { const transRecodes = computed(() => {
@ -67,7 +61,6 @@ const component = defineComponent(
ctx.emit('update:moduleValue', selectRows.$clone()) ctx.emit('update:moduleValue', selectRows.$clone())
} }
return () => (<ElTable return () => (<ElTable
cell-class-name="table-cell" cell-class-name="table-cell"
empty-text="暂无数据" empty-text="暂无数据"
@ -76,7 +69,7 @@ const component = defineComponent(
data={transRecodes.value} data={transRecodes.value}
class={[ 'data-table', props.selectable ? styles.selectable : '' ]} class={[ 'data-table', props.selectable ? styles.selectable : '' ]}
summary-method={props.summaryMethod} summary-method={props.summaryMethod}
show-summary={props.summaries.length > 0} show-summary={props.summaryMethod != null}
onRow-click={rowClick}> onRow-click={rowClick}>
{{ {{
default: () => { default: () => {
@ -106,29 +99,32 @@ const component = defineComponent(
}, },
{ {
name: 'TransRecode', name: 'TransRecode',
props: [ 'transRecodes', 'selectable', 'summaries', 'disabledRowsMethod', 'summaryMethod', 'moduleValue' ], props: [ 'transRecodes', 'selectable', 'disabledRowsMethod', 'summaryMethod', 'moduleValue' ],
emits: [ 'update:moduleValue' ], emits: [ 'update:moduleValue' ],
}, },
) )
type BuildTransRecodePropsParam = DeepPartial<Exclude<TransRecode, 'summaryMethod' | 'transRecodes'>> & {
enableSummary?: boolean
}
export function buildTransRecodeProps({ export function buildTransRecodeProps({
selectable, selectable,
summaries,
moduleValue, moduleValue,
summaryMethod, enableSummary = false,
disabledRowsMethod, disabledRowsMethod,
['onUpdate:moduleValue']: onUpdateModuleValue, ['onUpdate:moduleValue']: onUpdateModuleValue,
}: DeepPartial<Exclude<TransRecode, 'transRecodes'>>) { }: BuildTransRecodePropsParam,
) {
const props = reactive({ const props = reactive({
selectable: selectable ?? false, selectable: selectable ?? false,
summaries: summaries ?? [],
moduleValue: moduleValue ?? [], moduleValue: moduleValue ?? [],
'onUpdate:moduleValue': onUpdateModuleValue ?? (value => { 'onUpdate:moduleValue': onUpdateModuleValue ?? (value => {
props.moduleValue = value props.moduleValue = value
}), }),
disabledRowsMethod: disabledRowsMethod ?? (() => []), disabledRowsMethod: disabledRowsMethod ?? (() => []),
summaryMethod: summaryMethod ?? (() => []), summaryMethod: enableSummary ? summaryMethod : undefined,
} as Exclude<TransRecode, 'transRecodes'>) })
return props return props
} }