From 3e585b89fdd7a8c7846eb586a7ea51cc5602a490 Mon Sep 17 00:00:00 2001
From: b2894lxlx <517289602@qq.com>
Date: Tue, 11 Aug 2026 23:50:51 +0800
Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E6=96=B0=E5=A2=9E=E6=80=BB=E5=8D=95?=
=?UTF-8?q?=202=E3=80=81fix=20bug?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/api/business/master-order.js | 32 +
src/option/business/waybill-manage.js | 1 +
.../components/business-crud-page.vue | 14 +-
.../components/master-order-detail.vue | 98 ++
.../components/master-order-dispatch.vue | 385 +++++
.../components/master-order-editor.vue | 1244 +++++++++++++++++
src/views/business/loading-manage.vue | 27 +-
src/views/business/master-order.vue | 549 ++++++++
src/views/business/transport-plan.vue | 2 +-
src/views/business/waybill-manage.vue | 2 +-
vite.config.mjs | 20 +-
11 files changed, 2356 insertions(+), 18 deletions(-)
create mode 100644 src/api/business/master-order.js
create mode 100644 src/views/business/components/master-order-detail.vue
create mode 100644 src/views/business/components/master-order-dispatch.vue
create mode 100644 src/views/business/components/master-order-editor.vue
create mode 100644 src/views/business/master-order.vue
diff --git a/src/api/business/master-order.js b/src/api/business/master-order.js
new file mode 100644
index 0000000..ca13ae0
--- /dev/null
+++ b/src/api/business/master-order.js
@@ -0,0 +1,32 @@
+import request from '@/axios';
+
+const baseUrl = '/blade-transport/master-order';
+
+export const getList = (current, size, params) =>
+ request({ url: `${baseUrl}/list`, method: 'get', params: { current, size, ...params } });
+export const getDetail = id => request({ url: `${baseUrl}/detail`, method: 'get', params: { id } });
+export const submit = data => request({ url: `${baseUrl}/submit`, method: 'post', data });
+export const saveDraft = data => request({ url: `${baseUrl}/draft`, method: 'post', data });
+export const copy = id => request({ url: `${baseUrl}/copy`, method: 'post', params: { id } });
+export const remove = id => request({ url: `${baseUrl}/remove`, method: 'post', params: { id } });
+export const closeDispatch = id =>
+ request({ url: `${baseUrl}/close-dispatch`, method: 'post', params: { id } });
+export const dispatch = data => request({ url: `${baseUrl}/dispatch`, method: 'post', data });
+export const exportList = params =>
+ request({ url: `${baseUrl}/export`, method: 'get', params, responseType: 'blob' });
+export const getAvailableProjects = () =>
+ request({
+ url: '/blade-transport/project-apply/list',
+ method: 'get',
+ params: {
+ current: 1,
+ size: 9999,
+ approvalStatuses: 'approved,change_approved',
+ },
+ });
+export const getProjectContracts = projectId =>
+ request({
+ url: '/blade-transport/contract-manage/list',
+ method: 'get',
+ params: { current: 1, size: 9999, projectId },
+ });
diff --git a/src/option/business/waybill-manage.js b/src/option/business/waybill-manage.js
index 5c07a81..b0e617a 100644
--- a/src/option/business/waybill-manage.js
+++ b/src/option/business/waybill-manage.js
@@ -124,6 +124,7 @@ export const config = {
enableContractSelect: true,
enableShippingPlanSelect: true,
enableShippingInfoForm: true,
+ fixedTransportAddressType: true,
enableTaskInfoForm: true,
enableWaybillFooterFreightSummary: true,
enableDraftSave: true,
diff --git a/src/views/business/components/business-crud-page.vue b/src/views/business/components/business-crud-page.vue
index 472ca0b..81ab780 100644
--- a/src/views/business/components/business-crud-page.vue
+++ b/src/views/business/components/business-crud-page.vue
@@ -3755,7 +3755,7 @@
-
+
@@ -4254,6 +4254,10 @@ export default {
type: Number,
default: null,
},
+ detailId: {
+ type: [String, Number],
+ default: null,
+ },
},
data() {
return {
@@ -4920,6 +4924,14 @@ export default {
},
},
watch: {
+ detailId: {
+ immediate: true,
+ handler(id) {
+ if (id !== undefined && id !== null && id !== '') {
+ this.$nextTick(() => this.openDetail({ id }));
+ }
+ },
+ },
'form.transportType'(value, oldValue) {
if (!this.shippingInfoFormEnabled || this.suppressTransportTypeClear) return;
if (String(value ?? '') === String(oldValue ?? '')) return;
diff --git a/src/views/business/components/master-order-detail.vue b/src/views/business/components/master-order-detail.vue
new file mode 100644
index 0000000..8b4b366
--- /dev/null
+++ b/src/views/business/components/master-order-detail.vue
@@ -0,0 +1,98 @@
+
+
+
+ 多联总单详情 | {{ master.masterNo }}
{{ statusName(master.businessStatus) }}返回
+ - 客户
- {{ master.customerName || '-' }}
- 合同编号
- {{ master.contractNo || '-' }}
- 项目
- {{ master.projectName || '-' }}
- 货物名称
- {{ goodsNames }}
- 货物类型
- {{ goodsTypes }}
- 运输周期
- {{ dateRange }}
+ {{ index ? '经' : '起' }}{{ route.departureName || '-' }}{{ route.departureAddress || '-' }}{{ index ? `已到达 ${quantity(segments[index - 1].arrivedQuantity)}/${quantity(master.totalQuantity)}` : `已调度 ${quantity(route.dispatchedQuantity)}/${quantity(master.totalQuantity)}` }}已调度 {{ quantity(route.dispatchedQuantity) }}/{{ quantity(master.totalQuantity) }}
终{{ route.arrivalName || '-' }}{{ route.arrivalAddress || '-' }}已到达 {{ quantity(route.arrivedQuantity) }}/{{ quantity(master.totalQuantity) }}
+
+
+
+ 分段执行明细
+
+ {{ segmentNumber(route, index) }}{{ route.departureName || '-' }} → {{ route.arrivalName || '-' }}
+
+
总量{{ quantity(master.totalQuantity) }}吨
已调度{{ quantity(route.dispatchedQuantity) }}吨
剩余{{ quantity(remainingQuantity(route)) }}吨
+
{{ row.waybillNo }}{{ driverVehicle(row) }}{{ quantity(row.quantity) }}{{ waybillStatusName(row.businessStatus) }}
+
+
关联计划单
{{ row.planNo }}
+
+
+
+
+ 货物信息
+ {{ quantity(row.quantity) }} {{ row.quantityUnit || '' }}
+
+
+
+
+
+
+
+
diff --git a/src/views/business/components/master-order-dispatch.vue b/src/views/business/components/master-order-dispatch.vue
new file mode 100644
index 0000000..04a9c0f
--- /dev/null
+++ b/src/views/business/components/master-order-dispatch.vue
@@ -0,0 +1,385 @@
+
+
+
+
+
+
多联总单调度 | {{ master.masterNo }}
+ {{ statusName(master.businessStatus) }}
+
+
+
+
+ - 客户
- {{ master.customerName || '-' }}
+ - 合同编号
- {{ master.contractNo || '-' }}
+ - 项目
- {{ master.projectName || '-' }}
+ - 货物名称
- {{ goodsNames }}
+ - 货物类型
- {{ goodsTypes }}
+ - 运输周期
- {{ dateRange }}
+
+
+
+
+ {{ index === 0 ? '起' : '经' }}
+ {{ route.departureName || '-' }}
+ {{ route.departureAddress || '-' }}
+ {{ contactText(route.departureContact, route.departurePhone) }}
+
+
+
+ 终
+ {{ route.arrivalName || '-' }}
+ {{ route.arrivalAddress || '-' }}
+ {{ contactText(route.arrivalContact, route.arrivalPhone) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 计划单运单
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ formatQuantity(row.remainingQuantity) }}
+ handleDispatchQuantityInput(row, value)" />
+
+
+
+
+
+
+ 删除
+
+
+
运费信息
+
+
+ handleUnitPriceInput(route, value)" />
+
+ 吨
+ 元
+
+
+
+
+ handleCarrierTypeChange(route, value)">
+
+
+ visible && loadCarrierOptions()">
+ visible && loadDriverOptions()" @change="value => handleDriverChange(route, value)">
+
+
+
+
+
+ handleMileageInput(route, value)" />
+
+
+
+
+
加入并继续调度加入调度清单
+
+
+
+
+
+
+
+ 待提交 {{ pending.length }} 条 ({{ pendingSegmentSummary }})
+ {{ pendingExpanded ? '收起待调度列表' : '展开待调度列表' }}
+
+
返回确认调度
+
+
+
+ {{ segmentNo }}:{{ items[0].departureName }} → {{ items[0].arrivalName }}
+ {{ row.cargoName }}{{ row.cargoType ? `,${row.cargoType}` : '' }}{{ formatQuantity(row.quantity) }} {{ row.quantityUnit }}编辑删除
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/business/components/master-order-editor.vue b/src/views/business/components/master-order-editor.vue
new file mode 100644
index 0000000..0ded4c8
--- /dev/null
+++ b/src/views/business/components/master-order-editor.vue
@@ -0,0 +1,1244 @@
+
+
+
+
+
+
收发货信息
+ 选择线路
+
+
+
+
+ 起
+
+
+
+
+
+ 经
+ 段{{ index + 1 }}{{ getRouteTitle(index).replace(`段${index + 1}:`, '') }}运输类型
+
+
+
+
+
+ 终
+ 段{{ form.routes.length + 1 }}{{ getFinalRouteTitle().replace(`段${form.routes.length + 1}:`, '') }}运输类型
+
+
+
+
+
+
+
+
+
+
货物信息
+
+ 导入货物
+ 常用货物
+
+
+ 新增删除
+
+
+
+
+
+
+
+
+
+
+ 选择
+
+
+
+
+
+ 搜索
+
+
+
+ {{ mapStatus
+ }} 行政区划:{{ mapSelected.regionName }}
+
+ 取消确定
+
+
+
+
+
+
+
+ 查询重置
+
+
+
+
+
+
+
+
+
+
+ 选择
+
+
+
+
+
+ 选择
+
+
+
+
上传支持 .xlsx、.xls 文件,单个文件不超过 50M
点击下载模板 关闭
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 查询
+ 重置
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 选择
+
+
+
+
+
+ 关闭
+
+
+
+
+
+
+
diff --git a/src/views/business/loading-manage.vue b/src/views/business/loading-manage.vue
index 11a8e9a..79f67cb 100644
--- a/src/views/business/loading-manage.vue
+++ b/src/views/business/loading-manage.vue
@@ -356,7 +356,7 @@
配载单详情
{{ dialogForm.loadingNo || '-' }}
{{ statusText(dialogForm) }}
- {{ dialogForm.transportType || '-' }}
+ {{ transportTypeLabel(dialogForm.transportType) }}
任务信息{{ taskSummary }}
@@ -369,7 +369,7 @@
{{ row.waybillNo || '-' }}{{ dialogForm.loadingNo || '-' }}
-
{{ item.name || item.nodeName || item.label }}轨迹回放实时定位
+
visible && loadProjectOptions()" @change="handleProcessProjectChange">补录执行批量补录
{{ item.name || item.nodeName || item.label }}轨迹回放实时定位
item.nodeConfigJson) || {};
this.processNodes = parseJsonArray(config.nodeConfigJson);
} catch (error) {
this.processNodes = [];
}
},
+ async handleProcessProjectChange() {
+ await this.loadProcessNodes();
+ },
previewAttachment(file) {
if (!file.url) {
ElMessage.info('暂无可预览的附件地址');
@@ -1400,6 +1406,9 @@ export default {
handleTrackAction(action) {
ElMessage.info(action === 'playback' ? '暂无可回放的物流轨迹' : '暂无车辆实时定位数据');
},
+ handleProcessAction(action) {
+ ElMessage.info(action === 'supplement' ? '补录执行功能暂未接入' : '批量补录功能暂未接入');
+ },
openRouteChangeDialog() {
this.routeChangeTab = 'change';
this.routeChangeRemark = '';
@@ -1868,6 +1877,10 @@ export default {
handleMileageInput(value) {
this.dialogForm.mileage = String(value || '').replace(/[^\d.]/g, '');
},
+ transportTypeLabel(value) {
+ if (!value) return '-';
+ return this.transportTypeOptions.find(item => String(item.value) === String(value))?.label || value;
+ },
async loadTransportTypeOptions() {
if (this.transportTypeOptions.length) return;
const res = await request({
@@ -2214,6 +2227,8 @@ export default {
.loading-detail__step-tags { display: flex; justify-content: center; gap: 4px; margin-top: 6px; }
.loading-detail__bottom-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; }
.loading-detail__track-actions { display: flex; gap: 8px; }
+ .loading-detail__process-actions { display: flex; align-items: center; gap: 8px; }
+ .loading-detail__process-actions .el-select { width: 180px; }
.loading-detail__map { width: 100%; min-height: 260px; border: 1px solid #eff1f7; }
}
.loading-route-change-dialog { .loading-route-change-dialog__original { color: #a8abb2; line-height: 20px; margin-bottom: 4px; }.loading-route-change-dialog__location { cursor: pointer; color: #909399; }.loading-route-change-dialog__hint { color: #909399; }.loading-route-change-dialog__route-list { display: flex; flex-direction: column; gap: 8px; }.loading-route-change-dialog__route-item { display: grid; grid-template-columns: 34px minmax(0, 1fr) auto 24px; align-items: center; gap: 12px; padding: 10px 12px; background: #f5f6f7; cursor: move; }.loading-route-change-dialog__route-type { width: 30px; height: 30px; border-radius: 50%; background: #dcdfe6; text-align: center; line-height: 30px; }.loading-route-change-dialog__tags { display: flex; gap: 4px; }.loading-route-change-dialog__record-content { white-space: normal; overflow-wrap: anywhere; line-height: 22px; } }
diff --git a/src/views/business/master-order.vue b/src/views/business/master-order.vue
new file mode 100644
index 0000000..67ea5e5
--- /dev/null
+++ b/src/views/business/master-order.vue
@@ -0,0 +1,549 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ 查询重置{{ searchExpanded ? '折叠' : '展开' }}
+
+
+
+
+ 新建多联总单批量导出
+
+
+
+
+
+ {{ row.masterNo }}{{
+ statusName(row.businessStatus)
+ }}
+
+ {{ row.projectName || '-' }}
+ {{ timeRange(row) }}
+ {{ goodsSummary(row) }}
+
+
+
+
+
+
{{ node.text }}
+
+ {{ node.name }}
+ {{ line }}
+
+
+
+ {{ (row.routeProgress || [])[index]?.transportType }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ confirm.message }}关闭确认
+
+
+
+
+
+
diff --git a/src/views/business/transport-plan.vue b/src/views/business/transport-plan.vue
index 090ddea..c53eb2e 100644
--- a/src/views/business/transport-plan.vue
+++ b/src/views/business/transport-plan.vue
@@ -1,5 +1,5 @@
-
+