✨ 优化港口地图回填、合同展示与运单导入空值

地图选点回填国家省市区;合同选择显示编号/名称;常用数据组织筛选修正;运单详情将-1费用字段显示为空。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-10-09 17:07:56 +08:00
co-authored by Cursor
parent 570fbeb537
commit a1da644c49
25 changed files with 568 additions and 217 deletions
@@ -212,7 +212,7 @@
<el-option
v-for="item in contractOptions"
:key="item.id"
:label="item.contractName"
:label="formatContractOptionLabel(item)"
:value="item.id"
/>
</el-select>
@@ -3642,6 +3642,7 @@ import { addressTypeOptions } from '@/option/base/common-address';
import { packageOptions } from '@/option/business/common';
import { formatUpdateUserName } from '@/utils/audit';
import { getToken, isAdministrator } from '@/utils/auth';
import { formatContractOptionLabel } from '@/utils/contract';
import { wgs84ToGcj02 } from '@/utils/coordinate';
import { openImportDialog } from '@/utils/import-excel';
import { normalizeMapSearchResults, searchAmapPlaceText } from '@/utils/map-search';
@@ -4724,6 +4725,7 @@ export default {
},
},
methods: {
formatContractOptionLabel,
// 页面被 keep-alive 缓存/卸载时调用,关闭本页所有 append-to-body 的弹窗,
// 避免 Teleport 出去的 DOM 残留在 body 上盖住后续页面(详见 data 里的说明)。
closeInnerDialogs() {
@@ -6958,9 +6960,11 @@ export default {
applyFormDetail(row) {
this.suppressTransportTypeClear = true;
this.form = { ...(row || {}) };
['quantity', 'mileage', 'unitPrice'].forEach(prop => {
if (Number(this.form[prop]) === -1) this.form[prop] = '';
});
['quantity', 'mileage', 'unitPrice', 'otherFeeTotal', 'freight', 'freightTotal'].forEach(
prop => {
if (this.isSentinelMinusOne(this.form[prop])) this.form[prop] = '';
}
);
if ([this.form.planId, this.form.planName].some(value => Number(value) === -1)) {
this.form.planId = '';
this.form.planName = '';
@@ -7371,17 +7375,17 @@ export default {
this.form.quantityUnit || taskInfo.quantityUnit || goodsInfo.quantityUnit || '吨';
const mileage = this.form.mileage || taskInfo.mileage || goodsInfo.mileage || '';
this.form.mileage = this.normalizeMileageValue(mileage);
this.form.unitPrice = this.form.unitPrice || taskInfo.unitPrice || goodsInfo.unitPrice || '';
this.form.unitPrice = this.normalizeOptionalAmount(
this.form.unitPrice || taskInfo.unitPrice || goodsInfo.unitPrice || ''
);
['quantity', 'mileage', 'unitPrice'].forEach(prop => {
if (Number(this.form[prop]) === -1) this.form[prop] = '';
if (this.isSentinelMinusOne(this.form[prop])) this.form[prop] = '';
});
this.form.priceUnit =
this.form.priceUnit || taskInfo.priceUnit || goodsInfo.priceUnit || '元/吨';
this.form.otherFeeTotal =
this.form.otherFeeTotal || taskInfo.otherFeeTotal || goodsInfo.otherFeeTotal || '';
if (Number(this.form.otherFeeTotal) === -1) {
this.form.otherFeeTotal = '';
}
this.form.otherFeeTotal = this.normalizeOptionalAmount(
this.form.otherFeeTotal || taskInfo.otherFeeTotal || goodsInfo.otherFeeTotal || ''
);
this.form.estimatedStartTime =
this.form.estimatedStartTime ||
taskInfo.estimatedStartTime ||
@@ -7463,7 +7467,7 @@ export default {
},
taskFullFreightGroupUnitPrice(group = {}) {
const prices = (group.rows || [])
.map(cargo => String(cargo.unitPrice ?? '').trim())
.map(cargo => this.normalizeOptionalAmount(cargo.unitPrice))
.filter(Boolean);
if (!prices.length || prices.some(price => price !== prices[0])) return '';
return prices[0];
@@ -7526,10 +7530,21 @@ export default {
},
formatTaskFullFreightNumber(value) {
if (value === undefined || value === null || String(value).trim() === '') return '';
const number = Number(value || 0);
if (this.isSentinelMinusOne(value)) return '';
const number = Number(value);
if (!Number.isFinite(number)) return '';
return Number(number.toFixed(2)).toString();
},
isSentinelMinusOne(value) {
if (value === undefined || value === null || value === '') return false;
return Number(value) === -1 || String(value).trim() === '-1';
},
normalizeOptionalAmount(value) {
if (value === undefined || value === null || value === '' || this.isSentinelMinusOne(value)) {
return '';
}
return value;
},
handleTaskCarrierTypeChange(value) {
const nextValue = value || '承运商';
this.form.carrierName = '';
@@ -8082,7 +8097,9 @@ export default {
}
cargo.priceUnit = cargo.priceUnit || this.form.priceUnit || '元/吨';
if (this.isBillingFieldEmpty(cargo.freightAmount)) {
cargo.freightAmount = freightItems[index]?.freightAmount ?? '';
cargo.freightAmount = this.normalizeOptionalAmount(
freightItems[index]?.freightAmount ?? ''
);
}
return cargo;
});
@@ -8274,8 +8291,10 @@ 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] = '';
['quantity', 'mileage', 'unitPrice', 'otherFeeTotal'].forEach(prop => {
if (this.isBillingFieldEmpty(row[prop]) || this.isSentinelMinusOne(row[prop])) {
row[prop] = '';
}
});
const taskInfo = {
taskEntryMode: row.taskEntryMode,
@@ -8300,7 +8319,7 @@ export default {
priceUnit: row.priceUnit,
taskRemark: row.taskRemark,
};
if (!this.isBillingFieldEmpty(row.otherFeeTotal) && Number(row.otherFeeTotal) !== -1) {
if (!this.isBillingFieldEmpty(row.otherFeeTotal) && !this.isSentinelMinusOne(row.otherFeeTotal)) {
taskInfo.otherFeeTotal = row.otherFeeTotal;
} else {
delete row.otherFeeTotal;
@@ -8434,10 +8453,12 @@ export default {
cargoName: row.cargoName || row.goodsName || '',
packageType: row.packageType || row.package || '',
specification: row.specification || row.spec || '',
freightAmount: row.freightAmount ?? row.amount ?? row.totalAmount ?? '',
freightAmount: this.normalizeOptionalAmount(
row.freightAmount ?? row.amount ?? row.totalAmount ?? ''
),
};
['quantity', 'mileage', 'unitPrice'].forEach(prop => {
if (Number(cargo[prop]) === -1) cargo[prop] = '';
['quantity', 'mileage', 'unitPrice', 'freightAmount'].forEach(prop => {
if (this.isSentinelMinusOne(cargo[prop])) cargo[prop] = '';
});
return cargo;
},
@@ -8680,7 +8701,12 @@ export default {
}
},
isBillingFieldEmpty(value) {
return value === undefined || value === null || String(value).trim() === '';
return (
value === undefined ||
value === null ||
String(value).trim() === '' ||
this.isSentinelMinusOne(value)
);
},
ensureTransportTypeBeforeAddress() {
if (!this.shippingInfoFormEnabled || !this.isBillingFieldEmpty(this.form.transportType)) {