修复业务模块bug

This commit is contained in:
2026-08-13 14:07:04 +08:00
parent 6554ad80dd
commit f62e36e846
15 changed files with 941 additions and 186 deletions
@@ -109,12 +109,8 @@
</template>
<template #departureAddress="{ row }">
<div v-if="isWaybillDetailLayout" class="business-crud-page__waybill-address-cell">
<span>{{ row.departureName || '-' }}</span>
<span>{{ row.departureAddress || '-' }}</span>
</div>
<el-tooltip
v-else-if="isTransportPlanPage"
v-if="isTransportPlanPage || isWaybillDetailLayout"
:content="row.departureAddress || '-'"
placement="top"
>
@@ -124,12 +120,8 @@
</template>
<template #arrivalAddress="{ row }">
<div v-if="isWaybillDetailLayout" class="business-crud-page__waybill-address-cell">
<span>{{ row.arrivalName || '-' }}</span>
<span>{{ row.arrivalAddress || '-' }}</span>
</div>
<el-tooltip
v-else-if="isTransportPlanPage"
v-if="isTransportPlanPage || isWaybillDetailLayout"
:content="row.arrivalAddress || '-'"
placement="top"
>
@@ -616,7 +608,7 @@
</el-form-item>
</div>
<div
v-if="isCarrierMode"
v-if="hasTransportType && isCarrierMode"
class="business-crud-page__subsection business-crud-page__carrier-section"
>
<div class="business-crud-page__subsection-head">
@@ -650,7 +642,11 @@
/>
</el-select>
</el-form-item>
<el-form-item label="司机" class="business-crud-page__task-span-1">
<el-form-item
v-if="!isNonRoadTransport"
label="司机"
class="business-crud-page__task-span-1"
>
<el-select
v-model="form.driverName"
placeholder="请输入"
@@ -672,7 +668,11 @@
/>
</el-select>
</el-form-item>
<el-form-item label="手机号" class="business-crud-page__task-span-1">
<el-form-item
v-if="!isNonRoadTransport"
label="手机号"
class="business-crud-page__task-span-1"
>
<el-input
v-model="form.driverPhone"
placeholder="请输入"
@@ -681,9 +681,52 @@
:disabled="dialogReadonly"
/>
</el-form-item>
<el-form-item label="车牌号" required class="business-crud-page__task-span-1">
<el-form-item
:label="transportVehicleNoLabel"
required
class="business-crud-page__task-span-1"
>
<el-input
v-model="form.vehicleNo"
:placeholder="`请输入${transportVehicleNoLabel}`"
clearable
maxlength="30"
:disabled="dialogReadonly"
/>
</el-form-item>
<el-form-item
v-if="isNonRoadTransport"
label="船长"
class="business-crud-page__task-span-1"
>
<el-input
v-model="form.captainName"
placeholder="请输入"
clearable
maxlength="20"
:disabled="dialogReadonly"
/>
</el-form-item>
<el-form-item
v-if="isNonRoadTransport"
label="联系电话"
class="business-crud-page__task-span-1"
>
<el-input
v-model="form.driverPhone"
placeholder="请输入"
clearable
maxlength="20"
:disabled="dialogReadonly"
/>
</el-form-item>
<el-form-item
v-if="isNonRoadTransport"
label="箱号"
class="business-crud-page__task-span-1"
>
<el-input
v-model="form.containerNo"
placeholder="请输入"
clearable
maxlength="30"
@@ -693,7 +736,20 @@
</div>
<div class="business-crud-page__task-row">
<el-form-item
v-if="isRoadTransport"
v-if="isNonRoadTransport"
label="舱位"
class="business-crud-page__task-span-1"
>
<el-input
v-model="form.cabinNo"
placeholder="请输入"
clearable
maxlength="30"
:disabled="dialogReadonly"
/>
</el-form-item>
<el-form-item
v-if="showRoadEscortFields"
label="挂车车牌号"
class="business-crud-page__task-span-1"
>
@@ -706,7 +762,7 @@
/>
</el-form-item>
<el-form-item
v-if="isRoadTransport"
v-if="showRoadEscortFields"
label="押运人"
class="business-crud-page__task-span-1"
>
@@ -719,7 +775,7 @@
/>
</el-form-item>
<el-form-item
v-if="isRoadTransport"
v-if="showRoadEscortFields"
label="押运人手机号"
class="business-crud-page__task-span-1"
>
@@ -731,7 +787,11 @@
:disabled="dialogReadonly"
/>
</el-form-item>
<el-form-item label="里程(km)" class="business-crud-page__task-span-1">
<el-form-item
v-if="!isNonRoadTransport"
label="里程(km)"
class="business-crud-page__task-span-1"
>
<el-input
v-model="form.mileage"
placeholder="请输入"
@@ -742,7 +802,7 @@
/>
</el-form-item>
</div>
<div class="business-crud-page__task-row">
<div v-if="!isNonRoadTransport" class="business-crud-page__task-row">
<el-form-item
:label="isRoadTransport ? '计划发货日期' : '预计发货日期'"
class="business-crud-page__task-span-1"
@@ -786,8 +846,8 @@
</el-form-item>
</div>
</div>
<template v-else>
<div class="business-crud-page__task-row">
<template v-else-if="hasTransportType">
<div v-if="isRoadTransport" class="business-crud-page__task-row">
<el-form-item
label="司机"
:required="isRoadTransport"
@@ -842,7 +902,7 @@
/>
</el-form-item>
</div>
<div class="business-crud-page__task-row">
<div v-if="isRoadTransport" class="business-crud-page__task-row">
<el-form-item label="押运人" class="business-crud-page__task-span-1">
<el-input
v-model="form.escortName"
@@ -872,7 +932,7 @@
/>
</el-form-item>
</div>
<div class="business-crud-page__task-row">
<div v-if="isRoadTransport" class="business-crud-page__task-row">
<el-form-item
:label="isRoadTransport ? '计划发货日期' : '预计发货日期'"
class="business-crud-page__task-span-1"
@@ -900,7 +960,7 @@
/>
</el-form-item>
</div>
<div class="business-crud-page__task-row">
<div v-if="isRoadTransport" class="business-crud-page__task-row">
<el-form-item
label="备注"
class="business-crud-page__task-note business-crud-page__task-span-4"
@@ -915,6 +975,32 @@
/>
</el-form-item>
</div>
<template v-if="isNonRoadTransport">
<div class="business-crud-page__task-row">
<el-form-item :label="transportVehicleNoLabel" required class="business-crud-page__task-span-1">
<el-input v-model="form.vehicleNo" :placeholder="`请输入${transportVehicleNoLabel}`" clearable maxlength="30" :disabled="dialogReadonly" />
</el-form-item>
<el-form-item label="船长" class="business-crud-page__task-span-1">
<el-input v-model="form.captainName" placeholder="请输入" clearable maxlength="20" :disabled="dialogReadonly" />
</el-form-item>
<el-form-item label="联系电话" class="business-crud-page__task-span-1">
<el-input v-model="form.driverPhone" placeholder="请输入" clearable maxlength="20" :disabled="dialogReadonly" />
</el-form-item>
<el-form-item label="箱号" class="business-crud-page__task-span-1">
<el-input v-model="form.containerNo" placeholder="请输入" clearable maxlength="30" :disabled="dialogReadonly" />
</el-form-item>
</div>
<div class="business-crud-page__task-row">
<el-form-item label="舱位" class="business-crud-page__task-span-1">
<el-input v-model="form.cabinNo" placeholder="请输入" clearable maxlength="30" :disabled="dialogReadonly" />
</el-form-item>
</div>
<div class="business-crud-page__task-row">
<el-form-item label="备注" class="business-crud-page__task-note business-crud-page__task-span-4">
<el-input v-model="form.taskRemark" placeholder="请输入,200字以内" clearable maxlength="200" show-word-limit :disabled="dialogReadonly" />
</el-form-item>
</div>
</template>
</template>
</el-form>
<div class="business-crud-page__subsection">
@@ -1041,7 +1127,8 @@
/>
</el-radio-group>
</el-form-item>
<el-form-item v-if="isRoadTransport && isCarrierMode" label="承运商" required>
<template v-if="hasTransportType">
<el-form-item v-if="isCarrierMode" label="承运商" required>
<el-select
v-model="form.carrierName"
placeholder="请选择承运商"
@@ -1123,12 +1210,12 @@
:disabled="dialogReadonly"
/>
</el-form-item>
<el-form-item v-if="isNonRoadTransport" label="舱位">
<el-form-item v-if="isNonRoadTransport && isCarrierMode" label="联系电话">
<el-input
v-model="form.cabinNo"
placeholder="请输入舱位"
v-model="form.driverPhone"
placeholder="请输入联系电话"
clearable
maxlength="30"
maxlength="20"
:disabled="dialogReadonly"
/>
</el-form-item>
@@ -1141,7 +1228,16 @@
:disabled="dialogReadonly"
/>
</el-form-item>
<el-form-item v-if="isRoadTransport" label="挂车车牌号">
<el-form-item v-if="isNonRoadTransport" label="舱位">
<el-input
v-model="form.cabinNo"
placeholder="请输入舱位"
clearable
maxlength="30"
:disabled="dialogReadonly"
/>
</el-form-item>
<el-form-item v-if="showRoadEscortFields" label="挂车车牌号">
<el-input
v-model="form.trailerVehicleNo"
placeholder="请输入挂车车牌号"
@@ -1150,7 +1246,7 @@
:disabled="dialogReadonly"
/>
</el-form-item>
<el-form-item v-if="isRoadTransport" label="押运人">
<el-form-item v-if="showRoadEscortFields" label="押运人">
<el-input
v-model="form.escortName"
placeholder="请输入押运人"
@@ -1159,7 +1255,7 @@
:disabled="dialogReadonly"
/>
</el-form-item>
<el-form-item v-if="isRoadTransport" label="押运人手机号">
<el-form-item v-if="showRoadEscortFields" label="押运人手机号">
<el-input
v-model="form.escortPhone"
placeholder="请输入押运人手机号"
@@ -1185,8 +1281,10 @@
<el-form-item label="货物名称">
<el-select
v-model="form.cargoName"
placeholder="请选择货物"
placeholder="请选择或输入货物"
filterable
allow-create
default-first-option
clearable
:disabled="dialogReadonly || !form.cargoType"
:loading="taskCargoLoading"
@@ -1299,6 +1397,15 @@
</template>
</el-input>
</el-form-item>
<el-form-item label="其他费用合计">
<el-input
v-model="form.otherFeeTotal"
placeholder="请输入其他费用合计"
clearable
:disabled="dialogReadonly"
@input="value => handleTaskNumberInput('otherFeeTotal', value)"
/>
</el-form-item>
<el-form-item label="备注" class="business-crud-page__task-remark">
<el-input
v-model="form.taskRemark"
@@ -1310,6 +1417,7 @@
:disabled="dialogReadonly"
/>
</el-form-item>
</template>
</el-form>
</div>
</template>
@@ -1338,7 +1446,27 @@
<el-table-column type="index" label="序号" width="70" align="center" fixed="left" />
<el-table-column label="货物名称" min-width="150" align="center">
<template #default="{ row }">
<el-input v-model="row.cargoName" placeholder="请输入" :disabled="dialogReadonly" />
<el-select
v-model="row.cargoName"
placeholder="请选择或输入"
filterable
allow-create
default-first-option
clearable
:disabled="dialogReadonly"
:loading="isTaskCargoOptionsLoading(row.cargoTypePath)"
@visible-change="
visible => visible && loadTaskCargoOptionsByPath(row.cargoTypePath)
"
@change="value => handleTaskCargoRowNameChange(row, value)"
>
<el-option
v-for="item in getTaskCargoRowOptions(row)"
:key="item.id || item.cargoCode || item.cargoName"
:label="formatBillingCargoTypeLabel(item)"
:value="formatBillingCargoTypeLabel(item)"
/>
</el-select>
</template>
</el-table-column>
<el-table-column min-width="220" align="center">
@@ -2887,7 +3015,7 @@
{{ dispatchDialogStatusText }}
</el-tag>
<el-tag type="primary" effect="light">
{{ dispatchRow.transportType || '公路整车' }}
{{ formatDispatchTransportType(dispatchRow.transportType) || '公路整车' }}
</el-tag>
</div>
</div>
@@ -3014,12 +3142,15 @@
>
<el-table-column type="index" label="序号" width="70" align="center" fixed="left" />
<el-table-column
prop="transportType"
label="运输方式"
min-width="180"
align="center"
show-overflow-tooltip
/>
>
<template #default="{ row }">
{{ formatDispatchTransportType(row.transportType) || '-' }}
</template>
</el-table-column>
<el-table-column
prop="carrierType"
label="承运类型"
@@ -4556,6 +4687,7 @@ import { getToken } from '@/utils/auth';
import { openImportDialog } from '@/utils/import-excel';
import { applyTableMenuWidth } from '@/utils/table-menu';
import { downloadFileByUrl, downloadXls } from '@/utils/util';
import { isMobile } from '@/utils/validate';
import { List, Location, Rank, Search } from '@element-plus/icons-vue';
import { mapGetters } from 'vuex';
import NProgress from 'nprogress';
@@ -4927,6 +5059,8 @@ export default {
taskQuantityUnitLoading: false,
taskFeeUnitOptions: [],
taskFeeUnitLoading: false,
dispatchTransportTypeOptions: [],
dispatchTransportTypeLoading: false,
cargoImportBox: false,
cargoImportLoading: false,
cargoImportRows: [],
@@ -5141,6 +5275,9 @@ export default {
isCarrierMode() {
return this.form.carrierType === '承运商';
},
showRoadEscortFields() {
return this.isRoadTransport && !this.isCarrierMode;
},
taskCargoOptions() {
return this.getTaskCargoOptionsByPath(this.form.cargoTypePath);
},
@@ -5186,9 +5323,12 @@ export default {
row.cargoQuantity ||
row.goodsQuantity ||
row.totalQuantity ||
row.totalCargoQuantity
row.totalCargoQuantity
);
});
this.parseJsonArray(this.dispatchRow.dispatchRows).forEach(row => {
addQuantity(this.getDispatchQuantityUnit(row), 'assigned', row.quantity);
});
this.dispatchRows.forEach(row => {
addQuantity(this.getDispatchQuantityUnit(row), 'assigned', row.quantity);
});
@@ -5467,6 +5607,9 @@ export default {
transportMode() {
return this.resolveTransportMode(this.form.transportType);
},
hasTransportType() {
return !this.isBillingFieldEmpty(this.form.transportType);
},
transportStationMode() {
return ['water', 'rail', 'air'].includes(this.transportMode);
},
@@ -5544,14 +5687,16 @@ export default {
const text = String(value || '').trim();
if (!text) return '-';
const cityIndex = text.indexOf('市');
const districtStart = cityIndex > -1 ? cityIndex + 1 : 0;
const provinceIndex = Math.max(text.lastIndexOf('省', cityIndex), text.lastIndexOf('自治区', cityIndex));
const cityStart = provinceIndex > -1 ? provinceIndex + 1 : 0;
const districtStart = cityIndex > -1 ? cityIndex + 1 : cityStart;
const districtMatch = text
.slice(districtStart)
.match(/(?:自治县|自治旗|林区|矿区|新区|开发区|区|县|旗)/);
if (districtMatch) {
return text.slice(0, districtStart + districtMatch.index + districtMatch[0].length);
return text.slice(cityStart, districtStart + districtMatch.index + districtMatch[0].length);
}
return cityIndex > -1 ? text.slice(0, cityIndex + 1) : text;
return cityIndex > -1 ? text.slice(cityStart, cityIndex + 1) : text;
},
hasPermission(code) {
return this.isAdmin || this.validData(this.permission && this.permission[code], false);
@@ -5734,6 +5879,7 @@ export default {
].forEach(key => delete row[key]);
this.suppressTransportTypeClear = true;
Object.assign(this.form, row);
this.applyWaybillTemplateTaskData(row);
this.$nextTick(() => {
this.suppressTransportTypeClear = false;
});
@@ -5752,6 +5898,44 @@ export default {
});
});
},
applyWaybillTemplateTaskData(template = {}) {
if (this.config.permission !== 'waybill_manage') return;
const goodsRows = this.parseJsonArray(template.goodsJson);
if (!goodsRows.length) return;
const freight = this.parseJsonObject(template.freightJson);
const freightItems = Array.isArray(freight.freightItems) ? freight.freightItems : [];
const enrichedGoodsRows = goodsRows.map((goods, index) => {
const freightItem = freightItems[index] || {};
return {
...goods,
unitPrice: freightItem.unitPrice ?? goods.unitPrice ?? '',
priceUnit: freightItem.priceUnit || goods.priceUnit || '',
};
});
this.form.goodsJson = JSON.stringify(enrichedGoodsRows);
this.taskFreightCurrency = freight.currency || this.taskFreightCurrency || 'CNY';
this.form.otherFeeTotal =
freight.otherFreightAmount ?? freight.otherFeeTotal ?? this.form.otherFeeTotal ?? '';
if (enrichedGoodsRows.length > 1) {
this.form.taskEntryMode = 'full';
return;
}
const [goods] = enrichedGoodsRows;
this.form.taskEntryMode = 'simple';
Object.assign(this.form, {
cargoType: goods.cargoType || goods.goodsType || '',
cargoTypeCode: goods.cargoTypeCode || goods.goodsTypeCode || '',
cargoName: goods.cargoName || goods.goodsName || '',
specification: goods.specification || goods.spec || '',
model: goods.model || goods.modelName || '',
quantity: goods.quantity ?? goods.cargoQuantity ?? goods.goodsQuantity ?? '',
quantityUnit: goods.quantityUnit || goods.goodsQuantityUnit || goods.unit || '吨',
unitPrice: goods.unitPrice,
priceUnit: goods.priceUnit || '元/吨',
});
},
canOperation(operation, row) {
const permission = operation.permission || `${this.config.permission}_${operation.action}`;
if (!this.hasPermission(permission) || this.readonlyScope || row.readonly) {
@@ -6208,6 +6392,19 @@ export default {
normalizeRow(row, saveAsDraft = false) {
const submitRow = { ...row };
const skipValidation = saveAsDraft && this.config.skipDraftValidation === true;
if (
['shipping_template', 'transport_plan', 'waybill_manage'].includes(
this.config.permission
) &&
!this.validateMobileFields([
[submitRow.departurePhone, '发货联系方式'],
[submitRow.arrivalPhone, '收货联系方式'],
[submitRow.driverPhone, this.isNonRoadTransport ? '联系电话' : '手机号'],
[submitRow.escortPhone, '押运人手机号'],
])
) {
return false;
}
if (this.config.enableTransportPlanForm) {
if (!skipValidation && !this.validateTransportPlanForm(submitRow)) return false;
submitRow.goodsJson = JSON.stringify(this.transportCargoRows);
@@ -6265,6 +6462,14 @@ export default {
});
return submitRow;
},
validateMobileFields(fields = []) {
const invalidField = fields.find(
([value]) => String(value || '').trim() && !isMobile(value)
);
if (!invalidField) return true;
this.$message.warning(`${invalidField[1]}格式不正确`);
return false;
},
validateTransportPlanForm(row) {
const requiredFields = this.config.transportFormRequiredFields || [
['projectName', '项目'],
@@ -6289,6 +6494,10 @@ export default {
this.$message.warning('备注不能超过200个字符');
return false;
}
if (row.basicRemark && row.basicRemark.length > 200) {
this.$message.warning('基本信息备注不能超过200个字符');
return false;
}
for (const [index, cargo] of this.transportCargoRows.entries()) {
if (!cargo.cargoType) {
this.$message.warning(`${index + 1}行货物类型不能为空`);
@@ -6808,7 +7017,10 @@ export default {
},
applyFormDetail(row) {
this.suppressTransportTypeClear = true;
this.form = row || {};
this.form = { ...(row || {}) };
['quantity', 'mileage', 'unitPrice'].forEach(prop => {
if (Number(this.form[prop]) === -1) this.form[prop] = '';
});
this.$nextTick(() => {
this.suppressTransportTypeClear = false;
});
@@ -7204,8 +7416,12 @@ export default {
this.form.quantity = this.form.quantity || taskInfo.quantity || goodsInfo.quantity || '';
this.form.quantityUnit =
this.form.quantityUnit || taskInfo.quantityUnit || goodsInfo.quantityUnit || '吨';
this.form.mileage = this.form.mileage || taskInfo.mileage || goodsInfo.mileage || '';
const mileage = this.form.mileage || taskInfo.mileage || goodsInfo.mileage || '';
this.form.mileage = Number(mileage) === -1 ? '' : mileage;
this.form.unitPrice = this.form.unitPrice || taskInfo.unitPrice || goodsInfo.unitPrice || '';
['quantity', 'mileage', 'unitPrice'].forEach(prop => {
if (Number(this.form[prop]) === -1) this.form[prop] = '';
});
this.form.priceUnit =
this.form.priceUnit || taskInfo.priceUnit || goodsInfo.priceUnit || '元/吨';
this.form.otherFeeTotal =
@@ -7541,7 +7757,7 @@ export default {
['carrierType', '承运类型'],
['vehicleNo', this.transportVehicleNoLabel],
];
if (this.isRoadTransport && row.carrierType === '承运商') {
if (row.carrierType === '承运商') {
requiredFields.push(['carrierName', '承运商']);
}
if (this.isRoadTransport && row.carrierType === '自运') {
@@ -7556,11 +7772,9 @@ export default {
const numberFields = [
['quantity', '数量'],
['mileage', '里程'],
['otherFeeTotal', '其他费用合计'],
];
if (!this.isTaskFullMode) numberFields.push(['unitPrice', '单价']);
if (this.isTaskFullMode) {
numberFields.push(['otherFeeTotal', '其他运费合计']);
}
const invalidField = numberFields.find(([prop]) => {
const value = row[prop];
return value !== undefined && value !== null && value !== '' && Number(value) < 0;
@@ -7614,6 +7828,9 @@ export default {
},
syncTaskInfoToRow(row) {
row.taskEntryMode = row.taskEntryMode || 'simple';
['quantity', 'mileage', 'unitPrice'].forEach(prop => {
if (this.isBillingFieldEmpty(row[prop]) || Number(row[prop]) === -1) row[prop] = '';
});
const taskInfo = {
taskEntryMode: row.taskEntryMode,
carrierType: row.carrierType,
@@ -7728,6 +7945,9 @@ export default {
this.transportCargoRows = this.parseJsonArray(this.form.goodsJson).map(row =>
this.normalizeTransportCargoRow(row)
);
if (!this.transportCargoRows.length) {
this.transportCargoRows.push(this.normalizeTransportCargoRow());
}
this.initShippingTemplateFreight();
this.syncTransportCargoJson();
this.syncCurrentContractOption();
@@ -7752,7 +7972,7 @@ export default {
});
},
normalizeTransportCargoRow(row = {}) {
return {
const cargo = {
...defaultTransportCargo(),
...row,
cargoTypePath: this.normalizeBillingCargoTypePath(row.cargoTypePath),
@@ -7768,6 +7988,10 @@ export default {
packageType: row.packageType || row.package || '',
specification: row.specification || row.spec || '',
};
['quantity', 'mileage', 'unitPrice'].forEach(prop => {
if (Number(cargo[prop]) === -1) cargo[prop] = '';
});
return cargo;
},
syncTransportCargoJson() {
if (!this.config.enableTransportPlanForm && !this.isTaskFullMode) return;
@@ -7780,7 +8004,13 @@ export default {
priceUnit: this.form.priceUnit || '元/吨',
...row,
});
if (index > -1) {
if (
index < 0 &&
this.transportCargoRows.length === 1 &&
this.isEmptyTransportCargoRow(this.transportCargoRows[0])
) {
this.transportCargoRows.splice(0, 1, nextRow);
} else if (index > -1) {
this.transportCargoRows.splice(index + 1, 0, nextRow);
} else {
this.transportCargoRows.push(nextRow);
@@ -7788,6 +8018,22 @@ export default {
this.syncShippingTemplateFreightItems();
this.syncTransportCargoJson();
},
isEmptyTransportCargoRow(row = {}) {
return ![
row.cargoName,
row.cargoType,
row.cargoTypeCode,
row.quantity,
row.quantityUnit,
row.packageType,
row.brand,
row.specification,
row.model,
row.materialCode,
row.deviceCode,
row.remark,
].some(value => !this.isBillingFieldEmpty(value));
},
removeTransportCargoRow(index) {
if (this.config.enableShippingTemplateFreight && this.transportMode === 'road') {
this.shippingTemplateFreight.freightItems.splice(index, 1);
@@ -8128,7 +8374,10 @@ export default {
this.transportAddressBox = true;
},
openTransportAddressPicker(target) {
if (this.transportStationMode) {
if (
this.transportStationMode &&
!(this.isTransportPlanPage && this.transportMode === 'water')
) {
this.openTransportStationDialog(target);
return;
}
@@ -10126,6 +10375,7 @@ export default {
this.dispatchBox = true;
this.dispatchLoading = true;
this.dispatchRows = [];
this.loadDispatchTransportTypeOptions();
const request =
this.api && typeof this.api.getDetail === 'function'
? this.api.getDetail(row.id)
@@ -10143,6 +10393,26 @@ export default {
this.dispatchLoading = false;
});
},
loadDispatchTransportTypeOptions() {
if (this.dispatchTransportTypeOptions.length || this.dispatchTransportTypeLoading) {
return Promise.resolve(this.dispatchTransportTypeOptions);
}
this.dispatchTransportTypeLoading = true;
return getDictionary({ code: 'transport_type' })
.then(res => {
this.dispatchTransportTypeOptions = this.normalizeDictOptions(res.data?.data || []);
return this.dispatchTransportTypeOptions;
})
.finally(() => {
this.dispatchTransportTypeLoading = false;
});
},
formatDispatchTransportType(value) {
const item = this.dispatchTransportTypeOptions.find(
option => String(option.value) === String(value ?? '')
);
return item?.label || value || '';
},
resetDispatchDialog() {
this.dispatchRow = {};
this.dispatchRows = [];
@@ -10364,7 +10634,17 @@ export default {
}, 0);
const currentQuantity = this.parseDispatchQuantity(nextRow.quantity);
const totalQuantity = this.getDispatchSummaryItem(quantityUnit)?.total || 0;
if (totalQuantity > 0 && otherDispatchedQuantity + currentQuantity > totalQuantity) {
const persistedDispatchedQuantity = this.parseJsonArray(this.dispatchRow.dispatchRows).reduce(
(total, row) => {
if (this.getDispatchQuantityUnit(row) !== quantityUnit) return total;
return total + this.parseDispatchQuantity(row.quantity);
},
0
);
if (
totalQuantity > 0 &&
persistedDispatchedQuantity + otherDispatchedQuantity + currentQuantity > totalQuantity
) {
this.$message.warning(
`已调度${quantityUnit}合计不能超过总数量${this.formatDispatchQuantity(
totalQuantity
@@ -10445,6 +10725,18 @@ export default {
this.$message.warning('请先添加调度明细');
return false;
}
for (const [index, row] of this.dispatchRows.entries()) {
const invalidField = [
[row.departurePhone, '发货联系方式'],
[row.arrivalPhone, '收货联系方式'],
[row.driverPhone, '手机号'],
[row.escortPhone, '押运人手机号'],
].find(([value]) => String(value || '').trim() && !isMobile(value));
if (invalidField) {
this.$message.warning(`${index + 1}条调度明细的${invalidField[1]}格式不正确`);
return false;
}
}
if (mode === 'draft') return true;
const invalidRow = this.dispatchRows.find(row => {
const selfTransport = row.carrierType !== '承运商';
@@ -11438,7 +11730,7 @@ export default {
&__dispatch-shell {
display: flex;
flex-direction: column;
min-height: calc(100vh - 140px);
min-height: calc(100vh - 240px);
}
&__dispatch-top {