Merge remote-tracking branch 'origin/master'

This commit is contained in:
2026-08-14 16:01:17 +08:00
10 changed files with 1611 additions and 517 deletions
+54 -37
View File
@@ -583,6 +583,7 @@
clearable
filterable
placeholder="请选择"
:disabled="dialogMode === 'add'"
@visible-change="visible => visible && loadTransportTypeOptions()"
>
<el-option
@@ -825,27 +826,15 @@
</el-select>
</el-form-item>
<el-form-item label="司机" :required="['自运', '网货平台'].includes(dialogForm.carrierType)">
<el-select
<el-autocomplete
v-model="dialogForm.driverName"
clearable
filterable
allow-create
default-first-option
remote
reserve-keyword
:remote-method="loadDriverOptions"
:debounce="300"
:fetch-suggestions="fetchDriverSuggestions"
:loading="driverLoading"
placeholder="请输入"
@change="handleDriverChange"
@visible-change="visible => visible && loadDriverOptions(dialogForm.driverName)"
>
<el-option
v-for="item in driverOptions"
:key="item.id || item.driverName || item.name"
:label="item.driverName || item.name"
:value="item.driverName || item.name"
/>
</el-select>
@select="item => handleDriverSuggestionSelect('dialog', item)"
/>
</el-form-item>
<el-form-item label="手机号" :required="['自运', '网货平台'].includes(dialogForm.carrierType)">
<el-input v-model="dialogForm.driverPhone" clearable placeholder="请输入" />
@@ -853,13 +842,13 @@
<el-form-item label="车牌号" required>
<el-input v-model="dialogForm.vehicleNo" clearable placeholder="请输入" />
</el-form-item>
<el-form-item label="挂车车牌号">
<el-form-item v-if="dialogForm.carrierType !== '承运商'" label="挂车车牌号">
<el-input v-model="dialogForm.trailerVehicleNo" clearable placeholder="请输入" />
</el-form-item>
<el-form-item label="押运人">
<el-form-item v-if="dialogForm.carrierType !== '承运商'" label="押运人">
<el-input v-model="dialogForm.escortName" clearable placeholder="请输入" />
</el-form-item>
<el-form-item label="押运人手机号">
<el-form-item v-if="dialogForm.carrierType !== '承运商'" label="押运人手机号">
<el-input v-model="dialogForm.escortPhone" clearable placeholder="请输入" />
</el-form-item>
<el-form-item label="里程(km)">
@@ -1047,7 +1036,7 @@ const createDialogForm = () => ({
batchNo: '',
currentProcessNode: '接单',
mileage: '',
estimatedStartDate: dayjs().format('YYYY-MM-DD'),
estimatedStartDate: '',
estimatedEndDate: '',
taskRemark: '',
goodsJson: '',
@@ -1207,6 +1196,13 @@ export default {
mounted() {
this.loadTransportTypeOptions();
this.loadTable();
const detailId = this.$route.query.detailId;
if (detailId) this.openLoadingDialog('view', { id: detailId });
},
watch: {
'$route.query.detailId'(detailId) {
if (detailId) this.openLoadingDialog('view', { id: detailId });
},
},
methods: {
buildQueryParams(form) {
@@ -1280,11 +1276,11 @@ export default {
findWaybillId(row, waybillNo) {
const rows = this.splitText(row.loadingSubNos);
const index = rows.findIndex(item => item === waybillNo);
const linkedRows = this.parseJsonArray(row.waybillList || row.waybillRows || row.waybills);
const linkedRows = parseJsonArray(row.waybillList || row.waybillRows || row.waybills);
if (linkedRows[index]?.id || linkedRows[index]?.waybillId) {
return linkedRows[index].id || linkedRows[index].waybillId;
}
const ids = this.parseJsonArray(row.waybillIdsJson);
const ids = parseJsonArray(row.waybillIdsJson);
return ids[index] || '';
},
async openWaybillDetail(row = {}) {
@@ -1415,6 +1411,7 @@ export default {
this.dialogVisible = true;
this.dialogLoading = true;
this.resetDialogData();
if (mode === 'add') this.candidateQuery.transportType = 'road';
try {
if (row?.id) {
const res = await loadingApi.getDetail(row.id);
@@ -1435,6 +1432,7 @@ export default {
} else {
this.dialogForm = createDialogForm();
this.candidateQuery = createCandidateSearchForm();
this.candidateQuery.transportType = 'road';
await this.loadCandidateWaybills();
}
} finally {
@@ -1465,6 +1463,7 @@ export default {
},
clearLoadingDialog() {
this.resetDialogData();
if (this.dialogMode === 'add') this.candidateQuery.transportType = 'road';
this.loadCandidateWaybills();
},
restoreRouteAndCargo() {
@@ -1719,6 +1718,7 @@ export default {
...this.buildQueryParams(this.candidateQuery),
businessStatus: 'pending',
onlyUnassignedLoading: 1,
...(this.dialogMode === 'add' ? { transportType: 'road' } : {}),
}
);
const page = unwrapPage(res);
@@ -1738,6 +1738,7 @@ export default {
},
handleCandidateReset() {
this.candidateQuery = createCandidateSearchForm();
if (this.dialogMode === 'add') this.candidateQuery.transportType = 'road';
this.candidatePage.currentPage = 1;
this.loadCandidateWaybills();
},
@@ -1805,18 +1806,6 @@ export default {
if (!this.dialogForm.transportType) {
this.dialogForm.transportType = rows.find(row => row.transportType)?.transportType || '';
}
if (!this.dialogForm.carrierName) {
this.dialogForm.carrierName = rows.find(row => row.carrierName)?.carrierName || '';
}
if (!this.dialogForm.driverName) {
this.dialogForm.driverName = rows.find(row => row.driverName)?.driverName || '';
}
if (!this.dialogForm.driverPhone) {
this.dialogForm.driverPhone = rows.find(row => row.driverPhone)?.driverPhone || '';
}
if (!this.dialogForm.vehicleNo) {
this.dialogForm.vehicleNo = rows.find(row => row.vehicleNo)?.vehicleNo || '';
}
if (rebuildRoute) {
this.routeNodes = this.buildRouteNodes(rows);
}
@@ -2079,7 +2068,11 @@ export default {
});
},
handleCarrierTypeChange() {
if (['自运', '网货平台'].includes(this.dialogForm.carrierType)) {
if (this.dialogForm.carrierType === '承运商') {
this.dialogForm.trailerVehicleNo = '';
this.dialogForm.escortName = '';
this.dialogForm.escortPhone = '';
} else if (['自运', '网货平台'].includes(this.dialogForm.carrierType)) {
this.dialogForm.carrierName = '';
}
},
@@ -2089,6 +2082,26 @@ export default {
this.dialogForm.driverPhone = driver.mobile || driver.driverPhone || driver.phone || '';
}
},
fetchDriverSuggestions(queryString, callback) {
this.loadDriverOptions(String(queryString || '').trim())
.then(() =>
callback(
this.driverOptions.map(item => ({
...item,
value: item.driverName || item.name || '',
}))
)
)
.catch(() => callback([]));
},
handleDriverSuggestionSelect(target, item = {}) {
const value = item.driverName || item.name || '';
if (target === 'dialog') {
this.dialogForm.driverName = value;
const phone = item.mobile || item.driverPhone || item.phone || '';
if (phone) this.dialogForm.driverPhone = phone;
}
},
handleMileageInput(value) {
this.dialogForm.mileage = String(value || '').replace(/[^\d.]/g, '');
},
@@ -2147,7 +2160,11 @@ export default {
this.carrierLoading = true;
try {
this.carrierOptions = unwrapRecords(
await getCustomerList(1, 20, { customerName: keyword })
await getCustomerList(1, 20, {
customerName: keyword,
customerType: '承运商',
status: 1,
})
);
} finally {
this.carrierLoading = false;