diff --git a/src/utils/carrier-org-resource.js b/src/utils/carrier-org-resource.js
index 65ffbc5..5185d0d 100644
--- a/src/utils/carrier-org-resource.js
+++ b/src/utils/carrier-org-resource.js
@@ -26,6 +26,35 @@ const uniqueOrgNames = (values = []) => {
return result;
};
+// 候选司机取数上限:超出后只能靠关键字缩小范围
+const DRIVER_CANDIDATE_MAX_SIZE = 200;
+
+/**
+ * 派单候选司机:租户内的司机档案,按岗位等条件过滤。
+ *
+ * 与组织、承运商都无关——司机档案与组织树、承运商之间没有外键,`organization_name`
+ * 只是自由文本,用它做匹配会让小程序自动建档的司机永远进不了候选。
+ */
+export const fetchDriverCandidates = async (query = {}) => {
+ const params = { ...query };
+ const size = Math.min(Math.max(Number(params.size) || 50, 50), DRIVER_CANDIDATE_MAX_SIZE);
+ delete params.size;
+ const res = await getDriverList(1, size, params);
+ return extractRecords(res).slice(0, size);
+};
+
+/**
+ * 司机候选项的展示文本:姓名(手机尾号后 4 位)。
+ *
+ * 只用于下拉渲染。写回表单的仍是姓名本身,别把带尾号的文本当值用。
+ */
+export const driverOptionText = (item = {}) => {
+ const name = normalizeOrgName(item.driverName || item.name);
+ const mobile = String(item.mobile || item.phone || item.driverPhone || '').trim();
+ if (!name) return '';
+ return mobile.length >= 4 ? `${name}(${mobile.slice(-4)})` : name;
+};
+
/**
* 解析承运商客商档案上联系人的所属组织(branchName),无联系人时回退客商所属组织。
*/
@@ -72,13 +101,6 @@ export const resolveCarrierOrganizationNames = async ({ carrierId, carrierName }
return orgNames;
};
-export const clearCarrierOrganizationCache = (carrier = {}) => {
- const id = String(carrier.carrierId || '').trim();
- const name = normalizeOrgName(carrier.carrierName);
- if (id) orgNameCache.delete(id);
- if (name) orgNameCache.delete(name);
-};
-
export const matchOrganizationName = (value, orgNames = []) => {
const text = normalizeOrgName(value);
if (!text || !orgNames.length) return false;
@@ -90,34 +112,9 @@ const filterByOrganizations = (records = [], orgNames = []) => {
return records.filter(item => matchOrganizationName(item.organizationName, orgNames));
};
-/**
- * 按承运商联系人所属组织筛选司机。
- * 未选择承运商时返回空列表(需先选承运商)。
- */
-export const fetchDriversByCarrierOrganizations = async (
- query = {},
- { carrierId, carrierName } = {}
-) => {
- if (!String(carrierId || '').trim() && !normalizeOrgName(carrierName)) {
- return [];
- }
- const orgNames = await resolveCarrierOrganizationNames({ carrierId, carrierName });
- if (!orgNames.length) return [];
-
- const size = Math.max(Number(query.size) || 50, 50);
- const params = { ...query };
- delete params.size;
- // 单组织时用后端模糊条件缩小范围;多组织再前端精确过滤
- if (orgNames.length === 1) {
- params.organizationName = orgNames[0];
- }
- const res = await getDriverList(1, Math.min(size * 5, 200), params);
- return filterByOrganizations(extractRecords(res), orgNames).slice(0, size);
-};
-
/**
* 按承运商联系人所属组织筛选车辆。
- * 未选择承运商时返回空列表。
+ * 未选择承运商时返回空列表(需先选承运商)。
*/
export const fetchVehiclesByCarrierOrganizations = async (
query = {},
diff --git a/src/views/business/components/master-order-dispatch.vue b/src/views/business/components/master-order-dispatch.vue
index 0a5888f..40dd8a3 100644
--- a/src/views/business/components/master-order-dispatch.vue
+++ b/src/views/business/components/master-order-dispatch.vue
@@ -210,7 +210,11 @@
@mousedown="() => handleDriverFocus(route)"
@focus="() => handleDriverFocus(route)"
@select="handleDriverSuggestionSelect"
- />
+
+ {{ driverOptionText(item) }}
+
+
handleDriverFocus(route)"
@focus="() => handleDriverFocus(route)"
@select="handleEscortSuggestionSelect"
- />
+
+ {{ driverOptionText(item) }}
+
+
import * as api from '@/api/business/master-order';
-import { fetchDriversByCarrierOrganizations } from '@/utils/carrier-org-resource';
+import { fetchDriverCandidates, driverOptionText } from '@/utils/carrier-org-resource';
import { formatContractOptionLabel } from '@/utils/contract';
import {
currencyUnit,
@@ -403,6 +411,7 @@ export default {
this.applySelfOperatedCarrierDefaults();
},
methods: {
+ driverOptionText,
loadQuantityUnitOptions() {
if (this.quantityUnitLoading) return this.quantityUnitLoadPromise;
this.quantityUnitLoading = true;
@@ -944,12 +953,6 @@ export default {
route.escortPhone = '';
this.driverOptions = [];
},
- getRouteCarrierFilter(route = {}) {
- return {
- carrierId: route.carrierId || '',
- carrierName: route.carrierName || '',
- };
- },
carrierOptionValue(item = {}) {
return item.contractId || item.id || item.value || item.carrierName || '';
},
@@ -1026,36 +1029,22 @@ export default {
this.activeSuggestRoute = route;
},
async loadDriverOptions(route = {}, keyword = '') {
- const carrier = this.getRouteCarrierFilter(route);
- if (!carrier.carrierId && !carrier.carrierName) {
- this.driverOptions = [];
- return [];
- }
this.driverLoading = true;
try {
- this.driverOptions = await fetchDriversByCarrierOrganizations(
- { size: 20, ...(keyword ? { driverName: keyword } : {}), posts: '司机' },
- carrier
- );
+ this.driverOptions = await fetchDriverCandidates({
+ size: 20,
+ ...(keyword ? { driverName: keyword } : {}),
+ posts: '司机',
+ });
return this.driverOptions;
} finally {
this.driverLoading = false;
}
},
fetchDriverSuggestions(queryString, callback) {
- const route = this.activeSuggestRoute || {};
- const carrier = this.getRouteCarrierFilter(route);
const keyword = String(queryString || '').trim();
- if (!carrier.carrierId && !carrier.carrierName) {
- callback([]);
- if (!keyword) this.$message.warning('请先选择承运商');
- return;
- }
this.driverLoading = true;
- fetchDriversByCarrierOrganizations(
- { size: 20, ...(keyword ? { driverName: keyword } : {}), posts: '司机' },
- carrier
- )
+ fetchDriverCandidates({ size: 20, ...(keyword ? { driverName: keyword } : {}), posts: '司机' })
.then(records => {
this.driverOptions = records;
callback(
@@ -1080,19 +1069,13 @@ export default {
if (drivingVehicle) route.vehicleNo = drivingVehicle;
},
fetchEscortSuggestions(queryString, callback) {
- const route = this.activeSuggestRoute || {};
const keyword = String(queryString || '').trim();
- const carrier = this.getRouteCarrierFilter(route);
- if (!carrier.carrierId && !carrier.carrierName) {
- callback([]);
- if (!keyword) this.$message.warning('请先选择承运商');
- return;
- }
this.escortLoading = true;
- fetchDriversByCarrierOrganizations(
- { size: 20, ...(keyword ? { driverName: keyword } : {}), posts: '押运员' },
- carrier
- )
+ fetchDriverCandidates({
+ size: 20,
+ ...(keyword ? { driverName: keyword } : {}),
+ posts: '押运员',
+ })
.then(records => {
callback(
records.map(item => ({
diff --git a/src/views/business/components/transport-plan-page.vue b/src/views/business/components/transport-plan-page.vue
index f77891a..7905930 100644
--- a/src/views/business/components/transport-plan-page.vue
+++ b/src/views/business/components/transport-plan-page.vue
@@ -1870,7 +1870,11 @@
:fetch-suggestions="fetchTaskDriverSuggestions"
:loading="taskDriverLoading"
@select="item => handleTaskDriverSelect('dispatch', item)"
- />
+ >
+
+ {{ driverOptionText(item) }}
+
+
+ >
+
+ {{ driverOptionText(item) }}
+
+
@@ -2768,7 +2776,7 @@ import {
getList as getProjectList,
} from '@/api/business/project-apply';
import { getList as getCommonRouteList } from '@/api/business/common-route';
-import { fetchDriversByCarrierOrganizations } from '@/utils/carrier-org-resource';
+import { fetchDriverCandidates, driverOptionText } from '@/utils/carrier-org-resource';
import { getDictionary } from '@/api/system/dictbiz';
import { getDictionary as getSystemDictionary } from '@/api/system/dict';
import { addressTypeOptions } from '@/option/base/common-address';
@@ -3815,6 +3823,7 @@ export default {
},
methods: {
formatContractOptionLabel,
+ driverOptionText,
initStandaloneFormPage() {
if (!this.isStandaloneFormPage) return;
const mode = this.$route.query.mode === 'edit' ? 'edit' : 'add';
@@ -4995,16 +5004,8 @@ export default {
},
fetchTaskDriverSuggestions(queryString, callback) {
const keyword = String(queryString || '').trim();
- const carrier = this.getDispatchCarrierFilter();
- if (!carrier.carrierId && !carrier.carrierName) {
- callback([]);
- return;
- }
this.taskDriverLoading = true;
- fetchDriversByCarrierOrganizations(
- { size: 20, ...(keyword ? { driverName: keyword } : {}), posts: '司机' },
- carrier
- )
+ fetchDriverCandidates({ size: 20, ...(keyword ? { driverName: keyword } : {}), posts: '司机' })
.then(records => {
this.taskDriverOptions = records;
callback(
@@ -5024,16 +5025,12 @@ export default {
},
fetchTaskEscortSuggestions(queryString, callback) {
const keyword = String(queryString || '').trim();
- const carrier = this.getDispatchCarrierFilter();
- if (!carrier.carrierId && !carrier.carrierName) {
- callback([]);
- return;
- }
this.taskEscortLoading = true;
- fetchDriversByCarrierOrganizations(
- { size: 20, ...(keyword ? { driverName: keyword } : {}), posts: '押运员' },
- carrier
- )
+ fetchDriverCandidates({
+ size: 20,
+ ...(keyword ? { driverName: keyword } : {}),
+ posts: '押运员',
+ })
.then(records => {
this.taskEscortOptions = records;
callback(records.map(item => ({ ...item, value: item.driverName || item.name || '' })));
@@ -8048,12 +8045,6 @@ export default {
this.taskDriverOptions = [];
this.taskEscortOptions = [];
},
- getDispatchCarrierFilter() {
- return {
- carrierId: this.dispatchItemForm.carrierId || '',
- carrierName: this.dispatchItemForm.carrierName || '',
- };
- },
handleDispatchCargoQuantityInput(row, value) {
const text = String(value || '').replace(/[^\d.]/g, '');
const parts = text.split('.');
diff --git a/src/views/business/components/waybill-manage-page.vue b/src/views/business/components/waybill-manage-page.vue
index ffe1610..c59fab3 100644
--- a/src/views/business/components/waybill-manage-page.vue
+++ b/src/views/business/components/waybill-manage-page.vue
@@ -1200,7 +1200,11 @@
:loading="taskDriverLoading"
:disabled="dialogReadonly"
@select="handleTaskDriverSelect"
- />
+ >
+
+ {{ driverOptionText(item) }}
+
+
+ >
+
+ {{ driverOptionText(item) }}
+
+
+ >
+
+ {{ driverOptionText(item) }}
+
+
{
this.taskDriverOptions = records;
return this.taskDriverOptions;
@@ -7990,16 +7992,8 @@ export default {
},
fetchTaskDriverSuggestions(queryString, callback) {
const keyword = String(queryString || '').trim();
- const carrier = this.getTaskCarrierFilter();
- if (!carrier.carrierId && !carrier.carrierName) {
- callback([]);
- return;
- }
this.taskDriverLoading = true;
- fetchDriversByCarrierOrganizations(
- { size: 20, ...(keyword ? { driverName: keyword } : {}), posts: '司机' },
- carrier
- )
+ fetchDriverCandidates({ size: 20, ...(keyword ? { driverName: keyword } : {}), posts: '司机' })
.then(records => {
this.taskDriverOptions = records;
callback(
@@ -8019,16 +8013,12 @@ export default {
},
fetchTaskEscortSuggestions(queryString, callback) {
const keyword = String(queryString || '').trim();
- const carrier = this.getTaskCarrierFilter();
- if (!carrier.carrierId && !carrier.carrierName) {
- callback([]);
- return;
- }
this.taskEscortLoading = true;
- fetchDriversByCarrierOrganizations(
- { size: 20, ...(keyword ? { driverName: keyword } : {}), posts: '押运员' },
- carrier
- )
+ fetchDriverCandidates({
+ size: 20,
+ ...(keyword ? { driverName: keyword } : {}),
+ posts: '押运员',
+ })
.then(records => {
this.taskEscortOptions = records;
callback(records.map(item => ({ ...item, value: item.driverName || item.name || '' })));
@@ -10235,20 +10225,8 @@ export default {
},
fetchReassignDriverSuggestions(queryString, callback) {
const keyword = String(queryString || '').trim();
- const row = this.reassignDrawer.row || {};
- const carrier = {
- carrierId: row.carrierId || '',
- carrierName: row.carrierName || '',
- };
- if (!carrier.carrierId && !carrier.carrierName) {
- callback([]);
- return;
- }
this.reassignDrawer.driverLoading = true;
- fetchDriversByCarrierOrganizations(
- { size: 20, ...(keyword ? { driverName: keyword } : {}), posts: '司机' },
- carrier
- )
+ fetchDriverCandidates({ size: 20, ...(keyword ? { driverName: keyword } : {}), posts: '司机' })
.then(records => {
this.reassignDriverOptions = records;
callback(
diff --git a/src/views/business/loading-manage.vue b/src/views/business/loading-manage.vue
index 4ab0917..2430d54 100644
--- a/src/views/business/loading-manage.vue
+++ b/src/views/business/loading-manage.vue
@@ -1068,7 +1068,7 @@
@@ -1465,7 +1465,11 @@
:loading="driverLoading"
placeholder="请输入"
@select="item => handleDriverSuggestionSelect('dialog', item)"
- />
+ >
+
+ {{ driverOptionText(item) }}
+
+
handleEscortSuggestionSelect('dialog', item)"
- />
+ >
+
+ {{ driverOptionText(item) }}
+
+
@@ -1804,7 +1812,7 @@ import { getList as getContractList } from '@/api/business/contract-manage';
import { getParentOptions as getCargoTypeOptions } from '@/api/base/cargo-type';
import { getList as getCustomerList } from '@/api/vehicle/customer-archive';
import { getList as getDriverList } from '@/api/transportCapacity/driver';
-import { fetchDriversByCarrierOrganizations } from '@/utils/carrier-org-resource';
+import { fetchDriverCandidates, driverOptionText } from '@/utils/carrier-org-resource';
import { formatContractOptionLabel } from '@/utils/contract';
import {
getList as getProcessConfigList,
@@ -2304,6 +2312,7 @@ export default {
},
methods: {
parseRouteChangeContent,
+ driverOptionText,
formatTaskCarrierContractLabel(item = {}) {
const carrierName = item.carrierName || item.partyB || '';
const contractLabel = formatContractOptionLabel(item);
@@ -4267,12 +4276,6 @@ export default {
this.dialogForm.escortPhone = '';
this.driverOptions = [];
},
- getDialogCarrierFilter() {
- return {
- carrierId: this.dialogForm.carrierId || '',
- carrierName: this.dialogForm.carrierName || '',
- };
- },
handleDriverChange(value) {
const driver = this.driverOptions.find(item => (item.driverName || item.name) === value);
if (driver && !this.dialogForm.driverPhone) {
@@ -4306,16 +4309,12 @@ export default {
},
fetchEscortSuggestions(queryString, callback) {
const keyword = String(queryString || '').trim();
- const carrier = this.getDialogCarrierFilter();
- if (!carrier.carrierId && !carrier.carrierName) {
- callback([]);
- return;
- }
this.escortLoading = true;
- fetchDriversByCarrierOrganizations(
- { size: 20, ...(keyword ? { driverName: keyword } : {}), posts: '押运员' },
- carrier
- )
+ fetchDriverCandidates({
+ size: 20,
+ ...(keyword ? { driverName: keyword } : {}),
+ posts: '押运员',
+ })
.then(records => {
callback(
records.map(item => ({
@@ -4395,17 +4394,13 @@ export default {
}
},
async loadDialogDriverOptions(keyword = '') {
- const carrier = this.getDialogCarrierFilter();
- if (!carrier.carrierId && !carrier.carrierName) {
- this.driverOptions = [];
- return [];
- }
this.driverLoading = true;
try {
- this.driverOptions = await fetchDriversByCarrierOrganizations(
- { size: 20, ...(keyword ? { driverName: keyword } : {}), posts: '司机' },
- carrier
- );
+ this.driverOptions = await fetchDriverCandidates({
+ size: 20,
+ ...(keyword ? { driverName: keyword } : {}),
+ posts: '司机',
+ });
return this.driverOptions;
} finally {
this.driverLoading = false;