Files
gxwebsoft 1bbc97758d fix(contract-manage-change): 修正自动生成结算单问号提示图标位置
- 解决图标夹在开启/关闭 radio 按钮之间,开启按钮右侧多余间距问题
- 清除开启 radio 默认 margin-right,调整提示图标左右间距
- 提示图标紧靠开启按钮一侧,关闭按钮保持较大间距
- 优化样式,使布局更美观一致
2026-09-09 19:25:06 +08:00

34 KiB
Raw Permalink Blame History

付款比例设置提示改为 tooltipcontract-manage / contract-manage-change

  • 需求:将「付款比例设置」区块原有的红色文字提示改为标题右侧的 ? 图标悬停提示。
  • 改动:编辑弹窗、详情弹窗、合同变更页三处标题后添加 el-tooltip + el-icon-question-filled,content 为「非必填;配置付款比例时,合计必须等于100%。」;同时移除 contract-manage.vue 中原 .contract-manage-form__tip 红色提示文字及对应样式。

必填星号与 label 首行齐平(全局)

  • 根因:element-ui.scss.el-form-item--label-right .el-form-item__label { align-items:center } 使 inline-flex label 的星号 ::before(独立 flex 子项)在多行折行时被垂直居中。
  • 修复:label 改 align-self:center(整体仍随行垂直居中)+ align-items:flex-start(星号/文字首行齐平),覆盖 label-right/left/top 三种位置;旧 inline-block 注释已修正。
  • 影响页面:project-apply 独立表单页等所有多行 label 场景(弹窗内 white-space:nowrap 不受影响)。

必填星号首行对齐:改用 align-items: normalstretch 方案)

  • 最终写法(src/styles/element-ui.scss):.is-required .el-form-item__label { align-self:center; align-items:normal; } + ::before { display:inline-block; height:auto; line-height:inherit; margin-right:4px }
  • 原理:stretch 让星号盒子在「换行时」被拉伸到 label 全高、内容从顶部排布 → 贴首行;单行时盒子=一行高,视觉不变(比 flex-start 更贴合「只换行才生效」)。
  • 前提:::before 高度必须 auto 且继承行高;label 不能是 固定 height + 等高 line-height,否则退化成居中,需 JS 判行数加 class。

