From 0add4c5cdca92c72bc09bc3a67e243156914b792 Mon Sep 17 00:00:00 2001 From: weicw1996 Date: Fri, 23 Oct 2026 20:03:49 +0800 Subject: [PATCH] =?UTF-8?q?:recycle:=20=E6=B4=BE=E5=8D=95=E5=80=99?= =?UTF-8?q?=E9=80=89=E5=8F=B8=E6=9C=BA=E4=B8=8D=E5=86=8D=E6=8C=89=E6=89=BF?= =?UTF-8?q?=E8=BF=90=E5=95=86=E7=BB=84=E7=BB=87=E8=BF=87=E6=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 fetchDriverCandidates:按租户与岗位取司机,不再解析承运商联系人组织 - driverOptionText 只做展示(姓名+手机尾号后四位),写回表单的仍是姓名 - 删除 fetchDriversByCarrierOrganizations 与无调用者的 clearCarrierOrganizationCache - 运单管理、总单派车、运输计划、装卸管理四页同步;去掉「请先选择承运商」前置 --- src/utils/carrier-org-resource.js | 63 ++++++++-------- .../components/master-order-dispatch.vue | 63 ++++++---------- .../components/transport-plan-page.vue | 45 +++++------- .../components/waybill-manage-page.vue | 72 +++++++------------ src/views/business/loading-manage.vue | 51 ++++++------- 5 files changed, 119 insertions(+), 175 deletions(-) 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" - /> + + + + 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)" - /> + > + + + > + + @@ -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" - /> + > + + + > + + + > + + { 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)" - /> + > + + + > + + @@ -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;