diff --git a/src/api/business/waybill-manage.js b/src/api/business/waybill-manage.js index eb66cb3..e90982c 100644 --- a/src/api/business/waybill-manage.js +++ b/src/api/business/waybill-manage.js @@ -14,7 +14,7 @@ export const cancel = api.cancel; export const reassign = api.reassign; export const complete = api.complete; export const batchComplete = api.batchComplete; -/** 确认回单:待确认回单运单完成后转为已完成 */ +/** 确认回单:回单节点配成「需业务员确认」时用;后端校验司机打卡节点齐全且无未了结异常后才置完成 */ export const confirmReturn = id => request({ url: `${baseUrl}/confirm-return`, diff --git a/src/option/business/common.js b/src/option/business/common.js index c142601..1d4c113 100644 --- a/src/option/business/common.js +++ b/src/option/business/common.js @@ -42,7 +42,7 @@ export const waybillStatusOptions = [ { label: '草稿', value: 'draft' }, { label: '待执行', value: 'pending' }, { label: '进行中', value: 'running' }, - { label: '待确认回单', value: 'pending_return' }, + { label: '待回单确认', value: 'pending_return_confirm' }, { label: '已完成', value: 'completed' }, { label: '已取消', value: 'cancelled' }, ]; diff --git a/src/option/business/waybill-manage.js b/src/option/business/waybill-manage.js index 9fd695b..e6c519f 100644 --- a/src/option/business/waybill-manage.js +++ b/src/option/business/waybill-manage.js @@ -471,26 +471,20 @@ export const config = { endDateRange: ['endDateStart', 'endDateEnd'], createTimeRange: ['createTimeStart', 'createTimeEnd'], }, - actions: ['copy', 'cancel', 'reassign', 'complete', 'batchComplete'], + actions: ['copy', 'cancel', 'reassign', 'complete', 'batchComplete', 'confirmReturn'], detailButton: true, statusProp: 'businessStatus', statusTextProp: 'businessStatusName', formatStatus(row, prop, defaultText) { if (prop !== 'businessStatus') return defaultText; const status = String(row.businessStatus || ''); - const terminalStatuses = [ - 'draft', - 'completed', - 'cancelled', - 'waiting_dispatch', - 'dispatching', - 'pending_return', - ]; - if (status === 'pending_return') return '待确认回单'; + const terminalStatuses = ['draft', 'completed', 'cancelled', 'waiting_dispatch', 'dispatching']; const needAccept = row.requireAccept === true || row.requireAccept === 1 || requiresDriverAcceptConfirmation(row); + // 待回单确认由末位打卡产生,司机必然已接单 + if (status === 'pending_return_confirm') return '待回单确认'; // 需司机接单且尚未接单 → 待执行(含库中仍为 running 的历史数据展示校正) if (needAccept && !hasDriverAcceptRecord(row) && !terminalStatuses.includes(status)) { return '待执行'; @@ -505,20 +499,14 @@ export const config = { getDriverRejectReason, isDriverRejectedWaybill, canEdit(row) { - // 进行中、待确认回单不允许编辑 + // 进行中的运单不允许编辑 if (isInProgressStatus(row, row.businessStatusName)) { return false; } - if (String(row.businessStatus || '') === 'pending_return') { - return false; - } return !isDriverRejectedWaybill(row); }, canCancel(row) { - // 进行中、待确认回单不允许取消 - if (String(row.businessStatus || '') === 'pending_return') { - return false; - } + // 进行中的运单不允许取消;待回单确认仍可取消(与页面 canCancel 一致) return !isInProgressStatus(row, row.businessStatusName); }, deleteStatus: ['draft'], diff --git a/src/styles/element-ui.scss b/src/styles/element-ui.scss index d8f73fe..d01acd2 100644 --- a/src/styles/element-ui.scss +++ b/src/styles/element-ui.scss @@ -622,7 +622,7 @@ background: #fff; } -// 合同管理新增/编辑弹窗(business-crud-page 封装 → avue-crud,弹窗带 avue-crud__dialog class) +// 合同管理新增/编辑弹窗(avue-crud,弹窗带 avue-crud__dialog class) // 复刻 waybill-manage 方案:接近全屏、压过库内置 .avue-dialog 的 calc(100% - 200px), // 并解开 body 的 200px 上限、抵消全局 footer 的 -30px 上移 .contract-manage-dialog.el-dialog { 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/utils/cert-audit.js b/src/utils/cert-audit.js index 331eced..d88959f 100644 --- a/src/utils/cert-audit.js +++ b/src/utils/cert-audit.js @@ -106,6 +106,9 @@ const CERT_SNAPSHOT_GROUPS = { fields: [ { key: 'realName', label: '真实姓名' }, { key: 'idCardNo', label: '身份证号' }, + { key: 'birthday', label: '出生年月', type: TYPE_DATE }, + { key: 'addressRegion', label: '住址' }, + { key: 'address', label: '详细地址' }, { key: 'idCardFrontUrl', label: '身份证正面照', type: TYPE_IMAGE }, { key: 'idCardBackUrl', label: '身份证反面照', type: TYPE_IMAGE }, { key: 'idCardValidStart', label: '身份证有效期起', type: TYPE_DATE }, diff --git a/src/views/business/components/business-crud-page.vue b/src/views/business/components/business-crud-page.vue deleted file mode 100644 index 36aa8b5..0000000 --- a/src/views/business/components/business-crud-page.vue +++ /dev/null @@ -1,16453 +0,0 @@ - -