3 Commits

Author SHA1 Message Date
gxwebsoft 716ce43862 feat(driver): 优化驾驶证信息必填规则和表单placeholder统一
- 驾驶证有效期必填加红星,长期有效去除必填红星,保持校验逻辑不变
- 统一司机弹窗所有输入框和选择框的placeholder为“请输入”或“请选择”,去除字段名
- 保留复合操作、日期范围起止及默认值说明的特例placeholder不变
- 新增3处自动生成结算单开关后悬浮问号图标和提示,增强用户理解
- customer-archive中新增customerKindOptions和映射,用于客户类别选择
- 提升archive-form label与控件垂直居中样式至全局,修正多页标签顶置问题
2026-09-09 17:35:19 +08:00
gxwebsoft 14c6ad0a31 feat(vehicle): 优化车辆管理相关表单布局和字段
- 车牌号组件改为单一输入框,去除省简称和颜色选择,实现完整车牌号输入
- 重写车牌号校验逻辑,校验完整车牌号格式,错误提示更加明确
- 车辆新增/编辑弹窗输入框宽度统一调整,基础信息和资质图片区按四列布局排列
- 修复所有组织字段宽度不一致问题,补充级联选择器样式支持
- 司机新增/编辑弹窗调整为四列布局,调整字段排列顺序,提升界面整洁度
- 客商档案中「客商类型」改名为「客商分类」,新增「客商类型」字段支持外部客商和内部组织区分
- 上传证件项 label 贴顶问题修复,统一提升到全局样式实现垂直居中
- 移除车牌颜色只读展示,审核弹窗同步删除车牌颜色字段
- 保持后端接口兼容,数据库字段未变,OCR同步调用链路无影响
2026-09-09 17:19:33 +08:00
gxwebsoft 1972115173 feat(transportCapacity): 优化车辆与司机弹窗布局并新增字段支持
- 车辆新增弹窗:所有组织移至基础车辆信息区末尾,新增使用部门字段,使用部门复用部门下拉
- 车牌号三段合并为整体输入框,优化样式为flex布局,去除多余边框及阴影,统一视觉
- 长期有效勾选时清空对应日期且禁用输入,新增handleLongTermChange方法,表单校验支持长期有效跳过必填
- 司机弹窗基础身份信息新增placeholder,调整布局,基础身份三列保持不变,其他信息行按需求拆分重排为一致三列
- 后端新增use_department字段,相关mapper、service及校验同步更新,新增增量迁移脚本支持
- 车辆表单相关输入控件宽度统一调整为6列布局,保持与其它区块一致,提升整体UI协调性
- 移除车辆车牌号拆分相关字段及逻辑,车牌号统一管理为单个字段,简化处理流程
- 代码中新增校验规则validateDrivingLicenseEndDate及validateRoadTransportCertEndDate,支持长期有效逻辑
- 优化图片上传区和证件信息区表单字段排列,提升表单整体易用性与规范性
2026-09-09 15:37:40 +08:00
9 changed files with 432 additions and 227 deletions
+120
View File
@@ -83,3 +83,123 @@
3. `loadSettlementDictionaries``Promise.all` 追加 `getBizDictionary({ code: 'contractCategory' })`,映射填充后**条件覆盖** `contractCategory` 列 dicData(仅非空时)。 3. `loadSettlementDictionaries``Promise.all` 追加 `getBizDictionary({ code: 'contractCategory' })`,映射填充后**条件覆盖** `contractCategory` 列 dicData(仅非空时)。
- 列表页列显示/搜索下拉、详情页(detailValue 已有 `prop==='contractCategory'` 分支走 displayStatus)均因 column.dicData 覆盖而自动跟随业务字典。 - 列表页列显示/搜索下拉、详情页(detailValue 已有 `prop==='contractCategory'` 分支走 displayStatus)均因 column.dicData 覆盖而自动跟随业务字典。
- 注意:`config.defaultForm.contractCategory: '客户合同'`option/contract-manage.js)为硬编码中文默认值,若业务字典 dictKey 非中文需同步调整。 - 注意:`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.java``private 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.sql`ALTER 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:删 `plateProvince``plateNoBody`,保留 `plateNo``plateColor`(后端字段继续存历史车牌颜色)。
3. data:删 `plateProvinceOptions``plateColorOptions` 暴露;常量 `plateProvinceOptions`31 省简称数组)整段删除;`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 `customerKind`el-select + `customerKindOptions`)。
2. data 新增 `customerKindOptions` / `customerKindMap`external/internal ↔ 中文)。
3. formRules`customerType` 提示文案改「请选择客商分类」。
4. 列表列:「客户类型」label 改「客商分类」;新增「客商类型」列(prop customerKindtype selectdicData 内外部,minWidth 120**未加 search**)。
5. `emptyArchive()``customerKind: 'external'`
6. `normalizeDetail()``customerKind: detail.customerKind || 'external'`
7. 变更记录 `getChangeFieldLabel``customerType:'客商分类'`,新增 `customerKind:'客商类型'`
8. `formatChangeFieldValue`:别名映射加 `客商分类/客户类型 → customerType``客商类型 → customerKind`valueMap 加 `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-item``isRequired = 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.vue`1884 行附近,`.business-crud-page__settlement-switch`
2. `src/views/business/contract-manage.vue`357 行附近,`.contract-manage-form__settlement-switch`
3. `src/views/business/contract-manage-change.vue`55 行,`.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),非本次引入。
+11
View File
@@ -2,6 +2,17 @@
## 设计约定(已确认) ## 设计约定(已确认)
### 表单 placeholder 统一为「请输入 / 请选择」(不带字段名)
- **规范**:输入框 placeholder 只写动作词 `请输入` / `请选择`,**后面不跟字段名称**(label 已说明是什么字段,重复无意义)。
- 已生效页面:waybill-manage、transport-plan、shipping-template、temporary-credit-limit(搜索栏 + 弹窗表单)、**driver.vue**2026-09-09 补齐 18 处)。
- **3 类例外必须保留,不要误简化**:
1. 复合操作:如 `请输入或选择车辆`(既可键盘输入又可点按钮弹窗选车),丢掉会损失语义。
2. 日期区间的 `起` / `止`:是起止标记,不是字段提示。
3. 默认值说明:如资格证号 `默认身份证号`、车牌号 `如:京A12345`,属于示例/默认值提示,非「请输入」格式。
- **校验错误提示 message 保持带字段名**(如「请选择准驾车型」「请输入档案编号」),与 placeholder 定位不同——报错必须指明具体哪个字段,不能只说「请选择」。
- Avue 配置化表单:在 option 各列加 `placeholder`;搜索栏可用通用工具 `withSearchPlaceholders([...])`(见 temporary-credit-limit.js)。
- 批量改法:Python 脚本按**完整 placeholder 字符串**做精确替换,每规则校验 `count > 0` 否则中断,避免误伤;改完用 `@vue/compiler-sfc` 的 parse + compileTemplate + compileScript 验证(脚本须放项目根目录下跑,放 /tmp 解析不到 node_modules)。
### 弹窗分组:统一用全局 `<section-card>` ### 弹窗分组:统一用全局 `<section-card>`
- 弹窗 body 背景由 `src/styles/element-ui.scss` 全局 `.el-dialog__body { background:#f5f6fa; padding:16px }` 统一灰底。 - 弹窗 body 背景由 `src/styles/element-ui.scss` 全局 `.el-dialog__body { background:#f5f6fa; padding:16px }` 统一灰底。
- 每组 = 白底卡片:4px 主色竖条 + 8px 间距 + 圆角 6px + 淡阴影。组件全局注册 `<section-card title="...">`,支持 `#title` / `#extra` slot。 - 每组 = 白底卡片:4px 主色竖条 + 8px 间距 + 圆角 6px + 淡阴影。组件全局注册 `<section-card title="...">`,支持 `#title` / `#extra` slot。
+8
View File
@@ -1085,6 +1085,14 @@ td.el-table-fixed-column--right {
line-height: inherit; line-height: inherit;
margin-right: 4px; margin-right: 4px;
} }
// ============ archive-formlabel 与控件垂直居中(全站复用) ============
// archive-form class 被 driver / vehicle / ship / credit-score-quantification / loading-manage 等
// 多个页面复用,但「垂直居中」规则原本锁在 customer-archive.vue 的 scoped 样式里,
// 其它页面拿不到 → 高控件行(证件上传 151px)label 贴顶。提升为全局统一生效。
.archive-form .el-form-item {
align-items: center;
}
//.el-form-item { //.el-form-item {
// margin-bottom: 15px !important; // margin-bottom: 15px !important;
//} //}
@@ -1883,6 +1883,12 @@
<span>自动生成结算单</span> <span>自动生成结算单</span>
<el-radio-group v-model="settlementRuleForm.autoGenerate" :disabled="dialogReadonly"> <el-radio-group v-model="settlementRuleForm.autoGenerate" :disabled="dialogReadonly">
<el-radio :label="1">开启</el-radio> <el-radio :label="1">开启</el-radio>
<el-tooltip
content="开启时,系统根据配置规则归集运单,定时生成结算单"
placement="top"
>
<el-icon class="settlement-switch-tip"><QuestionFilled /></el-icon>
</el-tooltip>
<el-radio :label="0">关闭</el-radio> <el-radio :label="0">关闭</el-radio>
</el-radio-group> </el-radio-group>
</div> </div>
@@ -14453,6 +14459,13 @@ export default {
color: #303133; color: #303133;
} }
.settlement-switch-tip {
margin: 0 4px;
color: #a8abb2;
cursor: help;
font-size: 14px;
}
&__module-form { &__module-form {
width: 100%; width: 100%;
+11 -1
View File
@@ -52,7 +52,16 @@
<el-tab-pane label="预结算配置" name="pre" /> <el-tab-pane label="预结算配置" name="pre" />
<el-tab-pane label="正式结算配置" name="formal" /> <el-tab-pane label="正式结算配置" name="formal" />
</el-tabs> </el-tabs>
<div class="settlement-switch"><span>自动生成结算单</span><el-radio-group v-model="settlementRule.autoGenerate"><el-radio :label="1">开启</el-radio><el-radio :label="0">关闭</el-radio></el-radio-group></div> <div class="settlement-switch">
<span>自动生成结算单</span>
<el-radio-group v-model="settlementRule.autoGenerate">
<el-radio :label="1">开启</el-radio>
<el-tooltip content="开启时,系统根据配置规则归集运单,定时生成结算单" placement="top">
<el-icon class="settlement-switch-tip"><QuestionFilled /></el-icon>
</el-tooltip>
<el-radio :label="0">关闭</el-radio>
</el-radio-group>
</div>
<el-form v-if="settlementRule.autoGenerate === 1" :model="settlementRule" label-position="right" label-width="auto" class="settlement-form"> <el-form v-if="settlementRule.autoGenerate === 1" :model="settlementRule" label-position="right" label-width="auto" class="settlement-form">
<el-form-item label="账单起始日期" required><el-date-picker v-model="settlementRule.billStartDate" type="date" placeholder="请选择账单起始日期" format="YYYY-MM-DD" value-format="YYYY-MM-DD" /></el-form-item> <el-form-item label="账单起始日期" required><el-date-picker v-model="settlementRule.billStartDate" type="date" placeholder="请选择账单起始日期" format="YYYY-MM-DD" value-format="YYYY-MM-DD" /></el-form-item>
<el-form-item label="结算类型" required><el-select v-model="settlementRule.settlementType" placeholder="请选择结算类型" @change="handleSettlementTypeChange"><el-option v-for="item in settlementTypeOptions" :key="item" :label="item" :value="item" /></el-select></el-form-item> <el-form-item label="结算类型" required><el-select v-model="settlementRule.settlementType" placeholder="请选择结算类型" @change="handleSettlementTypeChange"><el-option v-for="item in settlementTypeOptions" :key="item" :label="item" :value="item" /></el-select></el-form-item>
@@ -211,6 +220,7 @@ export default {
.attachment-upload .vehicle-attachment-upload { width: auto; } .attachment-upload .vehicle-attachment-upload { width: auto; }
.attachment-upload .el-upload { display: inline-flex; } .attachment-upload .el-upload { display: inline-flex; }
.settlement-switch { display: flex; align-items: center; gap: 12px; margin-bottom: 16px; } .settlement-switch { display: flex; align-items: center; gap: 12px; margin-bottom: 16px; }
.settlement-switch-tip { margin: 0 4px; color: #a8abb2; cursor: help; font-size: 14px; }
.settlement-form { display: grid; grid-template-columns: repeat(3, minmax(240px, 1fr)); gap: 8px 28px; } .settlement-form { display: grid; grid-template-columns: repeat(3, minmax(240px, 1fr)); gap: 8px 28px; }
.change-reason-section { margin: 20px 0; } .change-reason-section { margin: 20px 0; }
.page-footer { .page-footer {
+13
View File
@@ -356,6 +356,12 @@
<span>自动生成结算单</span> <span>自动生成结算单</span>
<el-radio-group v-model="settlementRuleForm.autoGenerate"> <el-radio-group v-model="settlementRuleForm.autoGenerate">
<el-radio :label="1">开启</el-radio> <el-radio :label="1">开启</el-radio>
<el-tooltip
content="开启时系统根据配置规则归集运单定时生成结算单"
placement="top"
>
<el-icon class="settlement-switch-tip"><QuestionFilled /></el-icon>
</el-tooltip>
<el-radio :label="0">关闭</el-radio> <el-radio :label="0">关闭</el-radio>
</el-radio-group> </el-radio-group>
</div> </div>
@@ -2758,6 +2764,13 @@ export default {
align-items: center; align-items: center;
gap: 20px; gap: 20px;
margin-bottom: 16px; margin-bottom: 16px;
.settlement-switch-tip {
margin: 0 4px;
color: #a8abb2;
cursor: help;
font-size: 14px;
}
} }
&__settlement-grid { &__settlement-grid {
+64 -37
View File
@@ -125,43 +125,48 @@
> >
<section-card title="基础身份信息"> <section-card title="基础身份信息">
<el-row :gutter="18"> <el-row :gutter="18">
<el-col :span="8"> <el-col :span="6">
<el-form-item label="司机姓名" prop="driverName"> <el-form-item label="司机姓名" prop="driverName">
<el-input v-model="driverForm.driverName" maxlength="10" show-word-limit /> <el-input
v-model="driverForm.driverName"
maxlength="10"
show-word-limit
placeholder="请输入"
/>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="6">
<el-form-item label="身份证号" prop="idCardNo"> <el-form-item label="身份证号" prop="idCardNo">
<el-input <el-input
v-model="driverForm.idCardNo" v-model="driverForm.idCardNo"
maxlength="18" maxlength="18"
show-word-limit show-word-limit
placeholder="请输入"
@input="driverForm.idCardNo = String(driverForm.idCardNo || '').toUpperCase()" @input="driverForm.idCardNo = String(driverForm.idCardNo || '').toUpperCase()"
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="6">
<el-form-item label="出生年月" prop="birthday"> <el-form-item label="出生年月" prop="birthday">
<el-date-picker <el-date-picker
v-model="driverForm.birthday" v-model="driverForm.birthday"
type="date" type="date"
value-format="YYYY-MM-DD" value-format="YYYY-MM-DD"
placeholder="请选择"
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> <el-col :span="6">
<el-row :gutter="18">
<el-col :span="8">
<el-form-item label="性别" prop="gender"> <el-form-item label="性别" prop="gender">
<el-select v-model="driverForm.gender" clearable> <el-select v-model="driverForm.gender" clearable placeholder="请选择">
<el-option label="男" value="男" /> <el-option label="男" value="男" />
<el-option label="女" value="女" /> <el-option label="女" value="女" />
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="6">
<el-form-item label="民族" prop="nation"> <el-form-item label="民族" prop="nation">
<el-select v-model="driverForm.nation" clearable filterable> <el-select v-model="driverForm.nation" clearable filterable placeholder="请选择">
<el-option <el-option
v-for="item in nationOptions" v-for="item in nationOptions"
:key="item" :key="item"
@@ -171,9 +176,14 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="6">
<el-form-item label="学历" prop="education"> <el-form-item label="学历" prop="education">
<el-select v-model="driverForm.education" clearable filterable> <el-select
v-model="driverForm.education"
clearable
filterable
placeholder="请选择"
>
<el-option <el-option
v-for="item in educationOptions" v-for="item in educationOptions"
:key="item" :key="item"
@@ -183,30 +193,33 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> <el-col :span="6">
<el-row :gutter="18">
<el-col :span="8">
<el-form-item label="住址" prop="addressRegion"> <el-form-item label="住址" prop="addressRegion">
<el-cascader <el-cascader
ref="addressRegionCascader" ref="addressRegionCascader"
v-model="driverForm.addressRegionPath" v-model="driverForm.addressRegionPath"
:options="regionOptions" :options="regionOptions"
:props="regionCascaderProps" :props="regionCascaderProps"
:placeholder="driverForm.addressRegion || '请选择省市区'" :placeholder="driverForm.addressRegion || '请选择'"
clearable clearable
filterable filterable
@change="handleAddressRegionChange" @change="handleAddressRegionChange"
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="6">
<el-form-item label="详细地址" prop="address"> <el-form-item label="详细地址" prop="address">
<el-input v-model="driverForm.address" maxlength="200" show-word-limit /> <el-input
v-model="driverForm.address"
maxlength="200"
show-word-limit
placeholder="请输入"
/>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row :gutter="18"> <el-row :gutter="18">
<el-col :span="8"> <el-col :span="6">
<el-form-item label="驾驶车辆" prop="drivingVehicle"> <el-form-item label="驾驶车辆" prop="drivingVehicle">
<el-input <el-input
v-model="driverForm.drivingVehicle" v-model="driverForm.drivingVehicle"
@@ -238,7 +251,7 @@
</el-col> </el-col>
</el-row> </el-row>
<el-row :gutter="18"> <el-row :gutter="18">
<el-col :span="8"> <el-col :span="6">
<image-upload-field <image-upload-field
label="身份证正面照" label="身份证正面照"
prop="idCardFront" prop="idCardFront"
@@ -249,7 +262,7 @@
@success="url => handleIdCardUploadSuccess('idCardFront', url)" @success="url => handleIdCardUploadSuccess('idCardFront', url)"
/> />
</el-col> </el-col>
<el-col :span="8"> <el-col :span="6">
<image-upload-field <image-upload-field
label="身份证反面照" label="身份证反面照"
prop="idCardBack" prop="idCardBack"
@@ -260,7 +273,7 @@
@success="url => handleIdCardUploadSuccess('idCardBack', url)" @success="url => handleIdCardUploadSuccess('idCardBack', url)"
/> />
</el-col> </el-col>
<el-col :span="8"> <el-col :span="6">
<image-upload-field <image-upload-field
label="大头照" label="大头照"
prop="headPhoto" prop="headPhoto"
@@ -284,6 +297,7 @@
filterable filterable
allow-create allow-create
default-first-option default-first-option
placeholder="请选择"
> >
<el-option <el-option
v-for="item in drivingTypeOptions" v-for="item in drivingTypeOptions"
@@ -296,10 +310,14 @@
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item label="档案编号" prop="drivingLicenseNo"> <el-form-item label="档案编号" prop="drivingLicenseNo">
<el-input v-model="driverForm.drivingLicenseNo" maxlength="50" /> <el-input
v-model="driverForm.drivingLicenseNo"
maxlength="50"
placeholder="请输入"
/>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="8">
<el-form-item label="有效期" prop="drivingLicenseEndDate"> <el-form-item label="有效期" prop="drivingLicenseEndDate">
<div class="date-range"> <div class="date-range">
<el-date-picker <el-date-picker
@@ -320,7 +338,7 @@
</div> </div>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="4">
<el-form-item label="长期有效" prop="drivingLicenseLongTerm"> <el-form-item label="长期有效" prop="drivingLicenseLongTerm">
<el-checkbox <el-checkbox
v-model="driverForm.drivingLicenseLongTerm" v-model="driverForm.drivingLicenseLongTerm"
@@ -334,7 +352,7 @@
</el-col> </el-col>
</el-row> </el-row>
<el-row :gutter="18"> <el-row :gutter="18">
<el-col :span="12"> <el-col :span="6">
<image-upload-field <image-upload-field
label="驾驶证主页" label="驾驶证主页"
prop="drivingLicenseFront" prop="drivingLicenseFront"
@@ -347,7 +365,7 @@
" "
/> />
</el-col> </el-col>
<el-col :span="12"> <el-col :span="6">
<image-upload-field <image-upload-field
label="驾驶证副页" label="驾驶证副页"
prop="drivingLicenseBack" prop="drivingLicenseBack"
@@ -371,6 +389,7 @@
v-model="driverForm.qualificationType" v-model="driverForm.qualificationType"
clearable clearable
filterable filterable
placeholder="请选择"
> >
<el-option <el-option
v-for="item in qualificationTypeOptions" v-for="item in qualificationTypeOptions"
@@ -396,6 +415,7 @@
v-model="driverForm.qualificationEndDate" v-model="driverForm.qualificationEndDate"
type="date" type="date"
value-format="YYYY-MM-DD" value-format="YYYY-MM-DD"
placeholder="请选择"
:disabled="driverForm.qualificationLongTerm === 1" :disabled="driverForm.qualificationLongTerm === 1"
@change="validateFormField('qualificationEndDate')" @change="validateFormField('qualificationEndDate')"
/> />
@@ -415,7 +435,7 @@
</el-col> </el-col>
</el-row> </el-row>
<el-row :gutter="18"> <el-row :gutter="18">
<el-col :span="12"> <el-col :span="6">
<image-upload-field <image-upload-field
label="封面页" label="封面页"
prop="qualificationFront" prop="qualificationFront"
@@ -426,7 +446,7 @@
@success="url => handleQualificationUploadSuccess('qualificationFront', url)" @success="url => handleQualificationUploadSuccess('qualificationFront', url)"
/> />
</el-col> </el-col>
<el-col :span="12"> <el-col :span="6">
<image-upload-field <image-upload-field
label="内容页" label="内容页"
prop="qualificationBack" prop="qualificationBack"
@@ -444,7 +464,7 @@
<el-row :gutter="18"> <el-row :gutter="18">
<el-col :span="6"> <el-col :span="6">
<el-form-item label="司机类型" prop="driverType"> <el-form-item label="司机类型" prop="driverType">
<el-select v-model="driverForm.driverType" filterable> <el-select v-model="driverForm.driverType" filterable placeholder="请选择">
<el-option label="自有" value="自有" /> <el-option label="自有" value="自有" />
<el-option label="外协" value="外协" /> <el-option label="外协" value="外协" />
<el-option label="承运管理员" value="承运管理员" /> <el-option label="承运管理员" value="承运管理员" />
@@ -453,7 +473,11 @@
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item label="手机号" prop="mobile"> <el-form-item label="手机号" prop="mobile">
<el-input v-model="driverForm.mobile" maxlength="20" /> <el-input
v-model="driverForm.mobile"
maxlength="20"
placeholder="请输入"
/>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
@@ -461,13 +485,18 @@
<el-input <el-input
v-model="driverForm.emergencyContactName" v-model="driverForm.emergencyContactName"
maxlength="20" maxlength="20"
placeholder="请输入"
@input="driverForm.emergencyContactName = removeDigits($event)" @input="driverForm.emergencyContactName = removeDigits($event)"
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item label="紧急联系人手机号" prop="emergencyContactMobile"> <el-form-item label="紧急联系人手机号" prop="emergencyContactMobile">
<el-input v-model="driverForm.emergencyContactMobile" maxlength="20" /> <el-input
v-model="driverForm.emergencyContactMobile"
maxlength="20"
placeholder="请输入"
/>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
@@ -478,6 +507,7 @@
filterable filterable
allow-create allow-create
default-first-option default-first-option
placeholder="请选择"
> >
<el-option <el-option
v-for="item in relationOptions" v-for="item in relationOptions"
@@ -496,7 +526,7 @@
:props="organizationCascaderProps" :props="organizationCascaderProps"
filterable filterable
clearable clearable
placeholder="请选择 所属组织" placeholder="请选择"
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
@@ -783,10 +813,7 @@ export default {
drivingType: [{ required: true, message: '请选择准驾车型', trigger: 'change' }], drivingType: [{ required: true, message: '请选择准驾车型', trigger: 'change' }],
drivingLicenseNo: [{ required: true, message: '请输入档案编号', trigger: 'blur' }], drivingLicenseNo: [{ required: true, message: '请输入档案编号', trigger: 'blur' }],
drivingLicenseEndDate: [ drivingLicenseEndDate: [
{ validator: this.validateDrivingLicenseEndDate, trigger: 'change' }, { required: true, validator: this.validateDrivingLicenseEndDate, trigger: 'change' },
],
drivingLicenseLongTerm: [
{ required: true, message: '请选择驾驶证是否长期有效', trigger: 'change' },
], ],
qualificationType: [ qualificationType: [
{ required: true, message: '请选择从业资格认证类型', trigger: 'change' }, { required: true, message: '请选择从业资格认证类型', trigger: 'change' },
+147 -182
View File
@@ -137,34 +137,29 @@
</el-col> </el-col>
</el-row> </el-row>
<el-row :gutter="18"> <el-row :gutter="18">
<el-col :span="8"> <el-col :span="6">
<el-form-item label="车牌号"> <el-form-item label="车牌号">
<span class="certification-audit__value">{{ auditValue('plateNo') }}</span> <span class="certification-audit__value">{{ auditValue('plateNo') }}</span>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="6">
<el-form-item label="车牌颜色">
<span class="certification-audit__value">{{ auditValue('plateColor') }}</span>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="车辆类型"> <el-form-item label="车辆类型">
<span class="certification-audit__value">{{ auditValue('vehicleType') }}</span> <span class="certification-audit__value">{{ auditValue('vehicleType') }}</span>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row :gutter="18"> <el-row :gutter="18">
<el-col :span="8"> <el-col :span="6">
<el-form-item label="业务关系"> <el-form-item label="业务关系">
<span class="certification-audit__value">{{ auditValue('businessRelation') }}</span> <span class="certification-audit__value">{{ auditValue('businessRelation') }}</span>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="6">
<el-form-item label="能源类型"> <el-form-item label="能源类型">
<span class="certification-audit__value">{{ auditValue('energyType') }}</span> <span class="certification-audit__value">{{ auditValue('energyType') }}</span>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="6">
<el-form-item label="强制报废日期"> <el-form-item label="强制报废日期">
<span class="certification-audit__value"> <span class="certification-audit__value">
{{ auditValue('compulsoryScrapDate') }} {{ auditValue('compulsoryScrapDate') }}
@@ -176,29 +171,29 @@
<section-card title="尺寸重量"> <section-card title="尺寸重量">
<el-row :gutter="18"> <el-row :gutter="18">
<el-col :span="8"> <el-col :span="6">
<el-form-item label="外廓长度(毫米)"> <el-form-item label="外廓长度(毫米)">
<span class="certification-audit__value">{{ auditValue('outerLength') }}</span> <span class="certification-audit__value">{{ auditValue('outerLength') }}</span>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="6">
<el-form-item label="外廓宽度(毫米)"> <el-form-item label="外廓宽度(毫米)">
<span class="certification-audit__value">{{ auditValue('outerWidth') }}</span> <span class="certification-audit__value">{{ auditValue('outerWidth') }}</span>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="6">
<el-form-item label="外廓高度(毫米)"> <el-form-item label="外廓高度(毫米)">
<span class="certification-audit__value">{{ auditValue('outerHeight') }}</span> <span class="certification-audit__value">{{ auditValue('outerHeight') }}</span>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row :gutter="18"> <el-row :gutter="18">
<el-col :span="8"> <el-col :span="6">
<el-form-item label="核定载质量(KG"> <el-form-item label="核定载质量(KG">
<span class="certification-audit__value">{{ auditValue('approvedLoadKg') }}</span> <span class="certification-audit__value">{{ auditValue('approvedLoadKg') }}</span>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="6">
<el-form-item label="准牵引总质量(KG"> <el-form-item label="准牵引总质量(KG">
<span class="certification-audit__value">{{ auditValue('tractionMassKg') }}</span> <span class="certification-audit__value">{{ auditValue('tractionMassKg') }}</span>
</el-form-item> </el-form-item>
@@ -208,17 +203,17 @@
<section-card title="证件信息"> <section-card title="证件信息">
<el-row :gutter="18"> <el-row :gutter="18">
<el-col :span="8"> <el-col :span="6">
<el-form-item label="海关备案号"> <el-form-item label="海关备案号">
<span class="certification-audit__value">{{ auditValue('customsRecordNo') }}</span> <span class="certification-audit__value">{{ auditValue('customsRecordNo') }}</span>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="6">
<el-form-item label="行驶证档案编号"> <el-form-item label="行驶证档案编号">
<span class="certification-audit__value">{{ auditValue('drivingLicenseNo') }}</span> <span class="certification-audit__value">{{ auditValue('drivingLicenseNo') }}</span>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="6">
<el-form-item label="行驶证有效期起"> <el-form-item label="行驶证有效期起">
<span class="certification-audit__value"> <span class="certification-audit__value">
{{ auditValue('drivingLicenseStartDate') }} {{ auditValue('drivingLicenseStartDate') }}
@@ -227,21 +222,21 @@
</el-col> </el-col>
</el-row> </el-row>
<el-row :gutter="18"> <el-row :gutter="18">
<el-col :span="8"> <el-col :span="6">
<el-form-item label="行驶证有效期止"> <el-form-item label="行驶证有效期止">
<span class="certification-audit__value"> <span class="certification-audit__value">
{{ auditValue('drivingLicenseEndDate') }} {{ auditValue('drivingLicenseEndDate') }}
</span> </span>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="6">
<el-form-item label="道路运输证号"> <el-form-item label="道路运输证号">
<span class="certification-audit__value"> <span class="certification-audit__value">
{{ auditValue('roadTransportCertNo') }} {{ auditValue('roadTransportCertNo') }}
</span> </span>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="6">
<el-form-item label="道路运输证有效期起"> <el-form-item label="道路运输证有效期起">
<span class="certification-audit__value"> <span class="certification-audit__value">
{{ auditValue('roadTransportCertStartDate') }} {{ auditValue('roadTransportCertStartDate') }}
@@ -250,28 +245,28 @@
</el-col> </el-col>
</el-row> </el-row>
<el-row :gutter="18"> <el-row :gutter="18">
<el-col :span="8"> <el-col :span="6">
<el-form-item label="道路运输证有效期止"> <el-form-item label="道路运输证有效期止">
<span class="certification-audit__value"> <span class="certification-audit__value">
{{ auditValue('roadTransportCertEndDate') }} {{ auditValue('roadTransportCertEndDate') }}
</span> </span>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="6">
<el-form-item label="道路运输年审有效期"> <el-form-item label="道路运输年审有效期">
<span class="certification-audit__value"> <span class="certification-audit__value">
{{ auditValue('annualReviewEndDate') }} {{ auditValue('annualReviewEndDate') }}
</span> </span>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="6">
<el-form-item label="机动车登记编号"> <el-form-item label="机动车登记编号">
<span class="certification-audit__value">{{ auditValue('registrationNo') }}</span> <span class="certification-audit__value">{{ auditValue('registrationNo') }}</span>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row :gutter="18"> <el-row :gutter="18">
<el-col :span="8"> <el-col :span="6">
<el-form-item label="机动车登记日期"> <el-form-item label="机动车登记日期">
<span class="certification-audit__value">{{ auditValue('registrationDate') }}</span> <span class="certification-audit__value">{{ auditValue('registrationDate') }}</span>
</el-form-item> </el-form-item>
@@ -288,7 +283,7 @@
<section-card title="证件图片"> <section-card title="证件图片">
<el-row :gutter="18"> <el-row :gutter="18">
<el-col :span="8"> <el-col :span="6">
<image-upload-field <image-upload-field
label="行驶证主页正面" label="行驶证主页正面"
prop="drivingLicenseImage" prop="drivingLicenseImage"
@@ -298,7 +293,7 @@
class-prefix="vehicle" class-prefix="vehicle"
/> />
</el-col> </el-col>
<el-col :span="8"> <el-col :span="6">
<image-upload-field <image-upload-field
label="行驶证主页反面" label="行驶证主页反面"
prop="drivingLicenseMainBack" prop="drivingLicenseMainBack"
@@ -308,7 +303,7 @@
class-prefix="vehicle" class-prefix="vehicle"
/> />
</el-col> </el-col>
<el-col :span="8"> <el-col :span="6">
<image-upload-field <image-upload-field
label="行驶证副页正面" label="行驶证副页正面"
prop="drivingLicenseViceFront" prop="drivingLicenseViceFront"
@@ -320,7 +315,7 @@
</el-col> </el-col>
</el-row> </el-row>
<el-row :gutter="18"> <el-row :gutter="18">
<el-col :span="8"> <el-col :span="6">
<image-upload-field <image-upload-field
label="行驶证副页反面" label="行驶证副页反面"
prop="drivingLicenseViceBack" prop="drivingLicenseViceBack"
@@ -330,7 +325,7 @@
class-prefix="vehicle" class-prefix="vehicle"
/> />
</el-col> </el-col>
<el-col :span="8"> <el-col :span="6">
<image-upload-field <image-upload-field
label="道路运输证图片" label="道路运输证图片"
prop="roadTransportCertImage" prop="roadTransportCertImage"
@@ -340,7 +335,7 @@
class-prefix="vehicle" class-prefix="vehicle"
/> />
</el-col> </el-col>
<el-col :span="8"> <el-col :span="6">
<image-upload-field <image-upload-field
label="机动车登记本" label="机动车登记本"
prop="registrationImage" prop="registrationImage"
@@ -394,55 +389,16 @@
> >
<section-card title="基础车辆信息"> <section-card title="基础车辆信息">
<el-row :gutter="18"> <el-row :gutter="18">
<el-col :span="24"> <el-col :span="6">
<el-form-item label="所有组织" prop="organizationName">
<el-cascader
v-model="organizationCascaderValue"
:options="organizationTreeOptions"
:props="organizationCascaderProps"
filterable
clearable
placeholder="请选择 所属组织"
/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="18">
<el-col :span="10">
<el-form-item label="车牌号" prop="plateNo"> <el-form-item label="车牌号" prop="plateNo">
<div class="plate-group">
<el-select
v-model="vehicleForm.plateProvince"
placeholder="请选择"
filterable
@change="syncPlateNo(false)"
>
<el-option
v-for="item in plateProvinceOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
<el-input <el-input
v-model="vehicleForm.plateNoBody" v-model="vehicleForm.plateNo"
maxlength="7" maxlength="8"
show-word-limit show-word-limit
@input="handlePlateBodyInput" placeholder="如:京A12345"
@input="handlePlateNoInput"
@blur="validatePlateFormat"
/> />
<el-select
v-model="vehicleForm.plateColor"
placeholder="请选择"
@change="syncPlateNo(false)"
>
<el-option
v-for="item in plateColorOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</div>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
@@ -462,7 +418,7 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="12">
<el-form-item label="外廓尺寸(毫米)"> <el-form-item label="外廓尺寸(毫米)">
<div class="dimension-group"> <div class="dimension-group">
<div class="dimension-group__item"> <div class="dimension-group__item">
@@ -494,25 +450,27 @@
</el-col> </el-col>
</el-row> </el-row>
<el-row :gutter="18"> <el-row :gutter="18">
<el-col :span="8"> <el-col :span="6">
<el-form-item label="核定载质量(KG" prop="approvedLoadKg"> <el-form-item label="核定载质量(KG" prop="approvedLoadKg">
<el-input <el-input
v-model="vehicleForm.approvedLoadKg" v-model="vehicleForm.approvedLoadKg"
inputmode="numeric" inputmode="numeric"
placeholder="请输入"
@input="vehicleForm.approvedLoadKg = digitsOnly($event)" @input="vehicleForm.approvedLoadKg = digitsOnly($event)"
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="6">
<el-form-item label="准牵引总质量(KG" prop="tractionMassKg"> <el-form-item label="准牵引总质量(KG" prop="tractionMassKg">
<el-input <el-input
v-model="vehicleForm.tractionMassKg" v-model="vehicleForm.tractionMassKg"
inputmode="numeric" inputmode="numeric"
placeholder="请输入"
@input="vehicleForm.tractionMassKg = digitsOnly($event)" @input="vehicleForm.tractionMassKg = digitsOnly($event)"
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="6">
<el-form-item label="业务关系" prop="businessRelation"> <el-form-item label="业务关系" prop="businessRelation">
<el-select v-model="vehicleForm.businessRelation"> <el-select v-model="vehicleForm.businessRelation">
<el-option <el-option
@@ -524,9 +482,7 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> <el-col :span="6">
<el-row :gutter="18">
<el-col :span="8">
<el-form-item label="能源类型" prop="energyType"> <el-form-item label="能源类型" prop="energyType">
<el-select <el-select
v-model="vehicleForm.energyType" v-model="vehicleForm.energyType"
@@ -543,7 +499,9 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> </el-row>
<el-row :gutter="18">
<el-col :span="6">
<el-form-item label="强制报废日期" prop="compulsoryScrapDate"> <el-form-item label="强制报废日期" prop="compulsoryScrapDate">
<div class="date-with-flag"> <div class="date-with-flag">
<el-date-picker <el-date-picker
@@ -556,71 +514,98 @@
v-model="vehicleForm.compulsoryScrapLongTerm" v-model="vehicleForm.compulsoryScrapLongTerm"
:true-label="1" :true-label="1"
:false-label="0" :false-label="0"
@change="handleLongTermChange('compulsoryScrapDate', 'compulsoryScrapLongTerm')"
> >
长期有效 长期有效
</el-checkbox> </el-checkbox>
</div> </div>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="6">
<el-form-item label="海关备案号" prop="customsRecordNo"> <el-form-item label="海关备案号" prop="customsRecordNo">
<el-input v-model="vehicleForm.customsRecordNo" maxlength="50" /> <el-input v-model="vehicleForm.customsRecordNo" maxlength="50" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6">
<el-form-item label="所有组织" prop="organizationName">
<el-cascader
v-model="organizationCascaderValue"
:options="organizationTreeOptions"
:props="organizationCascaderProps"
filterable
clearable
placeholder="请选择"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="使用部门" prop="useDepartment">
<el-select
v-model="vehicleForm.useDepartment"
filterable
clearable
placeholder="请选择"
>
<el-option
v-for="item in organizationOptions"
:key="item.id"
:label="item.rawLabel"
:value="item.rawLabel"
/>
</el-select>
</el-form-item>
</el-col>
</el-row> </el-row>
</section-card> </section-card>
<section-card title="车辆资质图片"> <section-card title="车辆资质图片">
<el-row :gutter="18"> <el-row :gutter="18">
<el-col :span="6"> <el-col :span="6">
<el-form-item label="行驶证档案编号" prop="drivingLicenseNo">
<el-input v-model="vehicleForm.drivingLicenseNo" maxlength="50" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="行驶证有效期" prop="drivingLicenseEndDate"> <el-form-item label="行驶证有效期" prop="drivingLicenseEndDate">
<div class="date-with-flag"> <div class="date-with-flag">
<el-date-picker <el-date-picker
v-model="vehicleForm.drivingLicenseEndDate" v-model="vehicleForm.drivingLicenseEndDate"
type="date" type="date"
value-format="YYYY-MM-DD" value-format="YYYY-MM-DD"
:disabled="vehicleForm.drivingLicenseLongTerm === 1"
/> />
<el-checkbox <el-checkbox
v-model="vehicleForm.drivingLicenseLongTerm" v-model="vehicleForm.drivingLicenseLongTerm"
:true-label="1" :true-label="1"
:false-label="0" :false-label="0"
@change="handleLongTermChange('drivingLicenseEndDate', 'drivingLicenseLongTerm')"
> >
长期有效 长期有效
</el-checkbox> </el-checkbox>
</div> </div>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="10"> <el-col :span="6">
<el-form-item label="道路运输证号" prop="roadTransportCertNo"> <el-form-item label="道路运输证号" prop="roadTransportCertNo">
<el-input v-model="vehicleForm.roadTransportCertNo" maxlength="50" /> <el-input v-model="vehicleForm.roadTransportCertNo" maxlength="50" />
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> <el-col :span="6">
<el-row :gutter="18">
<el-col :span="8">
<el-form-item label="道路运输证有效期" prop="roadTransportCertEndDate"> <el-form-item label="道路运输证有效期" prop="roadTransportCertEndDate">
<div class="date-with-flag"> <div class="date-with-flag">
<el-date-picker <el-date-picker
v-model="vehicleForm.roadTransportCertEndDate" v-model="vehicleForm.roadTransportCertEndDate"
type="date" type="date"
value-format="YYYY-MM-DD" value-format="YYYY-MM-DD"
:disabled="vehicleForm.roadTransportCertLongTerm === 1"
/> />
<el-checkbox <el-checkbox
v-model="vehicleForm.roadTransportCertLongTerm" v-model="vehicleForm.roadTransportCertLongTerm"
:true-label="1" :true-label="1"
:false-label="0" :false-label="0"
@change="handleLongTermChange('roadTransportCertEndDate', 'roadTransportCertLongTerm')"
> >
长期有效 长期有效
</el-checkbox> </el-checkbox>
</div> </div>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="6">
<el-form-item label="道路运输年审有效期" prop="annualReviewEndDate"> <el-form-item label="道路运输年审有效期" prop="annualReviewEndDate">
<div class="date-with-flag"> <div class="date-with-flag">
<el-date-picker <el-date-picker
@@ -633,6 +618,7 @@
v-model="vehicleForm.annualReviewLongTerm" v-model="vehicleForm.annualReviewLongTerm"
:true-label="1" :true-label="1"
:false-label="0" :false-label="0"
@change="handleLongTermChange('annualReviewEndDate', 'annualReviewLongTerm')"
> >
长期有效 长期有效
</el-checkbox> </el-checkbox>
@@ -641,12 +627,12 @@
</el-col> </el-col>
</el-row> </el-row>
<el-row :gutter="18"> <el-row :gutter="18">
<el-col :span="8"> <el-col :span="6">
<el-form-item label="机动车登记编号" prop="registrationNo"> <el-form-item label="机动车登记编号" prop="registrationNo">
<el-input v-model="vehicleForm.registrationNo" maxlength="50" /> <el-input v-model="vehicleForm.registrationNo" maxlength="50" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="6">
<el-form-item label="机动车登记日期" prop="registrationDate"> <el-form-item label="机动车登记日期" prop="registrationDate">
<el-date-picker <el-date-picker
v-model="vehicleForm.registrationDate" v-model="vehicleForm.registrationDate"
@@ -655,9 +641,14 @@
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6">
<el-form-item label="行驶证档案编号" prop="drivingLicenseNo">
<el-input v-model="vehicleForm.drivingLicenseNo" maxlength="50" />
</el-form-item>
</el-col>
</el-row> </el-row>
<el-row :gutter="18"> <el-row :gutter="18">
<el-col :span="8"> <el-col :span="6">
<image-upload-field <image-upload-field
label="行驶证主页正面" label="行驶证主页正面"
prop="drivingLicenseImage" prop="drivingLicenseImage"
@@ -672,7 +663,7 @@
" "
/> />
</el-col> </el-col>
<el-col :span="8"> <el-col :span="6">
<image-upload-field <image-upload-field
label="行驶证主页反面" label="行驶证主页反面"
prop="drivingLicenseMainBack" prop="drivingLicenseMainBack"
@@ -687,7 +678,7 @@
" "
/> />
</el-col> </el-col>
<el-col :span="8"> <el-col :span="6">
<image-upload-field <image-upload-field
label="行驶证副页正面" label="行驶证副页正面"
prop="drivingLicenseViceFront" prop="drivingLicenseViceFront"
@@ -704,7 +695,7 @@
</el-col> </el-col>
</el-row> </el-row>
<el-row :gutter="18"> <el-row :gutter="18">
<el-col :span="8"> <el-col :span="6">
<image-upload-field <image-upload-field
label="行驶证副页反面" label="行驶证副页反面"
prop="drivingLicenseViceBack" prop="drivingLicenseViceBack"
@@ -719,7 +710,7 @@
" "
/> />
</el-col> </el-col>
<el-col :span="8"> <el-col :span="6">
<image-upload-field <image-upload-field
label="道路运输证图片" label="道路运输证图片"
prop="roadTransportCertImage" prop="roadTransportCertImage"
@@ -731,7 +722,7 @@
@success="url => handleVehicleCertificateUploadSuccess('roadTransportCertImage', url)" @success="url => handleVehicleCertificateUploadSuccess('roadTransportCertImage', url)"
/> />
</el-col> </el-col>
<el-col :span="8"> <el-col :span="6">
<image-upload-field <image-upload-field
label="机动车登记本" label="机动车登记本"
prop="registrationImage" prop="registrationImage"
@@ -787,8 +778,7 @@ import VehicleLedger from './components/vehicle-ledger.vue';
const emptyForm = () => ({ const emptyForm = () => ({
id: '', id: '',
organizationName: '', organizationName: '',
plateProvince: '', useDepartment: '',
plateNoBody: '',
plateNo: '', plateNo: '',
plateColor: '', plateColor: '',
vehicleType: '', vehicleType: '',
@@ -823,44 +813,6 @@ const emptyForm = () => ({
status: 1, status: 1,
}); });
const plateProvinceOptions = [
'京',
'津',
'沪',
'渝',
'冀',
'豫',
'云',
'辽',
'黑',
'湘',
'皖',
'鲁',
'新',
'苏',
'浙',
'赣',
'鄂',
'桂',
'甘',
'晋',
'蒙',
'陕',
'吉',
'闽',
'贵',
'粤',
'青',
'藏',
'川',
'宁',
'琼',
'港',
'澳',
].map(item => ({ label: item, value: item }));
const plateColorOptions = ['黄牌', '蓝牌', '绿牌'].map(item => ({ label: item, value: item }));
export default { export default {
components: { components: {
ImageUploadField, ImageUploadField,
@@ -904,8 +856,6 @@ export default {
vehicleCertificateUploads: {}, vehicleCertificateUploads: {},
uploadHeaders: getUploadHeaders(), uploadHeaders: getUploadHeaders(),
organizationOptions: [], organizationOptions: [],
plateProvinceOptions,
plateColorOptions,
vehicleTypeOptions: [ vehicleTypeOptions: [
{ label: '高栏车', value: '高栏' }, { label: '高栏车', value: '高栏' },
{ label: '低栏车', value: '低栏' }, { label: '低栏车', value: '低栏' },
@@ -928,11 +878,11 @@ export default {
energyType: [{ required: true, message: '请选择能源类型', trigger: 'change' }], energyType: [{ required: true, message: '请选择能源类型', trigger: 'change' }],
drivingLicenseNo: [{ required: true, message: '请输入行驶证档案编号', trigger: 'blur' }], drivingLicenseNo: [{ required: true, message: '请输入行驶证档案编号', trigger: 'blur' }],
drivingLicenseEndDate: [ drivingLicenseEndDate: [
{ required: true, message: '请选择行驶证有效期', trigger: 'change' }, { validator: this.validateDrivingLicenseEndDate, trigger: 'change' },
], ],
roadTransportCertNo: [{ required: true, message: '请输入道路运输证号', trigger: 'blur' }], roadTransportCertNo: [{ required: true, message: '请输入道路运输证号', trigger: 'blur' }],
roadTransportCertEndDate: [ roadTransportCertEndDate: [
{ required: true, message: '请选择道路运输证有效期', trigger: 'change' }, { validator: this.validateRoadTransportCertEndDate, trigger: 'change' },
], ],
annualReviewEndDate: [{ validator: this.validateAnnualReviewEndDate, trigger: 'change' }], annualReviewEndDate: [{ validator: this.validateAnnualReviewEndDate, trigger: 'change' }],
registrationNo: [{ required: true, message: '请输入机动车登记编号', trigger: 'blur' }], registrationNo: [{ required: true, message: '请输入机动车登记编号', trigger: 'blur' }],
@@ -1021,19 +971,20 @@ export default {
return String(value).replace(/\D/g, ''); return String(value).replace(/\D/g, '');
}, },
validatePlateNo(rule, value, callback) { validatePlateNo(rule, value, callback) {
const plateProvince = String(this.vehicleForm.plateProvince || '').trim(); const plateNo = String(value || '')
const plateNoBody = String(this.vehicleForm.plateNoBody || '')
.trim() .trim()
.toUpperCase(); .toUpperCase();
const plateColor = String(this.vehicleForm.plateColor || '').trim(); if (!plateNo) {
if (!plateProvince || !plateNoBody || !plateColor) { callback(new Error('请输入车牌号'));
callback(new Error('请完整填写车牌号'));
return; return;
} }
if (!/^[A-Z][A-Z0-9挂学警港澳]{5,6}$/.test(plateNoBody)) { if (!/^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼港澳]{1}[A-Z][A-Z0-9挂学警港澳]{5,6}$/.test(plateNo)) {
callback(new Error('请输入标准车牌号')); callback(new Error('请输入标准车牌号(如:京A12345'));
return; return;
} }
if (this.vehicleForm.plateNo !== plateNo) {
this.vehicleForm.plateNo = plateNo;
}
callback(); callback();
}, },
validateAnnualReviewEndDate(rule, value, callback) { validateAnnualReviewEndDate(rule, value, callback) {
@@ -1043,6 +994,35 @@ export default {
} }
callback(); callback();
}, },
// 长期有效勾选:勾选时清空对应日期(不可编辑由 date-picker :disabled 控制),取消勾选后可重新填报
handleLongTermChange(dateProp, longTermProp) {
if (this.vehicleForm[longTermProp] === 1) {
this.vehicleForm[dateProp] = '';
}
this.$refs.vehicleForm?.validateField(dateProp);
},
validateDrivingLicenseEndDate(rule, value, callback) {
if (this.vehicleForm.drivingLicenseLongTerm === 1 && !value) {
callback();
return;
}
if (!value) {
callback(new Error('请选择行驶证有效期'));
return;
}
callback();
},
validateRoadTransportCertEndDate(rule, value, callback) {
if (this.vehicleForm.roadTransportCertLongTerm === 1 && !value) {
callback();
return;
}
if (!value) {
callback(new Error('请选择道路运输证有效期'));
return;
}
callback();
},
openVehicle(row, readonly = false) { openVehicle(row, readonly = false) {
this.readonly = readonly; this.readonly = readonly;
if (!row?.id) { if (!row?.id) {
@@ -1415,33 +1395,25 @@ export default {
); );
return option ? option.value : vehicleType; return option ? option.value : vehicleType;
}, },
handlePlateBodyInput(value) { handlePlateNoInput(value) {
this.vehicleForm.plateNoBody = String(value || '').toUpperCase(); this.vehicleForm.plateNo = String(value || '')
this.syncPlateNo(); .replace(/\s/g, '')
.toUpperCase();
},
validatePlateFormat() {
this.$refs.vehicleForm?.validateField('plateNo');
}, },
syncPlateNo(validate = true) { syncPlateNo(validate = true) {
const plateProvince = String(this.vehicleForm.plateProvince || '').trim(); const plateNo = String(this.vehicleForm.plateNo || '')
const plateNoBody = String(this.vehicleForm.plateNoBody || '') .replace(/\s/g, '')
.trim()
.toUpperCase(); .toUpperCase();
const plateColor = String(this.vehicleForm.plateColor || '').trim(); this.vehicleForm.plateNo = plateNo;
this.vehicleForm.plateNoBody = plateNoBody;
this.vehicleForm.plateNo =
plateProvince && plateNoBody ? `${plateProvince}${plateNoBody}` : '';
this.vehicleForm.plateColor = plateColor;
if (validate) { if (validate) {
this.$refs.vehicleForm?.validateField('plateNo'); this.$refs.vehicleForm?.validateField('plateNo');
} }
}, },
splitPlateNo() { splitPlateNo() {
const plateNo = String(this.vehicleForm.plateNo || '').trim(); // 车牌号已统一为单一 input,无需拆分
if (!plateNo) {
this.vehicleForm.plateProvince = '';
this.vehicleForm.plateNoBody = '';
return;
}
this.vehicleForm.plateProvince = plateNo.slice(0, 1);
this.vehicleForm.plateNoBody = plateNo.slice(1).toUpperCase();
}, },
handleSubmit() { handleSubmit() {
this.syncPlateNo(); this.syncPlateNo();
@@ -1676,17 +1648,11 @@ export default {
:deep(.el-date-editor.el-input__wrapper), :deep(.el-date-editor.el-input__wrapper),
:deep(.el-select), :deep(.el-select),
:deep(.el-input), :deep(.el-input),
:deep(.el-input-number) { :deep(.el-input-number),
:deep(.el-cascader) {
width: 100%; width: 100%;
} }
.plate-group {
display: grid;
grid-template-columns: 112px minmax(0, 1fr) 112px;
gap: 8px;
align-items: center;
}
.dimension-group { .dimension-group {
display: grid; display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr)); grid-template-columns: repeat(3, minmax(0, 1fr));
@@ -1704,7 +1670,6 @@ export default {
.dimension-group__label { .dimension-group__label {
flex-shrink: 0; flex-shrink: 0;
color: #303133; color: #303133;
font-weight: 500;
} }
.date-with-flag { .date-with-flag {
+42 -4
View File
@@ -224,7 +224,7 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item label="客商类" prop="customerType"> <el-form-item label="客商类" prop="customerType">
<el-select <el-select
v-model="archiveForm.customerType" v-model="archiveForm.customerType"
multiple multiple
@@ -241,6 +241,23 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6">
<el-form-item label="客商类型" prop="customerKind">
<el-select
v-model="archiveForm.customerKind"
placeholder="请选择"
filterable
clearable
>
<el-option
v-for="item in customerKindOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item label="企业法人" prop="legalPerson"> <el-form-item label="企业法人" prop="legalPerson">
<el-input v-model="archiveForm.legalPerson" maxlength="10" show-word-limit /> <el-input v-model="archiveForm.legalPerson" maxlength="10" show-word-limit />
@@ -1628,6 +1645,14 @@ export default {
regionOptions: [], regionOptions: [],
customerNatureOptions: [], customerNatureOptions: [],
customerTypeOptions: [], customerTypeOptions: [],
customerKindOptions: [
{ label: '外部客商', value: 'external' },
{ label: '内部组织', value: 'internal' },
],
customerKindMap: {
external: '外部客商',
internal: '内部组织',
},
businessScopeOptions: [], businessScopeOptions: [],
qualificationTypeOptions: [], qualificationTypeOptions: [],
creditLevelOptions: ['A', 'B', 'C', 'D', 'E', 'F'].map(item => ({ creditLevelOptions: ['A', 'B', 'C', 'D', 'E', 'F'].map(item => ({
@@ -1660,7 +1685,7 @@ export default {
trigger: 'blur', trigger: 'blur',
}, },
], ],
customerType: [{ required: true, message: '请选择客商类', trigger: 'change' }], customerType: [{ required: true, message: '请选择客商类', trigger: 'change' }],
legalPerson: [{ required: true, message: '请输入企业法人', trigger: 'blur' }], legalPerson: [{ required: true, message: '请输入企业法人', trigger: 'blur' }],
contactPhone: [ contactPhone: [
{ required: true, message: '请输入联系电话', trigger: 'blur' }, { required: true, message: '请输入联系电话', trigger: 'blur' },
@@ -1767,7 +1792,7 @@ export default {
overHidden: true, overHidden: true,
}, },
{ {
label: '客户类型', label: '客商分类',
prop: 'customerType', prop: 'customerType',
search: true, search: true,
searchType: 'select', searchType: 'select',
@@ -1777,6 +1802,16 @@ export default {
minWidth: 140, minWidth: 140,
dicData: [{ label: '全部', value: '' }], dicData: [{ label: '全部', value: '' }],
}, },
{
label: '客商类型',
prop: 'customerKind',
type: 'select',
minWidth: 120,
dicData: [
{ label: '外部客商', value: 'external' },
{ label: '内部组织', value: 'internal' },
],
},
{ {
label: '客户性质', label: '客户性质',
prop: 'customerNature', prop: 'customerNature',
@@ -2188,7 +2223,8 @@ export default {
customerCode: '客商编号', customerCode: '客商编号',
shortName: '客商简称', shortName: '客商简称',
fullName: '客商名称', fullName: '客商名称',
customerType: '客户类型', customerType: '客商分类',
customerKind: '客商类型',
customerNature: '客户性质', customerNature: '客户性质',
unifiedCreditCode: '统一信用代码', unifiedCreditCode: '统一信用代码',
deptName: '所属组织', deptName: '所属组织',
@@ -2376,6 +2412,7 @@ export default {
rejected: '审核不通过', rejected: '审核不通过',
}, },
status: { 1: '启用', 2: '停用', 0: '停用' }, status: { 1: '启用', 2: '停用', 0: '停用' },
customerKind: { external: '外部客商', internal: '内部组织' },
}; };
if (Array.isArray(value)) { if (Array.isArray(value)) {
return value.map(item => this.formatChangeFieldValue(normalizedField, item)).join('、'); return value.map(item => this.formatChangeFieldValue(normalizedField, item)).join('、');
@@ -3661,6 +3698,7 @@ export default {
...detail, ...detail,
deptId: this.normalizeDeptIds(detail), deptId: this.normalizeDeptIds(detail),
customerType: this.splitValue(detail.customerType), customerType: this.splitValue(detail.customerType),
customerKind: detail.customerKind || 'external',
invoiceTaxRate: this.normalizeOptionalAmount(detail.invoiceTaxRate), invoiceTaxRate: this.normalizeOptionalAmount(detail.invoiceTaxRate),
registeredCapital: this.normalizeOptionalAmount(detail.registeredCapital), registeredCapital: this.normalizeOptionalAmount(detail.registeredCapital),
maxCreditLimit: this.normalizeOptionalAmount(detail.maxCreditLimit), maxCreditLimit: this.normalizeOptionalAmount(detail.maxCreditLimit),