合同变更页(contract-manage-change.vue

  • 「其它附件」上传按钮改为 type="primary" plain icon="el-icon-upload",与「变更材料」区 vehicle-attachment-upload 内置按钮一致。
  • 分区标题必填星号:.dialog-section-title.is-required::after { content:'*'; color:#f56c6c }::before 已被蓝色竖条占用,星号走 ::after)。
  • 再次变更逻辑:load() 里 form 强制重置 changeContent/changeReason/changeAttachmentsJson = ''changeMaterials = [](不带上一次内容);新增 mergeChangeAttachments() 把上一次的 changeAttachmentsJson 归集进 attachments(其它附件),按 url/名去重,数字 size 转格式化文本,提交时随 attachmentsJson 持久化。

合同变更记录对齐客商变更记录(contract-manage.vue

  • 编辑页与详情弹窗的两处「变更记录」表格新增「变更内容」列:formatContractChangeContent(row) 复用 buildDetailChangeRecordRows 生成「字段:变更前:x → 变更后:y」摘要,单行省略 + el-tooltip 全量悬浮(样式 .contract-change-record-content-cell/-tooltip 照搬客商 change-record-content-*)。
  • 编辑页操作列由单个「流程」改为「详情 + 流程」(openDetailChangeRecord + openFlow,宽度 120→150);详情弹窗表格「查看详情」改「详情」与客商一致。
  • 值格式化增强:billingPlanJson→方案名(默认)列表、paymentRatioJson→「第N笔 xx%」、settlementRuleJson/preSettlementConfigJson/formalSettlementConfigJson→可读摘要(自动生成开关/结算类型/周期类型/截单日/周期天数,含预结算+正式结算双段)。
  • buildDetailChangeRecordRows 过滤条件补「前后都为空则跳过」(原来只比 JSON 字符串,'' 与 null 会漏)。

星号方案补丁(关键)

  • EP 的 .el-form-item__label 写死 height:32px; line-height:32px(项目只覆盖了 line-height:14px),导致 stretch 方案文字顶到 32px 盒子顶部、单行不居中。
  • 修复:.is-required .el-form-item__label { height:auto; align-self:center; align-items:normal }——height:auto 收缩到内容高 + align-self:center 行内居中 + normal(stretch) 仅换行时星号贴首行。

车辆认证审核弹窗重构(transportCapacity/vehicle.vue

  • 背景:用户反馈「样式不统一、内容不全」。根因是审核弹窗用 <el-descriptions :column="3" border>(大白表 + 居中 label),与同页编辑弹窗的 <section-card> 白卡分组风格不一致。
  • 改造:弹窗主体改为 4 个 section-card 分组 —— 基础信息 / 尺寸重量 / 证件信息 / 证件图片;内部 el-form label-position="right" label-width="auto" + el-row/el-col3 列 :span="8",所属组织与备注占 :span="24")。
  • 内容补全:新增「证件图片」分组,6 张证件照用 <image-upload-field readonly large class-prefix="vehicle"> 只读展示(可点击放大);证件图片尺寸 240×151 复用已有全局 :deep(.vehicle-uploader--large) 规则,无需新写。
  • label 单位统一为中文全角括号:外廓长度(毫米) / 核定载质量(KG(原为半角 外廓长度(mm))。
  • 方法重构:formatAuditValue(item)auditValue(prop),签名更简洁;新增 longTermMap,对 drivingLicenseEndDate / roadTransportCertEndDate / annualReviewEndDate / compulsoryScrapDate 在勾选长期有效时返回「长期有效」,避免与未填写的「-」混淆(与列表页 formatEndDate 行为一致)。
  • 删除已无引用的 auditDetailItems computed。

全站弹窗标题补 4px 主色竖条(全局 element-ui.scss

  • 发现:.el-dialog__title 全局只配了 inline-flex + gap:8px没有竖条(竖条此前只在 .dialog-section-title::before),导致全站 el-dialog 标题都不带竖条,不符合 AGENTS.md 4.8。
  • 修复:新增 .el-dialog__title:not(:empty)::before { width:4px; height:16px; border-radius:2px; background:var(--el-color-primary) }
  • 注意:必须加 :not(:empty),否则无标题弹窗会出现孤立蓝条。
  • customer-archive.vue 评分详情弹窗:将「临时额度申请使用期限」区间行(span=12 + 至 连接)拆分为两个 span=6 独立字段「临时申请额度有效期起 / 止」,字段名 tempCreditStartDate/End 不变,删除废弃样式 .score-detail-form__range。
  • temporary-credit-limit 文案调整:option 增加 addTitle/editTitle/viewTitle=「新增/编辑/查看临时额度申请」(覆盖 crud-dialog-title mixin 按菜单名注入的「临时额度管理」);remark label 改「临时额度信息」(hide:true 无表格副作用,rules 同步);projectName 表单 label 用 #projectName-label 插槽改「项目额度信息」,列 label 保持「项目名称」不动表格列头/搜索。Avue 支持-{prop}-label / -header / -search 插槽分离表单/表头/搜索文案。
  • temporary-credit-limit「申请有效期至」增加「必须晚于当前日期」校验:common.js 新增通用 futureDateRule(label)trigger: ['change','blur'],空值/非法值放行,按 0 点比较,当天也算过期),temporary-credit-limit.js 的 validUntil rules 追加该规则。已验证 Element Plus 通用 picker 在选中日期时调用 formItem.validate('change'),故选择即刻提示;form.validate() 不带 trigger 时会跑全部规则,提交仍拦截。
  • temporary-credit-limit 搜索占位文案统一:createCrudOption(withSearchPlaceholders([...])),搜索栏 placeholder 变为「请输入/请选择」不带字段名,与 waybill-manage / transport-plan / shipping-template 同一模式。
  • temporary-credit-limit 弹窗表单 placeholder 统一为「请输入/请选择」不带字段名:option 各列加 placeholderprojectCode/undertakeDeptName/projectFundLimit/usedFundLimit/remainingFundLimit/remark=请输入,validUntil=请选择),视图 formslot 自定义控件(projectName select、applyLimit inputplaceholder 同步改。

【项目管理】列表增加「项目资金使用预警」(project-apply

  • 需求:列表新增「资金使用风险」列,高风险红色、中风险黄色;列表头部增加「资金使用风险」快速筛选标签(高风险(数)/中风险(数)),点击筛选。规则 tooltip:中风险≥80%、高风险≥90%,使用率=已使用资金/项目资金使用额度×100%。
  • 前端(已落地,src/views/business/project-apply.vue + src/option/business/project-apply.js + src/api/business/project-apply.js):
    • option/project-apply.js 新增列 fundUseRisk(slot:true, hide 列表显示) + 导出 fundUseRiskOptions(high/medium/none) 与 fundUseRiskThreshold{high:90, medium:80}。
    • view 新增 #header 插槽:el-check-tag 快速筛选(复用 contract-manage 到期标签交互),带数量(fundRiskStats[statKey])与 ? tooltip 规则;新增 #fundUseRisk 插槽渲染彩色 el-taghigh→type=danger 红,medium→type=warning 黄,无→"-")。
    • data 加 fundRiskScope/fundRiskStats{high,medium,none}/fundRiskTagOptionsonLoad 追加 fundUseRisk 筛选参数 + 成功后 refreshFundRiskStats;新增 changeFundRiskScope(再次点击取消)、refreshFundRiskStatssearchReset 清空风险筛选。
    • api 新增 getFundRiskStats → GET /blade-transport/project-apply/fund-risk-stats。
  • 后端契约(未改,待确认数据来源):ProjectApplyVO 补齐 fundUseRisk(high/medium/none)、fundUseRiskNamefundUseRateusedFundLimit/remainingFundLimit;列表 selectProjectApplyPage 填充每行风险 + buildQuery 支持 fundUseRisk 过滤;新增 /fund-risk-stats 返回 {high,medium,none}。
  • ⚠️ 关键阻塞:系统里项目与任何费用表(运输计划/运单/账单/客商)均无关联字段,usedFundLimit(已使用资金) 无真实取数来源;临时额度模块的 project-apply/list 返回里 usedFundLimit 实际为空。需业务方确认「已使用资金」口径后才能算风险等级,否则列表风险列全空、统计为 0。

合同文件「批量下载」按钮与标题同排(contract-manage.vue 内联 AttachmentSection

  • 需求:编辑页「合同文件」分组里「批量下载」按钮目前独立一行、靠右偏上,高度与标题区错位;要放到「合同文件」标题右侧同排、垂直居中。
  • 修复:const AttachmentSection = defineComponent(...) 内联组件 render() —— 原结构是 div.dialog-section-title(标题) 与 div.contract-manage-form__attachment-head(批量下载按钮) 两个并列 div;改为把标题与按钮放进同一个 contract-manage-form__attachment-head flex 容器(标题左、按钮右)。
  • 样式::deep(.contract-manage-form__attachment-head)justify-content:flex-end 改为 space-between + align-items:center,并 .dialog-section-title { margin-bottom:0 } 抵消标题自身 20px 下边距(2674 行 :deep(.dialog-section-title) 会命中子组件渲染的标题)。
  • 注意:AttachmentSection 用 render 函数产出 DOM,不带当前组件 scoped data 属性,因此样式必须走 :deep()scoped 的 &__billing-head, &__attachment-head(2723) 只作用于当前组件模板内(计费信息),对子组件 DOM 无效。
  • 影响:4 处使用(编辑/详情 × 合同文件/其它附件)布局统一变为「标题 + 批量下载」同排。
  • 主人二次反馈「下面的其它附件也一样」——确认 L463(编辑/其它附件 description) / L765(详情/其它附件 description+readonly) 与 L313(编辑/合同文件) / L671(详情/合同文件) 都走同一份 render+样式,无需新代码;指挥浏览器 Cmd+Shift+R 硬刷即可看到效果(render 函数组件的 :deep() 样式改 HMR 经常不传播)。

合同格式下拉改读业务字典 contractFormatcontract-manage.vue

  • 需求:新增/编辑合同管理页「合同格式」下拉由硬编码改为读取业务字典 contractFormat
  • 原实现:option/business/contract-manage.jscontractFormatdicData 硬编码 [{label:'电子合同',value:'电子合同'},{label:'纸质合同',value:'纸质合同'}]view 里 contractFormatOptions computed 直接 columnOptions('contractFormat') 读 column.dicData。
  • 修复(4 处):
    1. data 加 contractFormatDictOptions: [](与 settlementModeDictOptions 并列)。
    2. computed contractFormatOptions 改为优先 contractFormatDictOptions,为空回退 columnOptions('contractFormat')(保留静态兜底)。
    3. loadSettlementDictionariesPromise.all 追加 getBizDictionary({ code: 'contractFormat' }),用 records() 映射 {label:dictValue,value:dictKey} 填充 contractFormatDictOptions;再条件覆盖 column.dicData(仅当字典非空时),避免字典未配时清掉静态兜底。
    4. detailValue 的字典映射分支加入 prop === 'contractFormat',详情页「合同格式」也走 displayStatus 显示 label。
  • 后端契约:getBizDictionaryGET /blade-system/dict-biz/dictionary?code=contractFormat,返回 List<DictBiz>{code,dictKey,dictValue,remark}DictBizController#dictionary 按 code 精确匹配)。字典 code 按用户口述用驼峰 contractFormat(现有 settle_method 为下划线,若后台实际是 contract_format 需调整 code)。
  • 参考模式:与 settlementModesettle_method)完全一致。

合同类别 contractCategory 也读业务字典(contract-manage.vue,续上)

  • 需求:模板里 label 实为「合同类型」(prop contractCategory),下拉由硬编码 common.js#contractCategoryOptions(客户合同/承运商合同/补充协议,value 中文)改为读业务字典 contractCategory
  • 修复(3 处,与 contractFormat 同模式):
    1. data 加 contractCategoryDictOptions: []
    2. computed contractCategoryOptions 改为优先 contractCategoryDictOptions,空回退 columnOptions('contractCategory')(静态兜底)。
    3. loadSettlementDictionariesPromise.all 追加 getBizDictionary({ code: 'contractCategory' }),映射填充后条件覆盖 contractCategory 列 dicData(仅非空时)。
  • 列表页列显示/搜索下拉、详情页(detailValue 已有 prop==='contractCategory' 分支走 displayStatus)均因 column.dicData 覆盖而自动跟随业务字典。
  • 注意:config.defaultForm.contractCategory: '客户合同'option/contract-manage.js)为硬编码中文默认值,若业务字典 dictKey 非中文需同步调整。

车辆新增弹窗:所有组织移位 + 使用部门 + 长期有效清空(vehicle.vue + 后端)

  • 需求(transportCapacity/vehicle):①所有组织移到「基础车辆信息」区末尾;②新增「使用部门」字段(后端 transport_vehicle 无该字段,需加);③车牌号三段(省/号码/颜色)包成整体输入框+减宽;④勾选「长期有效」清空对应日期且不可编辑。
  • 用户确认:所有组织+使用部门放「基础车辆信息」区末尾;使用部门用部门下拉(复用 getDeptTree→organizationOptions,存部门名,仅部门名非级联);车牌号包成整体输入框+减宽;长期有效 4 组全部统一清空(强制报废/行驶证/道路运输证/年审)。
  • 前端(vehicle.vue):
    1. emptyForm 加 useDepartment: ''
    2. 删「基础车辆信息」首行的「所有组织」(原 span24),在区末新增一行:使用部门(span8, el-select+organizationOptions, 存 rawLabel) + 所有组织(span8, el-cascader)。organizationOptions 由 initDeptTree 填充。
    3. .plate-group 由 grid(112px 1fr 112px) 改为 flex 整体输入框:外层 border+radius+focus-within 变化;内部 el-select/el-input 去 box-shadow、无边框,第一/最后 select flex 0 0 30%、中间 input flex 1,子项间用 ::before 竖线分隔。
    4. 4 组 date-picker 加 :disabled="xxxLongTerm === 1"(行驶证/道路运输证原缺,补上),checkbox 加 @change="handleLongTermChange(日期prop, longterm prop)";新增方法 handleLongTermChange(勾选时清空日期并 validateField)。
    5. formRulesdrivingLicenseEndDate / roadTransportCertEndDate 由 required 改为 validator(新增 validateDrivingLicenseEndDate / validateRoadTransportCertEndDatelongTerm===1 时跳过必填),annualReview 原 validator 已支持。
  • 后端(tms-erp-api-ws,新增 use_department 列):
    • TransportVehicle.javaprivate String useDepartment
    • blade_transport_vehicle.sql 建表加 use_department varchar(50)
    • TransportVehicleExcel.java使用部门 列。
    • TransportVehicleMapper.xml resultMap + BaseColumn + QueryCondition(useDepartment LIKE) 各加。
    • TransportVehicleServiceImpl.prepare() trim useDepartmentvalidate() 加长度≤50 校验。
    • 新增增量迁移 doc/sql/transport/blade_transport_vehicle_use_department_patch_20260909.sqlALTER ADD use_department AFTER organization_name)。
  • 注意:VO 继承 entity 无需改;Wrapper BeanUtil 同名透传。已上线库须执行 patch SQL(建表脚本是 DROP+CREATE,勿直接跑)。
  • 后续补充(vehicle.vue「车辆资质图片」区输入框对齐):第一行原 span 6/8/10 不等宽(行驶证档案编号 6 / 行驶证有效期 8 / 道路运输证号 10)导致输入框宽度不齐,统一改为 8/8/8,与下方各行 span=8 一致。仅改 2 处 span,无逻辑改动。

车辆车牌号:改为单一 input 输入框(vehicle.vue3 段 → 1 段)

  • 需求:基础车辆信息区「车牌号」原本是「省简称 select + 号码 input + 车牌颜色 select」三段拼装(plateProvince/plateNoBody/plateColor),改为单个 el-input 直接输入完整车牌号(如 京A12345)。
  • 改动(vehicle.vue):
    1. 模板:plate-group 三段 → <el-input v-model="vehicleForm.plateNo" maxlength="8" show-word-limit placeholder="如:京A12345" @input="handlePlateNoInput" @blur="validatePlateFormat">。删除 .plate-group 样式(含 focus-within、竖线分隔、child flex 占比等整段)。
    2. emptyForm:删 plateProvinceplateNoBody,保留 plateNoplateColor(后端字段继续存历史车牌颜色)。
    3. data:删 plateProvinceOptionsplateColorOptions 暴露;常量 plateProvinceOptions31 省简称数组)整段删除;plateColorOptions 常量删除。
    4. validatePlateNo 重写:直接校验 value(完整车牌号),正则 /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼港澳]{1}[A-Z][A-Z0-9挂学警港澳]{5,6}$/,错误提示改为「请输入标准车牌号(如:京A12345)」。
    5. syncPlateNo / splitPlateNo 重写:splitPlateNo 改为 noop(保留以兼容 OCR 后回调链路);syncPlateNo 改为 trim+upperCase 单一字段。
    6. handlePlateBodyInput 改名为 handlePlateNoInput,新增 validatePlateFormat 失焦校验。
    7. 车辆认证审核弹窗只读详情同步删「车牌颜色」展示(与录入表单一致)。
  • 后端不动:plate_no / plate_color 字段保留(数据库兼容历史车牌颜色),Service 无强制校验。
  • 受影响:OCR 自动识别(行驶证/机动车销售统一发票)后续调用链路无需改,因 syncPlateNo 仍对 plateNo 做归一化。

车辆新增/编辑弹窗:输入框宽度统一(vehicle.vue,前后两区)

  • 需求(transportCapacity/vehicle):新增/编辑弹窗「基础车辆信息」+「车辆资质图片」两个 section 各输入框宽度要一致;截图红框重点为车牌号、外廓尺寸、所有组织/使用部门。
  • 根因:基础区原本列宽混乱(车牌号 span10 / 车辆类型 span6 / 外廓尺寸 span6,其余 span6),行内 3 列与 2 列混排;图片区文本字段全 span6,与基础区不一致。
  • 改动(vehicle.vue 仅模板 el-col span):
    1. 「基础车辆信息」区所有字段统一为 span=83 列布局):车牌号、车辆类型、外廓尺寸、核定载质量、准牵引总质量、业务关系、能源类型、强制报废日期、海关备案号、所有组织、使用部门。
    2. 「车辆资质图片」区文本/日期字段(行驶证档案编号、行驶证有效期、道路运输证号、道路运输证有效期、道路运输年审有效期、机动车登记编号、机动车登记日期)统一为 span=8
  • 不改:只读「车辆认证审核」弹窗(L140 起的 span6 只读详情 + large 图片上传)与新增弹窗内「证件图片」上传控件(固定尺寸)保持 span6。外廓尺寸为复合控件(长/宽/高三 input),口径同 span8。
  • ⚠️ 注意:操作中曾误删核定载质量 el-col 标签(453-460 行开始时少 el-col、尾部多一个 </el-col>),已修复为完整 <el-col :span="8">...
  • 后续纠偏(2026-09-09 傍晚):主人反馈「为什么不是按4列显示」——上一步把"基础车辆信息/车辆资质图片"两区误改成 3 列(span8)。同项目惯例 driver.vue/customer-archive.vue 全为 4 列(span6,仅复合长字段 span12,故统一重排为 4 列:
    • 基础车辆信息:车牌号(6)+车辆类型(6)+外廓尺寸(12)核定载质量/准牵引总质量/业务关系/能源类型(4×6)强制报废日期/海关备案号/所有组织/使用部门(4×6)
    • 车辆资质图片:行驶证有效期/道路运输证号/道路运输证有效期/道路运输年审有效期(4×6)机动车登记编号/机动车登记日期/行驶证档案编号(3×6),图片上传控件仍 span6
    • 该区 span8 已全部移除,编辑表单区仅剩外廓尺寸 span12(复合控件长/宽/高)+ 图片上传 span6。
  • 宽度微调(2026-09-09 傍晚2):主人圈出「所有组织」字段宽度与同行不一致。根因:.vehicle-form 里的 :deep(...){width:100%} 选择器只列了 el-select / el-input / el-input-number / el-date-editor漏了 el-cascader(所有组织用的就是级联选择器,默认不撑满整列)。已补 :deep(.el-cascader) 进该规则,全表单仅此一处用到 el-cascader,故所有组织与同行等宽。

司机弹窗:补 placeholder + 每行统一 3 列(transportCapacity/driver.vue

  • 需求:新增/编辑司机弹窗 ①输入框无提示文案;②基础身份信息 3 列,其它 4 列 / 6 列行不统一。
  • 改动(仅 1819 行 driver.vue 的 126-540 行 <driver-dialog> 模板,script/style 不动):
    1. 基础身份信息:行结构不动,7 个 el-form-item 控件补 placeholder(司机姓名/身份证号/出生年月/性别/民族/学历/详细地址)。住址已有「请选择省市区」、驾驶车辆已有「请输入或选择车辆」,不动。
    2. 驾驶证信息:第一行 4 列(:span=6)拆为两行 — 行 1(准驾车型 / 档案编号 / 有效期 date-range:span=8+ 行 2(长期有效,:span=8)。起/止 placeholder 保留简短「起」「止」,符合主人 1.B 偏好(保留原 date-range 二联结构,不改 daterange)。
    3. 从业资格证信息:第一行 4 列拆为两行 — 行 1(从业资格认证类型 / 资格证号 / 有效期,:span=8+ 行 2(长期有效,:span=8)。资格证号 placeholder 保留「默认身份证号」不动。
    4. 司机联系信息:一行 6 列拆为两行 — 行 1(司机类型 / 手机号 / 紧急联系人姓名,:span=8)+ 行 2(紧急联系人手机号 / 与联系人关系 / 所属组织,:span=8)。所属组织已有 placeholder,不动。
  • 决策点(主人确认):1.B(保留原 date-range 二联 + 第三列留空后拆行的方案);2 保留;3.A(驾驶证主页/副页、封面页/内容页两组上传图仍 :span=12,与占整行宽的原貌一致)。
  • 校验:node 脚本统计 4 个 section-card / 13 个 el-row / 31 个 el-col / 24 个 el-form-item,全平衡。改动只在 driver.vue 一文件,~25 处 Edit 调用。

新增/修改司机弹窗改为 4 列布局(driver.vue16:xx

  • 主人要求 /transportCapacity/driver 新增司机弹窗改 4 列显示。原文件各分组已是 span=6(4 列栅格)但每行只放 3 个字段,第 4 列空置。
  • 重排结果(仅删行断 + 移动字段顺序,字段/校验/逻辑零改动):
    1. 基础身份信息:行1 司机姓名/身份证号/出生年月/性别;行2 民族/学历/住址/详细地址;行3 驾驶车辆/岗位;行4 三张证件照(不变)。
    2. 驾驶证信息:行1 准驾车型/档案编号/有效期/长期有效;上传主页/副页 span 12→6。
    3. 从业资格证信息:行1 类型/资格证号/有效期/长期有效;上传封面页/内容页 span 12→6。
    4. 司机联系信息:行1 司机类型/手机号/紧急联系人姓名/紧急联系人手机号;行2 与联系人关系/所属组织。
  • 注意:此前日志记录的「3 列 span=8」方案已被后续改动覆盖为 span=6,本次以当前文件实际状态为准。

客商档案:客商类型→客商分类 + 新增客商类型(customer-archive.vue

  • ⚠️ 补救(17:34):data 里的 customerKindOptions/customerKindMap 定义一度丢失(模板 v-for 空 → 下拉显示「无数据」,主人截图反馈),已补回 datacustomerTypeOptions 之后)。其余 8 处改动经 grep 确认完好。
  • 需求:原「客商类型」(prop customerType,字典 customer_type:客户/承运商,多选)改名「客商分类」;另新增「客商类型」字段,取值为 外部客商 / 内部组织。
  • 约定:prop customerType 不动(其它页面 loading-manage / dept / business-crud-page 都以 customerType:'承运商' 作为后端查询参数),只改中文标签。
  • 新增字段 prop = customerKind(前端自定义命名,后端尚无对应字段,需后端在客商表加列并透传),值 external(外部客商) / internal(内部组织),单选下拉,默认 external
  • 改动点(8 处,全在 src/views/vehicle/customer-archive.vue):
    1. 表单:227 行 label 改「客商分类」;其后新增一个 el-col :span="6" 表单项「客商类型」prop customerKindel-select + customerKindOptions)。
    2. data 新增 customerKindOptions / customerKindMapexternal/internal ↔ 中文)。
    3. formRulescustomerType 提示文案改「请选择客商分类」。
    4. 列表列:「客户类型」label 改「客商分类」;新增「客商类型」列(prop customerKindtype selectdicData 内外部,minWidth 120未加 search)。
    5. emptyArchive()customerKind: 'external'
    6. normalizeDetail()customerKind: detail.customerKind || 'external'
    7. 变更记录 getChangeFieldLabelcustomerType:'客商分类',新增 customerKind:'客商类型'
    8. formatChangeFieldValue:别名映射加 客商分类/客户类型 → customerType客商类型 → customerKindvalueMap 加 customerKind:{external:'外部客商',internal:'内部组织'}
  • 校验:用 @vue/compiler-sfc 编译模板,0 错误。

上传证件项 label 贴顶修复(全局 archive-form 垂直居中提升)

  • 症状:driver.vue 司机弹窗「驾驶证主页/副页」「封面页/内容页」等证件上传项(el-form-item 内容高 151pxlabel 文字贴顶,普通 32px 控件行看不出来。
  • 根因:archive-form class 被 driver / vehicle / ship / credit-score-quantification / loading-manage / waybill-import-dialog 等 8+ 页面复用,但「label 与控件垂直居中」规则 .archive-form :deep(.el-form-item){align-items:center} 锁在 customer-archive.vue 的 scoped 样式里,其它页面拿不到;flex 容器默认 stretchlabel(32px) 在高控件行内贴顶。
  • 修复:规则提升到 src/styles/element-ui.scss 全局(紧跟 is-required 星号配套规则之后):.archive-form .el-form-item { align-items:center }。全站 archive-form 表单一并生效,label 与控件垂直居中。SCSS 编译通过。

司机弹窗「驾驶证信息」:有效期必填、长期有效不必填(transportCapacity/driver.vue

  • 需求:驾驶证信息区「有效期」(起/止,prop drivingLicenseEndDate)要必填(显示红*),「长期有效」复选框(prop drivingLicenseLongTerm)不必填(去掉红*)。
  • 改动(formRules 两处):
    1. drivingLicenseEndDate 规则加 required: true{ required: true, validator: this.validateDrivingLicenseEndDate, trigger: 'change' })——仅用于渲染红*,实际校验仍走自定义 validator。
    2. 删除 drivingLicenseLongTerm{ required: true, message: '请选择驾驶证是否长期有效' } 规则块。
  • 关键机制(Element Plus 2.14 + async-validator 4.2.5 已核实):
    • 红* 由 form-itemisRequired = normalizedRules.some(rule => rule.required) 决定,只要规则对象带 required 就显示。
    • async-validator 的 rule.validate 中,若存在 rule.validator,直接走自定义 validator 并 return不会再执行 required 空值检查 → 勾「长期有效」时止日被清空/disabled 也不会误报必填。
    • 校验逻辑保持原样:起始日期恒必填;longTerm !== 1 时止日必填。
  • 未同步:「从业资格证信息」区仍是「有效期无红* + 长期有效有红*」的旧形态(待主人确认是否一并统一)。

司机弹窗 placeholder 统一为「请输入/请选择」(transportCapacity/driver.vue

  • 需求:新增/修改司机弹窗输入框 placeholder 去掉后面的字段名称,只保留「请输入」「请选择」。
  • 改动:18 处 placeholder 简化(7 处 → 请输入10 处 → 请选择1 处动态 cascader driverForm.addressRegion || '请选择省市区'|| '请选择')。
  • 保留 4 处(主人明确确认):
    1. 驾驶车辆 请输入或选择车辆 —— 复合操作(既可输入又可点按钮选车),去掉会丢语义。
    2. 日期范围 / —— 起止标记,非字段提示。
    3. 资格证号 默认身份证号 —— 默认值说明,非「请输入」格式。
  • 未动:表单校验错误提示 message 仍带字段名(如「请选择准驾车型」),因报错需指明具体字段,与 placeholder 定位不同;主人未要求,暂保持。
  • 做法:Python 脚本按完整 placeholder 字符串精确替换(18 规则全命中,未匹配即 exit 1 中断),比逐个 Edit 高效且不会误伤。
  • 校验:@vue/compiler-sfc parse + compileTemplate + compileScript 三项全通过。注意脚本必须放在项目根目录下运行(放 /tmp 解析不到 node_modules 里的 @vue/compiler-sfc)。
  • ⚠️ git diff 显示的 drivingLicenseLongTerm 校验规则变动是本次之前工作区已有的未提交改动(见上一条日志),非本次引入,勿混淆。

「自动生成结算单」开关加 ? 悬浮提示(3 处)

  • 需求:开关「开启」后面加问号图标,hover 提示「开启时,系统根据配置规则归集运单,定时生成结算单」。
  • 改动文件(同一文案,为保持全站一致):
    1. src/views/business/components/business-crud-page.vue1884 行附近,.business-crud-page__settlement-switch
    2. src/views/business/contract-manage.vue357 行附近,.contract-manage-form__settlement-switch
    3. src/views/business/contract-manage-change.vue55 行,.settlement-switch,原为单行长标签已拆行)
  • 写法:<el-radio :label="1">开启</el-radio> 后插 <el-tooltip content="..." placement="top"><el-icon class="settlement-switch-tip"><QuestionFilled /></el-icon></el-tooltip>,再接「关闭」radio。
  • 样式:.settlement-switch-tip { margin:0 4px; color:#a8abb2; cursor:help; font-size:14px },各文件 scoped 样式内一份(contract-manage 写在 &__settlement-switch 内)。
  • 注意:图标走 main.js 全局注册(@element-plus/icons-vue 全量注册),无需 import;写法与 project-apply.vue__label-tip 一致。
  • 这三个大文件本身已存在 prettier 格式问题(改动前 git HEAD 版本同样 fail),非本次引入。

车辆认证审核弹窗排版对齐新增弹窗(vehicle.vue

  • 诊断 /project-apply/fund-risk-stats No endpoint:前端已定义 getFundRiskStatsapi/business/project-apply.js:13),后端未实现;方案已给(后端补 R<{high,medium}> / 前端 catch 降级),待主人选。
  • vehicle.vue 认证审核弹窗重排对齐新增弹窗:取消独立「尺寸重量」卡片,外廓尺寸改长/宽/高组合(span12dimension-group);基础信息 3 行×4 列(车牌号/车辆类型/外廓尺寸;载质量/牵引质量/业务关系/能源类型;强制报废日期/海关备案号/所有组织/使用部门);证件信息按新增「车辆资质图片」行分布(止+运输证号+止+年审 / 登记编号+登记日期+档案编号+行驶证起 / 运输证起 / 备注整行);label「所属组织」改「所有组织」对齐新增;dimension-group 样式复制进 .certification-audit 作用域。@vue/compiler-sfc 编译校验通过。
  • vehicle.vue 行驶证有效期必填星号:原规则是纯 validatorElement Plus 不渲染星号),改为 data 内 baseRules + computed formRulesdrivingLicenseEndDate 动态返回 required 规则(长期有效=1 时返回 [],星号与校验同步消失);删除 validateDrivingLicenseEndDate。经验:Element Plus 星号只在规则含 required:true 时渲染,且 el-form-item 的 :required 属性会被注入为 {required} 规则并产生英文默认提示,不宜用它控制星号。
  • 备注:车辆保存的「车牌颜色不能为空」「行驶证有效期:必填」均为后端校验(前端无对应规则),需后端改。
  • driver.vue 从业资格证有效期对齐驾驶证:单日期改 date-range 起/止(列宽 6+6+6+6 → 6+6+8+4),新增 qualificationStartDate 字段(emptyForm + handleSubmit normalize);qualificationEndDate 规则加 required:true(渲染星号,validator 豁免长期);删除 qualificationLongTerm 的 required 规则(长期有效不必填);勾长期后起止均 disabled(比驾驶证更严,驾驶证起仍可编辑)。⚠️ 后端需新增 qualification_start_date 字段否则起日期无法存取。
  • driver.vue 补充:驾驶证「有效期起」加 :disabled(长期=1 时禁用);驾驶证与从业资格证两个 validator 统一在「长期有效=1」时直接 callback() 放行(起止都不校验、不提示)。禁用不清空旧值,提交时保留原日期(后端以 longTerm 为准)。
  • contract-manage-change.vue「合同文件」批量下载按钮上移:标题与按钮合并进 .section-headflex space-between 同排),与「其它附件/计费信息」分区一致;删除无引用的 .attachment-head 样式。
  • contract-manage-change.vue「自动生成结算单」问号提示图标位置:原 icon 夹在开启/关闭 radio 之间,因 .el-radio 默认 margin-right:32px 导致离开启远、贴关闭;修复 = 开启 radio margin-right 清零 + icon margin 改 0 32px 0 8px。