修复业务模块bug
This commit is contained in:
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user