🐛 修复车务非必填-1展示,并完善总单调度与运单表单体验
调度页限制上一段到达后才可调度;司机候选项点击展开;车务多模块-1显示为空;同步配载/总单编辑与导入相关优化。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -9,6 +9,7 @@
|
||||
><el-select
|
||||
v-model="form.projectId"
|
||||
filterable
|
||||
:disabled="isBasicRouteReadonly"
|
||||
placeholder="请输入并选择"
|
||||
@change="projectChange"
|
||||
><el-option
|
||||
@@ -20,7 +21,7 @@
|
||||
><el-form-item label="客户合同" prop="contractName"
|
||||
><el-select
|
||||
v-model="form.contractId"
|
||||
:disabled="!form.projectId"
|
||||
:disabled="isBasicRouteReadonly || !form.projectId"
|
||||
placeholder="选择项目后带出"
|
||||
@change="contractChange"
|
||||
><el-option
|
||||
@@ -41,6 +42,7 @@
|
||||
><el-form-item label="备注"
|
||||
><el-input
|
||||
v-model="form.remark"
|
||||
:disabled="isBasicRouteReadonly"
|
||||
maxlength="200"
|
||||
show-word-limit
|
||||
placeholder="请输入" /></el-form-item></el-col></el-row
|
||||
@@ -49,7 +51,7 @@
|
||||
<section>
|
||||
<div class="section-head">
|
||||
<h3>收发货信息</h3>
|
||||
<div class="section-head__actions">
|
||||
<div v-if="!isBasicRouteReadonly" class="section-head__actions">
|
||||
<el-link type="primary" @click="addRoute">新增途经点</el-link>
|
||||
<el-link type="primary" @click="openRouteDialog">选择线路</el-link>
|
||||
</div>
|
||||
@@ -62,13 +64,13 @@
|
||||
<div class="route-node-form">
|
||||
<el-form-item label="发货地" required class="route-address-form-item"
|
||||
><div class="route-address-inputs"
|
||||
><el-input v-if="isNonRoadAddress('departure')" v-model="form.departureName" class="route-address-name" readonly placeholder="请选择站点" /><el-cascader v-else v-model="addressRegionPaths.departure" class="route-address-name" :options="regionOptions" :props="regionCascaderProps" :loading="regionLoading" placeholder="请选择省市区" clearable filterable @visible-change="visible => visible && loadRegionOptions()" @change="value => handleAddressRegionChange('departure', value)" /><el-input v-model="form.departureAddress" class="route-address-detail" readonly placeholder="请输入详细地址" @click="handleAddressDetailClick('departure')" /><el-tooltip content="选择常用地址" placement="top"><el-button class="address-picker-button" type="primary" link :icon="OfficeBuilding" @click="openCommonAddress('departure')" /></el-tooltip></div
|
||||
><el-input v-if="isNonRoadAddress('departure')" v-model="form.departureName" class="route-address-name" readonly :disabled="isBasicRouteReadonly" placeholder="请选择站点" /><el-cascader v-else v-model="addressRegionPaths.departure" class="route-address-name" :options="regionOptions" :props="regionCascaderProps" :loading="regionLoading" :disabled="isBasicRouteReadonly" placeholder="请选择省市区" clearable filterable @visible-change="visible => visible && loadRegionOptions()" @change="value => handleAddressRegionChange('departure', value)" /><el-input v-model="form.departureAddress" class="route-address-detail" readonly :disabled="isBasicRouteReadonly" placeholder="请输入详细地址" @click="handleAddressDetailClick('departure')" /><el-tooltip content="选择常用地址" placement="top"><el-button class="address-picker-button" type="primary" link :icon="OfficeBuilding" :disabled="isBasicRouteReadonly" @click="openCommonAddress('departure')" /></el-tooltip></div
|
||||
></el-form-item>
|
||||
<el-form-item label="联系人" class="route-contact-form-item"
|
||||
><el-input v-model="form.departureContact" placeholder="请输入"
|
||||
><el-input v-model="form.departureContact" :disabled="isBasicRouteReadonly" placeholder="请输入"
|
||||
/></el-form-item>
|
||||
<el-form-item label="联系方式" class="route-phone-form-item"
|
||||
><el-input v-model="form.departurePhone" placeholder="请输入"
|
||||
><el-input v-model="form.departurePhone" :disabled="isBasicRouteReadonly" placeholder="请输入"
|
||||
/></el-form-item>
|
||||
<el-form-item label="计划开始" class="route-date-form-item"
|
||||
><el-date-picker
|
||||
@@ -76,6 +78,7 @@
|
||||
type="date"
|
||||
format="YYYY-MM-DD"
|
||||
value-format="YYYY-MM-DD"
|
||||
:disabled="isBasicRouteReadonly"
|
||||
placeholder="请选择"
|
||||
/></el-form-item>
|
||||
</div>
|
||||
@@ -83,7 +86,7 @@
|
||||
</div>
|
||||
<template v-for="(route, index) in form.routes" :key="index">
|
||||
<div class="route-flow-segment">
|
||||
<div class="route-step-title"><span class="route-segment-label">{{ circledSegmentNumber(index + 1) }} 段{{ index + 1 }}</span><el-tooltip :content="getRouteTitle(index).replace(`段${index + 1}:`, '')" placement="top"><span class="route-title-path">{{ formatRouteTitle(getRouteTitle(index), index + 1) }}</span></el-tooltip><div class="route-transport-control"><span>运输方式<span class="required-asterisk">*</span></span><el-select v-model="route.transportType" placeholder="请选择"><el-option v-for="type in transports" :key="type" :label="type" :value="type" /></el-select></div></div>
|
||||
<div class="route-step-title"><span class="route-segment-label">{{ circledSegmentNumber(index + 1) }} 段{{ index + 1 }}</span><el-tooltip :content="getRouteTitle(index).replace(`段${index + 1}:`, '')" placement="top"><span class="route-title-path">{{ formatRouteTitle(getRouteTitle(index), index + 1) }}</span></el-tooltip><div class="route-transport-control"><span>运输方式<span class="required-asterisk">*</span></span><el-select v-model="route.transportType" :disabled="isBasicRouteReadonly" placeholder="请选择"><el-option v-for="type in transports" :key="type" :label="type" :value="type" /></el-select></div></div>
|
||||
</div>
|
||||
<div class="route-flow-row">
|
||||
<span class="route-flow-marker route-flow-marker--middle">经</span>
|
||||
@@ -91,16 +94,16 @@
|
||||
<div class="route-node-form">
|
||||
<el-form-item label="途经地" required class="route-address-form-item"
|
||||
><div class="route-address-inputs"
|
||||
><el-input v-if="isNonRoadAddress(`route-${index}`)" v-model="route.departureName" class="route-address-name" readonly :disabled="!route.transportType" placeholder="请先选择运输方式" /><el-cascader v-else v-model="addressRegionPaths[`route-${index}`]" class="route-address-name" :options="regionOptions" :props="regionCascaderProps" :loading="regionLoading" :disabled="!route.transportType" placeholder="请选择省市区" clearable filterable @visible-change="visible => visible && loadRegionOptions()" @change="value => handleAddressRegionChange(`route-${index}`, value)" /><el-input v-model="route.departureAddress" class="route-address-detail" readonly :disabled="!route.transportType" placeholder="请先选择运输方式" @click="handleAddressDetailClick(`route-${index}`)" /><el-tooltip content="选择常用地址" placement="top"><el-button class="address-picker-button" type="primary" link :icon="OfficeBuilding" :disabled="!route.transportType" @click="openCommonAddress(`route-${index}`)" /></el-tooltip></div
|
||||
><el-input v-if="isNonRoadAddress(`route-${index}`)" v-model="route.departureName" class="route-address-name" readonly :disabled="isBasicRouteReadonly || !route.transportType" placeholder="请先选择运输方式" /><el-cascader v-else v-model="addressRegionPaths[`route-${index}`]" class="route-address-name" :options="regionOptions" :props="regionCascaderProps" :loading="regionLoading" :disabled="isBasicRouteReadonly || !route.transportType" placeholder="请选择省市区" clearable filterable @visible-change="visible => visible && loadRegionOptions()" @change="value => handleAddressRegionChange(`route-${index}`, value)" /><el-input v-model="route.departureAddress" class="route-address-detail" readonly :disabled="isBasicRouteReadonly || !route.transportType" placeholder="请先选择运输方式" @click="handleAddressDetailClick(`route-${index}`)" /><el-tooltip content="选择常用地址" placement="top"><el-button class="address-picker-button" type="primary" link :icon="OfficeBuilding" :disabled="isBasicRouteReadonly || !route.transportType" @click="openCommonAddress(`route-${index}`)" /></el-tooltip></div
|
||||
></el-form-item>
|
||||
<el-form-item label="联系人" class="route-contact-form-item"><el-input v-model="route.departureContact" placeholder="请输入" /></el-form-item>
|
||||
<el-form-item label="联系方式" class="route-phone-form-item"><div class="route-contact-actions"><el-input v-model="route.departurePhone" placeholder="请输入" /><el-tooltip v-if="index === form.routes.length - 1" content="新增途经点" placement="top"><el-button class="route-action-button" type="primary" link @click="addRoute"><el-icon><CirclePlus /></el-icon></el-button></el-tooltip><el-tooltip content="删除途经点" placement="top"><el-button class="route-action-button" type="danger" link @click="removeRoute(index)"><el-icon><Remove /></el-icon></el-button></el-tooltip></div></el-form-item>
|
||||
<el-form-item label="联系人" class="route-contact-form-item"><el-input v-model="route.departureContact" :disabled="isBasicRouteReadonly" placeholder="请输入" /></el-form-item>
|
||||
<el-form-item label="联系方式" class="route-phone-form-item"><div class="route-contact-actions"><el-input v-model="route.departurePhone" :disabled="isBasicRouteReadonly" placeholder="请输入" /><template v-if="!isBasicRouteReadonly"><el-tooltip v-if="index === form.routes.length - 1" content="新增途经点" placement="top"><el-button class="route-action-button" type="primary" link @click="addRoute"><el-icon><CirclePlus /></el-icon></el-button></el-tooltip><el-tooltip content="删除途经点" placement="top"><el-button class="route-action-button" type="danger" link @click="removeRoute(index)"><el-icon><Remove /></el-icon></el-button></el-tooltip></template></div></el-form-item>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<div class="route-flow-segment">
|
||||
<div class="route-step-title"><span class="route-segment-label">{{ circledSegmentNumber(form.routes.length + 1) }} 段{{ form.routes.length + 1 }}</span><el-tooltip :content="getFinalRouteTitle().replace(`段${form.routes.length + 1}:`, '')" placement="top"><span class="route-title-path">{{ formatRouteTitle(getFinalRouteTitle(), form.routes.length + 1) }}</span></el-tooltip><div class="route-transport-control"><span>运输方式<span class="required-asterisk">*</span></span><el-select v-model="form.finalTransportType" placeholder="请选择"><el-option v-for="type in transports" :key="type" :label="type" :value="type" /></el-select></div></div>
|
||||
<div class="route-step-title"><span class="route-segment-label">{{ circledSegmentNumber(form.routes.length + 1) }} 段{{ form.routes.length + 1 }}</span><el-tooltip :content="getFinalRouteTitle().replace(`段${form.routes.length + 1}:`, '')" placement="top"><span class="route-title-path">{{ formatRouteTitle(getFinalRouteTitle(), form.routes.length + 1) }}</span></el-tooltip><div class="route-transport-control"><span>运输方式<span class="required-asterisk">*</span></span><el-select v-model="form.finalTransportType" :disabled="isBasicRouteReadonly" placeholder="请选择"><el-option v-for="type in transports" :key="type" :label="type" :value="type" /></el-select></div></div>
|
||||
</div>
|
||||
<div class="route-flow-row">
|
||||
<span class="route-flow-marker route-flow-marker--end">终</span>
|
||||
@@ -108,18 +111,19 @@
|
||||
<div class="route-node-form">
|
||||
<el-form-item label="收货地" required class="route-address-form-item"
|
||||
><div class="route-address-inputs"
|
||||
><el-input v-if="isNonRoadAddress('arrival')" v-model="form.arrivalName" class="route-address-name" readonly :disabled="!form.finalTransportType" placeholder="请先选择运输方式" /><el-cascader v-else v-model="addressRegionPaths.arrival" class="route-address-name" :options="regionOptions" :props="regionCascaderProps" :loading="regionLoading" :disabled="!form.finalTransportType" placeholder="请选择省市区" clearable filterable @visible-change="visible => visible && loadRegionOptions()" @change="value => handleAddressRegionChange('arrival', value)" /><el-input v-model="form.arrivalAddress" class="route-address-detail" readonly :disabled="!form.finalTransportType" placeholder="请先选择运输方式" @click="handleAddressDetailClick('arrival')" /><el-tooltip content="选择常用地址" placement="top"><el-button class="address-picker-button" type="primary" link :icon="OfficeBuilding" :disabled="!form.finalTransportType" @click="openCommonAddress('arrival')" /></el-tooltip></div
|
||||
><el-input v-if="isNonRoadAddress('arrival')" v-model="form.arrivalName" class="route-address-name" readonly :disabled="isBasicRouteReadonly || !form.finalTransportType" placeholder="请先选择运输方式" /><el-cascader v-else v-model="addressRegionPaths.arrival" class="route-address-name" :options="regionOptions" :props="regionCascaderProps" :loading="regionLoading" :disabled="isBasicRouteReadonly || !form.finalTransportType" placeholder="请选择省市区" clearable filterable @visible-change="visible => visible && loadRegionOptions()" @change="value => handleAddressRegionChange('arrival', value)" /><el-input v-model="form.arrivalAddress" class="route-address-detail" readonly :disabled="isBasicRouteReadonly || !form.finalTransportType" placeholder="请先选择运输方式" @click="handleAddressDetailClick('arrival')" /><el-tooltip content="选择常用地址" placement="top"><el-button class="address-picker-button" type="primary" link :icon="OfficeBuilding" :disabled="isBasicRouteReadonly || !form.finalTransportType" @click="openCommonAddress('arrival')" /></el-tooltip></div
|
||||
></el-form-item>
|
||||
<el-form-item label="联系人" class="route-contact-form-item"
|
||||
><el-input v-model="form.arrivalContact" placeholder="请输入" /></el-form-item>
|
||||
><el-input v-model="form.arrivalContact" :disabled="isBasicRouteReadonly" placeholder="请输入" /></el-form-item>
|
||||
<el-form-item label="联系方式" class="route-phone-form-item"
|
||||
><el-input v-model="form.arrivalPhone" placeholder="请输入" /></el-form-item>
|
||||
><el-input v-model="form.arrivalPhone" :disabled="isBasicRouteReadonly" placeholder="请输入" /></el-form-item>
|
||||
<el-form-item label="计划结束" class="route-date-form-item"
|
||||
><el-date-picker
|
||||
v-model="form.planEndTime"
|
||||
type="date"
|
||||
format="YYYY-MM-DD"
|
||||
value-format="YYYY-MM-DD"
|
||||
:disabled="isBasicRouteReadonly"
|
||||
placeholder="请选择"
|
||||
/></el-form-item>
|
||||
</div>
|
||||
@@ -144,6 +148,7 @@
|
||||
><el-autocomplete
|
||||
v-model="row.cargoName"
|
||||
clearable
|
||||
:disabled="isGoodsCategoryLocked(row)"
|
||||
placeholder="请输入货物名称"
|
||||
:debounce="300"
|
||||
:fetch-suggestions="
|
||||
@@ -168,22 +173,29 @@
|
||||
:placeholder="row.cargoType || '请选择'"
|
||||
clearable
|
||||
filterable
|
||||
:disabled="isGoodsCategoryLocked(row)"
|
||||
:loading="cargoTypeLoading"
|
||||
@visible-change="visible => visible && loadCargoTypeOptions()"
|
||||
@change="value => handleCargoTypeChange(row, value)"
|
||||
/></template></el-table-column
|
||||
><el-table-column label="数量" width="180" class-name="master-editor__quantity-cell"
|
||||
><el-table-column label="数量" width="200" class-name="master-editor__quantity-cell"
|
||||
><template #header><span>数量<span class="required-asterisk">*</span></span></template>
|
||||
<template #default="{ row }"
|
||||
><el-input
|
||||
v-model="row.quantity"
|
||||
inputmode="decimal"
|
||||
placeholder="请输入"
|
||||
@input="value => handleQuantityInput(row, value)" /></template></el-table-column
|
||||
><div class="master-editor__quantity-field"
|
||||
><el-input
|
||||
v-model="row.quantity"
|
||||
inputmode="decimal"
|
||||
placeholder="请输入"
|
||||
@input="value => handleQuantityInput(row, value)"
|
||||
@blur="() => enforceMinDispatchedQuantity(row)"
|
||||
/><small v-if="dispatchedQuantityOf(row) > 0" class="master-editor__quantity-hint"
|
||||
>已调度 {{ formatDispatchedQuantity(dispatchedQuantityOf(row)) }},不可低于此值</small
|
||||
></div
|
||||
></template></el-table-column
|
||||
><el-table-column label="数量单位" width="120"
|
||||
><template #header><span>数量单位<span class="required-asterisk">*</span></span></template>
|
||||
<template #default="{ row }"
|
||||
><el-select v-model="row.quantityUnit"
|
||||
><el-select v-model="row.quantityUnit" :disabled="isGoodsCategoryLocked(row)"
|
||||
><el-option v-for="unit in quantityUnitOptions" :key="unit" :label="unit" :value="unit" /></el-select></template></el-table-column
|
||||
><el-table-column label="包装" width="130"
|
||||
><template #default="{ row }"
|
||||
@@ -218,7 +230,7 @@
|
||||
>新增</el-link
|
||||
><el-link
|
||||
type="danger"
|
||||
:disabled="form.goods.length === 1"
|
||||
:disabled="form.goods.length === 1 || isGoodsCategoryLocked(form.goods[$index])"
|
||||
@click="removeGoods($index)"
|
||||
>删除</el-link
|
||||
></div
|
||||
@@ -272,10 +284,9 @@
|
||||
</el-table-column>
|
||||
<el-table-column prop="uploadUserName" label="上传人" width="140" align="center" />
|
||||
<el-table-column prop="uploadTime" label="上传时间" width="170" align="center" sortable />
|
||||
<el-table-column label="操作" width="120" align="center" fixed="right">
|
||||
<template #default="{ row, $index }">
|
||||
<el-table-column label="操作" width="80" align="center" fixed="right">
|
||||
<template #default="{ $index }">
|
||||
<el-link type="danger" @click="removeAttachment($index)">删除</el-link>
|
||||
<el-link type="primary" @click="downloadAttachment(row)">下载</el-link>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
@@ -707,6 +718,31 @@ export default {
|
||||
},
|
||||
computed: {
|
||||
...mapGetters(['userInfo']),
|
||||
// 非草稿编辑:基本信息与收发货路线只读
|
||||
isBasicRouteReadonly() {
|
||||
return Boolean(this.id) && Boolean(this.form.businessStatus) && this.form.businessStatus !== 'draft';
|
||||
},
|
||||
// 品类 → 已调度量(各分段取最大值;优先用详情返回的 dispatchedGoods)
|
||||
dispatchedGoodsMap() {
|
||||
const map = {};
|
||||
const source = this.form.dispatchedGoods;
|
||||
if (source && typeof source === 'object' && !Array.isArray(source)) {
|
||||
Object.entries(source).forEach(([key, qty]) => {
|
||||
const number = Number(qty);
|
||||
if (Number.isFinite(number)) map[key] = number;
|
||||
});
|
||||
return map;
|
||||
}
|
||||
(this.form.routeProgress || []).forEach(route => {
|
||||
const goods = route?.dispatchedGoods || {};
|
||||
Object.entries(goods).forEach(([key, qty]) => {
|
||||
const number = Number(qty);
|
||||
if (!Number.isFinite(number)) return;
|
||||
map[key] = Math.max(map[key] || 0, number);
|
||||
});
|
||||
});
|
||||
return map;
|
||||
},
|
||||
lastRouteName() {
|
||||
return this.form.routes[this.form.routes.length - 1]?.departureName || '途经地';
|
||||
},
|
||||
@@ -1105,6 +1141,7 @@ export default {
|
||||
return row.regionCode || row.districtCode || row.areaCode || row.adcode || '';
|
||||
},
|
||||
openCommonAddress(target) {
|
||||
if (this.isBasicRouteReadonly) return;
|
||||
this.addressTarget = target;
|
||||
if (this.addressTransportMode(target) !== 'road') {
|
||||
this.stationQuery = {};
|
||||
@@ -1210,6 +1247,7 @@ export default {
|
||||
this.loadRegionOptions().then(() => this.syncAddressRegionPath(this.addressTarget));
|
||||
},
|
||||
handleAddressDetailClick(target) {
|
||||
if (this.isBasicRouteReadonly) return;
|
||||
if (this.addressTransportMode(target) !== 'road') {
|
||||
this.openCommonAddress(target);
|
||||
return;
|
||||
@@ -1217,6 +1255,7 @@ export default {
|
||||
this.openAddressMap(target);
|
||||
},
|
||||
openAddressMap(target) {
|
||||
if (this.isBasicRouteReadonly) return;
|
||||
if (this.addressTransportMode(target) !== 'road') {
|
||||
this.$message.info('非公路运输地址不能使用地图选择');
|
||||
return;
|
||||
@@ -1657,6 +1696,7 @@ export default {
|
||||
});
|
||||
},
|
||||
openRouteDialog() {
|
||||
if (this.isBasicRouteReadonly) return;
|
||||
this.routeQuery = {};
|
||||
this.routePage.current = 1;
|
||||
this.routeDialogVisible = true;
|
||||
@@ -1714,12 +1754,28 @@ export default {
|
||||
return { segmentNo: `段${index + 1}`, transportType: '' };
|
||||
},
|
||||
addRoute() {
|
||||
if (this.isBasicRouteReadonly) return;
|
||||
this.form.routes.push(this.createRoute());
|
||||
},
|
||||
removeRoute(index) {
|
||||
if (this.isBasicRouteReadonly) return;
|
||||
this.form.routes.splice(index, 1);
|
||||
this.syncAddressRegionPaths();
|
||||
},
|
||||
goodsKey(row = {}) {
|
||||
return `${row.cargoName || ''}\u0000${row.cargoType || ''}`;
|
||||
},
|
||||
dispatchedQuantityOf(row = {}) {
|
||||
return Number(this.dispatchedGoodsMap[this.goodsKey(row)] || 0);
|
||||
},
|
||||
formatDispatchedQuantity(value) {
|
||||
const number = Number(value);
|
||||
if (!Number.isFinite(number)) return '0';
|
||||
return String(number);
|
||||
},
|
||||
isGoodsCategoryLocked(row = {}) {
|
||||
return this.dispatchedQuantityOf(row) > 0;
|
||||
},
|
||||
addGoods(index) {
|
||||
this.form.goods.splice(index + 1, 0, {
|
||||
quantityUnit: quantityUnitOptions[0],
|
||||
@@ -1729,6 +1785,13 @@ export default {
|
||||
});
|
||||
},
|
||||
removeGoods(index) {
|
||||
const row = this.form.goods[index];
|
||||
if (this.isGoodsCategoryLocked(row)) {
|
||||
this.$message.warning(
|
||||
`货物【${row.cargoName || ''}】已有调度量,不能删除`
|
||||
);
|
||||
return;
|
||||
}
|
||||
if (this.form.goods.length > 1) this.form.goods.splice(index, 1);
|
||||
},
|
||||
handleQuantityInput(row, value) {
|
||||
@@ -1736,6 +1799,42 @@ export default {
|
||||
const [integer = '', ...decimals] = text.split('.');
|
||||
row.quantity = decimals.length ? `${integer}.${decimals.join('').slice(0, 3)}` : integer;
|
||||
},
|
||||
enforceMinDispatchedQuantity(row = {}) {
|
||||
const min = this.dispatchedQuantityOf(row);
|
||||
if (min <= 0) return true;
|
||||
const current = Number(row.quantity);
|
||||
if (!Number.isFinite(current) || current < min) {
|
||||
row.quantity = String(min);
|
||||
this.$message.warning(
|
||||
`货物【${row.cargoName || ''}】数量不能低于已调度量(${this.formatDispatchedQuantity(min)})`
|
||||
);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
},
|
||||
validateGoodsDispatchedQuantity() {
|
||||
const totals = {};
|
||||
(this.form.goods || []).forEach(row => {
|
||||
const key = this.goodsKey(row);
|
||||
totals[key] = (totals[key] || 0) + (Number(row.quantity) || 0);
|
||||
});
|
||||
for (const [key, qty] of Object.entries(this.dispatchedGoodsMap)) {
|
||||
const dispatched = Number(qty) || 0;
|
||||
if (dispatched <= 0) continue;
|
||||
const cargoName = String(key).split('\u0000')[0] || '未知货物';
|
||||
if (!(key in totals)) {
|
||||
this.$message.warning(`货物【${cargoName}】已有调度量,不能删除或变更品类`);
|
||||
return false;
|
||||
}
|
||||
if ((totals[key] || 0) < dispatched) {
|
||||
this.$message.warning(
|
||||
`货物【${cargoName}】数量不能低于已调度量(${this.formatDispatchedQuantity(dispatched)})`
|
||||
);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
},
|
||||
syncAttachmentsJson() {
|
||||
this.form.attachmentsJson = JSON.stringify(this.attachmentRows);
|
||||
},
|
||||
@@ -1858,6 +1957,7 @@ export default {
|
||||
return this.$message.warning(`请完整填写第${invalidRouteIndex + 1}段途经地及运输方式`);
|
||||
if (!this.form.finalTransportType) return this.$message.warning('请填写最后一段运输方式');
|
||||
}
|
||||
if (!this.validateGoodsDispatchedQuantity()) return false;
|
||||
const payload = {
|
||||
...this.form,
|
||||
planStartTime: this.normalizeDateTimeValue(this.form.planStartTime),
|
||||
@@ -1943,6 +2043,16 @@ export default {
|
||||
margin-bottom: 14px;
|
||||
}
|
||||
}
|
||||
.master-editor__quantity-field {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 4px;
|
||||
}
|
||||
.master-editor__quantity-hint {
|
||||
color: #e6a23c;
|
||||
font-size: 12px;
|
||||
line-height: 1.2;
|
||||
}
|
||||
.goods-heading {
|
||||
display: flex;
|
||||
margin-bottom: 8px;
|
||||
|
||||
Reference in New Issue
Block a user