Merge remote-tracking branch 'websoft/master'

# Conflicts:
#	src/views/settlement/transport-reconciliation.vue
This commit is contained in:
2026-08-21 00:18:28 +08:00
36 changed files with 517 additions and 336 deletions
+12
View File
@@ -110,3 +110,15 @@
- 改动: - 改动:
1. `src/option/business/contract-manage.js`:该文件 option 在 `createCrudOption([...])` 之后本就用 `option.xxx = ...` 顶层赋值(span/dialogWidth/dialogTop 等),故在末尾追加 `option.dialogCustomClass = 'contract-manage-dialog';`(无需改结构,与文件既有写法一致)。 1. `src/option/business/contract-manage.js`:该文件 option 在 `createCrudOption([...])` 之后本就用 `option.xxx = ...` 顶层赋值(span/dialogWidth/dialogTop 等),故在末尾追加 `option.dialogCustomClass = 'contract-manage-dialog';`(无需改结构,与文件既有写法一致)。
2. `src/styles/element-ui.scss`:新增 `.contract-manage-dialog` 四条规则,复刻 waybill-manage 方案——`height/max-height: calc(100vh - 40px) !important` 压过库内置 `.avue-dialog` 的 200px 上限;`.el-dialog__header { flex:none }``.el-dialog__body { flex:1 1 auto; min-height:0; max-height:none !important; overflow-y:auto }` 解开全局 avue-crud 200px body 限制;`.avue-dialog__footer { position:sticky; bottom:0; margin-top:0 !important; background:#fff }` 抵消全局 footer 的 -30px 上移。 2. `src/styles/element-ui.scss`:新增 `.contract-manage-dialog` 四条规则,复刻 waybill-manage 方案——`height/max-height: calc(100vh - 40px) !important` 压过库内置 `.avue-dialog` 的 200px 上限;`.el-dialog__header { flex:none }``.el-dialog__body { flex:1 1 auto; min-height:0; max-height:none !important; overflow-y:auto }` 解开全局 avue-crud 200px body 限制;`.avue-dialog__footer { position:sticky; bottom:0; margin-top:0 !important; background:#fff }` 抵消全局 footer 的 -30px 上移。
## loading-manage 线路编辑「起/经/终」圆点分色
- 需求:用户反馈 `/business/loading-manage` 弹窗中"线路编辑"区域的「起/经/终」圆形徽标要区分颜色:起蓝、经橙、终绿。
- 改文件:`src/views/business/loading-manage.vue`
- 涉及两处:① 主弹窗 `loading-manage-dialog__route-type`;② 变更运输路线弹窗 `loading-route-change-dialog__route-type`(保持全站一致)。
- 实现方式(最小侵入、不破坏现有结构):
1. methods 各加一个 `routeTypeClass(index)` / `routeChangeTypeClass(index)`,返回 `'start' | 'middle' | 'end'`
2. 模板里 span 改用 `:class="['...route-type', '...route-type--' + ${xxxClass(index)}]"` 动态 class。
3. scoped 样式 `__route-type` 规则去掉硬编码 `background`,改用 `&--start/#409eff` + `&--middle/#e6a23c` + `&--end/#67c23a` 三个 modifier(颜色取 Element Plus 语义色:蓝主色 / 橙 warning / 绿 success),`color: #fff` 保留。
- 关键 trick:变更弹窗原 `route-type` 样式是单行压缩写法,本次顺手把它多行化(保持其他子规则不变),以便嵌套 `&--xxx` 修饰符。
- dev server(2889) HMR 自动生效,刷新后开新增/编辑弹窗向下滚到"线路编辑"分组即可见。
+141
View File
@@ -0,0 +1,141 @@
# 2026-08-20 工作日志
## 保险 OCR 识别模板弹窗列宽调整
- 调整文件:`src/views/base/insurance-ocr-template.vue`
- 修改内容:字段映射表格中,键名列由 `min-width="240"` 改为 `width="120" align="center"`;自定义映射值列由 `min-width="500"` 改为 `width="360"`
- 原因:原列宽导致表格总宽度超出 860px 弹窗 body 可用区域,输入框右侧字数统计(0/100)被截断看不全。
## 保险 OCR 识别模板弹窗卡片化
- 调整文件:`src/views/base/insurance-ocr-template.vue`
- 修改内容:将弹窗内表单的白色背景 `div` 替换为全局 `<section-card title="模板信息">` 组件,形成白底圆角卡片;同时为自定义映射值列保留 `width="360"`,避免在卡片内被撑开。
- 原因:用户希望弹窗表单区域呈现卡片效果,与项目统一的 `section-card` 分组风格一致。
## 运输计划调度弹窗表头背景色调整
- 调整文件:`src/views/business/components/business-crud-page.vue`
- 修改内容:在“计划调度”弹窗的待调度列表 `el-table` 上增加 `:header-cell-style="{ background: '#fafafa' }"`,将表头背景由白色改为浅灰。
- 原因:用户反馈 `/business/transport-plan` 页面白色表头需统一改为灰色 `#fafafa`
## 运单管理货物信息表头背景色调整
- 调整文件:`src/views/business/components/business-crud-page.vue`
- 修改内容:在 `goodsJson-form` 货物信息表格上增加 `:header-cell-style="{ background: '#fafafa' }"`,表头背景改为浅灰。
- 原因:用户反馈 `/business/waybill-manage` 页面货物信息表头需统一改为灰色 `#fafafa`
## 全站 el-table 表头背景色统一
- 调整文件:`src/styles/element-ui.scss`(修改原仅限 `.avue-crud` 的表头规则)
- 修改内容:将表头背景规则扩展为全站 `.el-table` 表头(含普通表格、avue-crud、固定列),统一 `background-color: #fafafa !important`
- 连带清理:移除 `business-crud-page.vue` 中两处冗余的 `:header-cell-style="{ background: '#fafafa' }"`(调度表、货物表),改由全局规则兜底。
- 影响:`/business/loading-manage``/business/waybill-manage``/business/transport-plan` 以及全站所有白色 el-table 表头均统一为 `#fafafa``!important` 同时覆盖了部分组件内 scoped 设定的 `#f5f7fa` 表头背景。
## 应收明细调整费用弹窗按钮间距
- 调整文件:`src/views/settlement/receivable-payable-detail.vue`
- 修改内容:为“调整费用”弹窗内的 `.settlement-detail-page__adjust-toolbar` 增加 `margin-bottom: 16px`,让“新增费用项”按钮与下方表格拉开间距。
- 原因:用户反馈 `/settlement/receivable-detail` 页面调整费用弹窗中“新增费用项”按钮与表格贴得太近。
## 应收明细生成费用弹窗搜索区域加白底
- 调整文件:`src/views/settlement/receivable-payable-detail.vue`
- 修改内容:为“生成费用”弹窗内的搜索 `el-form` 增加 class `settlement-detail-page__generate-search`,设置白底、圆角 6px、轻阴影,并与下方表格保留 16px 间距。
- 原因:用户反馈 `/settlement/receivable-detail` 页面生成费用弹窗中搜索区域缺少白底卡片效果。
## 应收明细更新费用弹窗表单加白底
- 调整文件:`src/views/settlement/receivable-payable-detail.vue`
- 修改内容:为“更新费用”弹窗的 `.settlement-detail-page__dialog-form` 增加白底、圆角 6px、轻阴影;将 padding 由 `16px 20px 0` 改为 `16px 20px`,并去掉最后一个表单项的底部外边距。
- 原因:用户反馈 `/settlement/receivable-detail` 页面更新费用弹窗中表单区域缺少白底卡片效果。
## 应收明细批量转结算弹窗搜索区域加白底
- 调整文件:`src/views/settlement/receivable-payable-detail.vue`
- 修改内容:为“批量转结算”弹窗的 `.settlement-detail-page__transfer-form` 搜索区域增加白底、圆角 6px、轻阴影,并保留与下方表格 16px 间距。
- 原因:用户反馈 `/settlement/receivable-detail` 页面批量转结算弹窗中搜索区域缺少白底卡片效果。
## 预结算单编辑弹窗改白底卡片分组
- 调整文件:`src/views/settlement/components/pre-settlement-editor.vue`
- 修改内容:将“新增/编辑预结算单”弹窗内的全部板块由自定义 `dialog-section-title` + `<section>` 改为全局 `<section-card>` 组件,包括:结算基本信息、结算合计、结算明细、附件、预付信息(readonly)、变更记录(readonly)。结算合计/结算明细头部右侧按钮改为 section-card 的 `#extra` 插槽;删除了不再使用的 `.pre-settlement-editor__section``.pre-settlement-editor__section-head` 样式,并去掉了 `.pre-settlement-editor__form` 多余的 `margin-top`
- 间距:卡片间距沿用全局 `.section-card``margin-bottom: 12px`(符合用户要求)。候选弹窗(添加应收应付明细)的 `dialog-section-title` 保持不变。
- 原因:用户要求预结算单弹窗各板块使用白底卡片分隔,统一项目视觉规范。
## 应收明细详情弹窗 tabs 内容区背景改白
- 调整文件:`src/views/settlement/receivable-payable-detail.vue`
- 修改内容:在 scoped 样式末尾新增 `.settlement-detail-dialog` 规则块,对 `:deep(.el-tabs__content)` 设置 `background: #fff; padding: 16px; border-radius: 0 0 6px 6px;``:deep(.el-tab-pane)` 设为透明。
- 原因:全局 `.el-dialog__body { background: #f5f6fa }` 灰底透到 tabs 内容区(费用明细/变更记录),用户要求改为白色背景。
## 预结算单打印弹窗白底卡片化
- 调整文件:`src/views/settlement/pre-settlement.vue`
- 修改内容:将“打印”弹窗内的手写 `.dialog-section-title` + 普通 `el-form` 改为全局 `<section-card title="选择打印模板">` 包裹表单;为打印弹窗增加 `class="pre-settlement-print-dialog"`;删除页面底部不再使用的 `.dialog-section-title` 样式块,并去掉 `.pre-settlement-page__print-form``margin-top`
- 原因:用户要求 `/settlement/pre-settlement` 打印弹窗按项目规范使用白底卡片分组,与预结算单编辑弹窗风格统一。
## 正式结算付款申请弹窗白底卡片化
- 调整文件:`src/views/settlement/formal-settlement.vue`
- 修改内容:将“付款申请”弹窗内的普通 `el-form` 改为全局 `<section-card title="付款信息">` 包裹;为弹窗增加 `class="formal-payment-dialog"`;按全站按钮规范将“提交”按钮由 `type="primary"` 改为 `type="success"`
- 原因:用户要求 `/settlement/formal-settlement` 付款申请弹窗使用白底卡片分组,并与项目统一按钮风格对齐。
## 正式结算单编辑弹窗改白底卡片分组
- 调整文件:`src/views/settlement/components/formal-settlement-editor.vue`
- 修改内容:将“新增/编辑正式结算单”弹窗内的全部板块由 `dialog-section-title` + `<section>` 改为全局 `<section-card>` 组件,包括:结算基本信息、来源预结算单、结算明细、附件、付款信息(readonly)。“来源预结算单”头部按钮改为 section-card 的 `#extra` 插槽;删除了不再使用的 `.formal-editor__section``.formal-editor__section-head` 样式。
- 间距:沿用全局 `.section-card``margin-bottom: 12px`
- 原因:用户要求 `/settlement/formal-settlement` 页面与预结算单弹窗统一使用白底卡片分隔。
## 正式结算选择预结算单/选择结算明细弹窗搜索区白底
- 调整文件:`src/views/settlement/components/formal-settlement-editor.vue`
- 修改内容:为"选择预结算单"和"选择结算明细"两个弹窗内的搜索 `el-form` 分别增加 class `formal-editor__candidate-search` / `formal-editor__detail-search`,统一样式:白底、圆角 6px、12px 内边距、16px 底间距、轻阴影。
- 原因:用户反馈 `/settlement/formal-settlement` 页面"选择预结算单"弹窗搜索区域缺少白底卡片效果。
## 运输对账单编辑弹窗改白底卡片分组
- 调整文件:`src/views/settlement/components/transport-reconciliation-editor.vue`
- 修改内容:将"新增/编辑运输对账单"弹窗内的全部板块由 `dialog-section-title` + `<section>` 改为全局 `<section-card>` 组件,包括:导入外部账单与内部账单核对、内部账单、导入外部账单、操作说明。"导入外部账单"头部按钮改为 section-card 的 `#extra` 插槽;删除了不再使用的 `.reconciliation-editor__section``.reconciliation-editor__section-head` 样式。
- 间距:沿用全局 `.section-card``margin-bottom: 12px`
- 验证:已通过 SFC 解析与模板编译检查。
- 原因:用户要求 `/settlement/transport-reconciliation` 页面与预结算单/正式结算单弹窗统一使用白底卡片分隔。
## 结算调整单编辑弹窗改白底卡片分组
- 调整文件:`src/views/settlement/components/settlement-adjustment-editor.vue`
- 修改内容:将"新增/编辑结算调整单"弹窗内的全部板块由 `dialog-section-title` + `<section>` 改为全局 `<section-card>` 组件,包括:基本信息、调整费用。"调整费用"头部"添加费用"按钮改为 section-card 的 `#extra` 插槽;删除了不再使用的 `.settlement-adjustment-editor__section``.settlement-adjustment-editor__section-head` 以及 `.dialog-section-title` 样式块。
- 间距:沿用全局 `.section-card``margin-bottom: 12px`
- 验证:已通过 SFC 解析与模板编译检查。
- 原因:用户要求 `/settlement/settlement-adjustment` 页面与预结算单/正式结算单弹窗统一使用白底卡片分隔。
## 运单详情起终点区域改垂直时间轴(方案B)
- 调整文件:`src/views/business/components/business-crud-page.vue`
- 修改内容:在 `isWaybillDetailLayout` 区块,将 `__waybill-route` 的横向“起/终方块+横杠”改为垂直时间轴:左列两个圆点(蓝 `#409eff` / 橙 `#e6a23c`,带白圈光晕),之间用绝对定位的虚线(`repeating-linear-gradient`)连接;右列为“发货地/收货地”标签 + 地名(`-webkit-line-clamp: 2` 允许长名换行)+ 省市区地址(`el-tooltip` 悬浮显示完整地址)。
- 删除旧类:`__waybill-route-head``__waybill-route-text` 及其样式(已确认全仓无其它引用)。
- 响应式:1200px 断点下的 `grid-row:auto; grid-column: 1/-1` 规则仍生效,垂直轴在窄屏自动转为整行。
- 原因:用户认为原右上角起终点方块像按钮、地址被挤压截断、层级不清晰,选择方案B(垂直时间轴)。
## 多联总单编辑页收发货信息布局整改
- 调整文件:`src/views/business/components/master-order-editor.vue`(仅样式,逻辑未动)
- 修改内容:
1. `.route-step-icon``min-width: 32px; min-height: 32px; flex-shrink: 0;`,并给外层 `:deep(.el-step__icon)``flex-shrink: 0;` —— 修复竖向时间轴「起/经/终」节点(尤其「经」字)被压扁变形。
2. `.route-node-form` grid 由 `minmax(360px,1.8fr) minmax(200px,1fr) minmax(260px,1.2fr) minmax(260px,1.2fr)` 改为 `repeat(2, minmax(420px,1fr)) repeat(2, minmax(260px,1fr))`;新增 `:deep(.el-form-item.route-address-form-item) { grid-column: span 2; }` —— 地址项独占前两列(更宽)。
3. `.route-address-name`(行政区划 cascader)由 `flex: 0 0 140px` 加宽到 `220px` —— 完整显示「大坡服务区(梧州段)」等较长名称。
4. 响应式 `@media (max-width:1440px)``.route-node-form``repeat(2, minmax(320px,1fr))` 并同步 `.route-address-form-item { grid-column: span 2 }` —— 小屏地址项独占整行。
- 原因:客户反馈该页收发货信息中行政区划/详细地址输入框过窄导致长地址被截断,且左侧时间轴节点变形。改完用户刷新 localhost:2889 查看效果。
## master-order 弹窗搜索栏白底补齐
- `src/views/business/components/master-order-editor.vue` line 1815-1818:把 `.common-cargo-dialog__search` 单条白底规则改写为 `.common-address-dialog__search, .common-cargo-dialog__search { background: #fff }`,让"选择常用地址"弹窗的搜索栏也跟随既有白卡样式(其他 `.route-dialog__search` 默认无该 class,仍保留灰底)。
## 合同管理合同名称列左对齐修复
- 调整文件:`src/views/business/components/business-crud-page.vue``src/option/business/contract-manage.js`
- 修改内容:
1.`business-crud-page.vue``#contractName` 插槽内,用 `<div class="business-crud-page__contract-name">` 包裹 `el-link` / `span` 内容。
2.`business-crud-page.vue` 的 scoped SCSS 中新增 `.business-crud-page__contract-name { text-align: left; }`
3. 保留 `contract-manage.js``contractName` 列的 `align: 'left'` / `headerAlign: 'left'` 配置(虽然 Avue slot 列的 align 未生效,作为兜底仍保留)。
- 原因:用户反馈 `/business/contract-manage` 的合同名称列文字仍居中。Avue 自定义 slot 列的 `align` 属性似乎没有正确作用到单元格,改由插槽内容自身强制 `text-align: left` 更可靠。
- 影响:所有使用 `business-crud-page` 且渲染 `contractName` 插槽的页面,其合同名称单元格内容都会左对齐。
+1 -1
View File
@@ -164,7 +164,7 @@ Avue 表格/表单配置独立存放于 `src/option/` 目录,与 `views` 和 `
- 各页面搜索栏多行展示时,行与行之间的垂直间距统一为 `8px` - 各页面搜索栏多行展示时,行与行之间的垂直间距统一为 `8px`
- 搜索组件 label 宽度统一不小于 `160px`label 文本不得换行。 - 搜索组件 label 宽度统一不小于 `160px`label 文本不得换行。
- 搜索组件内部 padding 统一为上、左右 `12px`,底部 `4px` - 搜索组件内部 padding 统一为上、左右 `12px`,底部 `4px`
- 搜索组件需展示轻量阴影,统一使用 `0 2px 8px rgba(0, 0, 0, 0.06)`,不得被局部卡片去样式规则覆盖。 - 搜索组件需展示轻量阴影,统一使用 `0 2px 8px rgba(0, 0, 0, 0.04)`,不得被局部卡片去样式规则覆盖。
- 表格线条颜色需统一使用 `#EFF1F7`,包括表格外边框、单元格分割线和固定列边线。 - 表格线条颜色需统一使用 `#EFF1F7`,包括表格外边框、单元格分割线和固定列边线。
- 表格偶数行需统一使用 `#FAFAFA` 背景色,固定列单元格必须与对应行背景保持一致。 - 表格偶数行需统一使用 `#FAFAFA` 背景色,固定列单元格必须与对应行背景保持一致。
- 表格操作列同时展示“查看、编辑、删除”等三个按钮时,操作列宽度统一不小于 `220px`;操作列最大按钮数量超过 3 个时,操作列宽度统一加宽到不小于 `320px`;最大按钮数量超过 4 个时,仍按 `320px` 保持列宽,并从第 5 个按钮开始换行展示,禁止出现按钮裁切或显示不全。 - 表格操作列同时展示“查看、编辑、删除”等三个按钮时,操作列宽度统一不小于 `220px`;操作列最大按钮数量超过 3 个时,操作列宽度统一加宽到不小于 `320px`;最大按钮数量超过 4 个时,仍按 `320px` 保持列宽,并从第 5 个按钮开始换行展示,禁止出现按钮裁切或显示不全。
+3 -1
View File
@@ -251,12 +251,14 @@ export const option = createCrudOption([
{ {
label: '合同名称', label: '合同名称',
prop: 'contractName', prop: 'contractName',
align: 'left',
headerAlign: 'left',
search: true, search: true,
searchOrder: 7, searchOrder: 7,
searchPlaceholder: '请输入', searchPlaceholder: '请输入',
order: 180, order: 180,
slot: true, slot: true,
minWidth: 180, minWidth: 240,
rules: textRule('合同名称', 100, true), rules: textRule('合同名称', 100, true),
}, },
{ {
+3 -3
View File
@@ -28,7 +28,7 @@ export const ocrTemplateDic = [];
export const option = { export const option = {
height: 'auto', height: 'auto',
calcHeight: 32, calcHeight: 32,
dialogWidth: 1100, dialogWidth: 1024,
labelPosition: 'right', labelPosition: 'right',
tip: false, tip: false,
searchBtnText: '查询', searchBtnText: '查询',
@@ -46,7 +46,7 @@ export const option = {
viewBtn: true, viewBtn: true,
selection: true, selection: true,
dialogClickModal: false, dialogClickModal: false,
menuWidth: 180, menuWidth: 120,
column: [ column: [
{ {
label: '车船类型', label: '车船类型',
@@ -97,7 +97,7 @@ export const option = {
type: 'select', type: 'select',
dicData: insuranceTypeDic, dicData: insuranceTypeDic,
search: true, search: true,
minWidth: 130, minWidth: 120,
rules: [{ required: true, message: '请选择保险类型', trigger: 'change' }], rules: [{ required: true, message: '请选择保险类型', trigger: 'change' }],
}, },
{ {
+7 -7
View File
@@ -100,7 +100,7 @@
.basic-container__card .avue-crud__search.el-card { .basic-container__card .avue-crud__search.el-card {
border: none; border: none;
background: #fff; background: #fff;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06); box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
} }
.basic-container__card .avue-crud > .el-card > .el-card__body, .basic-container__card .avue-crud > .el-card > .el-card__body,
@@ -137,7 +137,7 @@
.avue-crud__search.el-card { .avue-crud__search.el-card {
border: none; border: none;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06); box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
} }
.avue-crud__search.el-card > .el-card__body { .avue-crud__search.el-card > .el-card__body {
@@ -598,11 +598,11 @@
border-color: #eff1f7; border-color: #eff1f7;
} }
// 统一 avue-crud 表头背景色 // 统一全站 el-table 表头背景色为浅灰 #fafafa(普通表格、avue-crud、固定列均覆盖)
.avue-crud .el-table th.el-table__cell, .el-table .el-table__header-wrapper th.el-table__cell,
.avue-crud .el-table__header-wrapper tr th.el-table-fixed-column--left, .el-table .el-table__header-wrapper tr th.el-table-fixed-column--left,
.avue-crud .el-table__header-wrapper tr th.el-table-fixed-column--right { .el-table .el-table__header-wrapper tr th.el-table-fixed-column--right {
background-color: #fafafa; background-color: #fafafa !important;
} }
// 统一 avue-crud 偶数行背景色 // 统一 avue-crud 偶数行背景色
+1 -1
View File
@@ -26,7 +26,7 @@
} }
.avue-logo { .avue-logo {
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06); box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
} }
.avue-tags { .avue-tags {
+1 -1
View File
@@ -2,7 +2,7 @@
.avue-top, .avue-logo { .avue-top, .avue-logo {
background: #fff; background: #fff;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06); box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
color: rgba(0, 0, 0, 0.85); color: rgba(0, 0, 0, 0.85);
} }
+2 -2
View File
@@ -35,7 +35,7 @@
.avue-top { .avue-top {
background: #fff; background: #fff;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06); box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
} }
.avue-tags { .avue-tags {
@@ -63,7 +63,7 @@
.avue-logo { .avue-logo {
background: #fff; background: #fff;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06); box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
} }
.avue-sidebar--tip { .avue-sidebar--tip {
+2 -2
View File
@@ -1,7 +1,7 @@
.theme-d2 { .theme-d2 {
.avue-logo { .avue-logo {
color: rgba(0, 0, 0, 0.85); color: rgba(0, 0, 0, 0.85);
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06); box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
.avue-logo_title { .avue-logo_title {
font-size: 20px; font-size: 20px;
@@ -10,7 +10,7 @@
} }
.avue-top { .avue-top {
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06); box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
} }
.avue-main { .avue-main {
+1 -1
View File
@@ -33,7 +33,7 @@
.avue-logo { .avue-logo {
background-color: #fff; background-color: #fff;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06); box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
.avue-logo_title { .avue-logo_title {
color: var(--el-color-primary); color: var(--el-color-primary);
+1 -1
View File
@@ -1,7 +1,7 @@
.theme-iview { .theme-iview {
.avue-logo { .avue-logo {
background: #fff; background: #fff;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06); box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
text-align: center; text-align: center;
.avue-logo_title { .avue-logo_title {
+1 -1
View File
@@ -1,7 +1,7 @@
.theme-lte { .theme-lte {
.avue-logo { .avue-logo {
background-color: #fff; background-color: #fff;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06); box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
.avue-logo_title { .avue-logo_title {
font-weight: 500; font-weight: 500;
+1 -1
View File
@@ -37,7 +37,7 @@
.avue-logo, .avue-logo,
.tags-container { .tags-container {
background-color: #fff; background-color: #fff;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06); box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
} }
.avue-sidebar--tip { .avue-sidebar--tip {
+1 -1
View File
@@ -3,7 +3,7 @@
.avue-top { .avue-top {
position: relative; position: relative;
background-color: #fff; background-color: #fff;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06); box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
color: rgba(0, 0, 0, 0.85); color: rgba(0, 0, 0, 0.85);
font-size: 28px; font-size: 28px;
height: variables.$top_height; height: variables.$top_height;
+8 -3
View File
@@ -1,5 +1,5 @@
<template> <template>
<basic-container class="insurance-ocr-template-page"> <basic-container>
<div class="insurance-ocr-template-page__toolbar"> <div class="insurance-ocr-template-page__toolbar">
<el-button <el-button
v-if="hasPermission('insurance_ocr_template_add')" v-if="hasPermission('insurance_ocr_template_add')"
@@ -90,13 +90,14 @@
@closed="resetForm" @closed="resetForm"
> >
<el-form ref="templateForm" :model="form" :rules="rules" label-width="100px" :disabled="readonly"> <el-form ref="templateForm" :model="form" :rules="rules" label-width="100px" :disabled="readonly">
<section-card title="模板信息">
<el-form-item label="模板名称" prop="name"> <el-form-item label="模板名称" prop="name">
<el-input v-model="form.name" maxlength="100" show-word-limit /> <el-input v-model="form.name" maxlength="100" show-word-limit />
</el-form-item> </el-form-item>
<el-form-item label="字段映射" required> <el-form-item label="字段映射" required>
<el-table :data="mappingRows" border class="insurance-ocr-template-page__mapping-table"> <el-table :data="mappingRows" border class="insurance-ocr-template-page__mapping-table">
<el-table-column prop="key" label="键名" min-width="240" /> <el-table-column prop="key" label="键名" width="180" align="center" />
<el-table-column label="自定义映射值" min-width="500"> <el-table-column label="自定义映射值">
<template #default="{ row }"> <template #default="{ row }">
<el-input <el-input
v-model="row.value" v-model="row.value"
@@ -108,7 +109,9 @@
</el-table-column> </el-table-column>
</el-table> </el-table>
</el-form-item> </el-form-item>
</section-card>
</el-form> </el-form>
<template #footer> <template #footer>
<el-button @click="dialogVisible = false">取消</el-button> <el-button @click="dialogVisible = false">取消</el-button>
<el-button v-if="!readonly" type="primary" :loading="submitLoading" @click="handleSubmit"> <el-button v-if="!readonly" type="primary" :loading="submitLoading" @click="handleSubmit">
@@ -122,6 +125,7 @@
<script> <script>
import { mapGetters } from 'vuex'; import { mapGetters } from 'vuex';
import { getDetail, getList, remove, submit } from '@/api/base/insurance-ocr-template'; import { getDetail, getList, remove, submit } from '@/api/base/insurance-ocr-template';
import SectionCard from '@/components/section-card/main.vue';
const insuranceFieldKeys = [ const insuranceFieldKeys = [
'保险类型', '保险类型',
@@ -152,6 +156,7 @@ const createMappingRows = mappingConfig => {
}; };
export default { export default {
components: { SectionCard },
data() { data() {
return { return {
loading: false, loading: false,
@@ -126,6 +126,7 @@
</template> </template>
<template #contractName="{ row }"> <template #contractName="{ row }">
<div class="business-crud-page__contract-name">
<el-link <el-link
v-if="config.contractNameDetail && row.contractName" v-if="config.contractNameDetail && row.contractName"
type="primary" type="primary"
@@ -134,6 +135,7 @@
{{ row.contractName }} {{ row.contractName }}
</el-link> </el-link>
<span v-else>{{ row.contractName || '-' }}</span> <span v-else>{{ row.contractName || '-' }}</span>
</div>
</template> </template>
<template #loadingNo="{ row }"> <template #loadingNo="{ row }">
@@ -2715,28 +2717,35 @@
</span> </span>
</div> </div>
<div class="business-crud-page__waybill-route"> <div class="business-crud-page__waybill-route">
<div class="business-crud-page__waybill-route-head"> <div class="business-crud-page__waybill-route-item">
<b></b <span class="business-crud-page__waybill-route-dot"></span>
><strong>{{ <div class="business-crud-page__waybill-route-detail">
<span class="business-crud-page__waybill-route-label">发货地</span>
<strong class="business-crud-page__waybill-route-name">{{
detailRow.departureName || detailRow.departureAddress || '-' detailRow.departureName || detailRow.departureAddress || '-'
}}</strong }}</strong>
><b class="end"></b
><strong>{{ detailRow.arrivalName || detailRow.arrivalAddress || '-' }}</strong>
</div>
<div class="business-crud-page__waybill-route-text">
<el-tooltip :content="detailRow.departureAddress || '-'" placement="top"> <el-tooltip :content="detailRow.departureAddress || '-'" placement="top">
<span>{{ <span class="business-crud-page__waybill-route-addr">{{
formatTransportPlanProvinceCityDistrict(detailRow.departureAddress) formatTransportPlanProvinceCityDistrict(detailRow.departureAddress)
}}</span> }}</span>
</el-tooltip> </el-tooltip>
<span>  </span> </div>
</div>
<div class="business-crud-page__waybill-route-item">
<span class="business-crud-page__waybill-route-dot is-end"></span>
<div class="business-crud-page__waybill-route-detail">
<span class="business-crud-page__waybill-route-label">收货地</span>
<strong class="business-crud-page__waybill-route-name">{{
detailRow.arrivalName || detailRow.arrivalAddress || '-'
}}</strong>
<el-tooltip :content="detailRow.arrivalAddress || '-'" placement="top"> <el-tooltip :content="detailRow.arrivalAddress || '-'" placement="top">
<span>{{ <span class="business-crud-page__waybill-route-addr">{{
formatTransportPlanProvinceCityDistrict(detailRow.arrivalAddress) formatTransportPlanProvinceCityDistrict(detailRow.arrivalAddress)
}}</span> }}</span>
</el-tooltip> </el-tooltip>
</div> </div>
</div> </div>
</div>
<div class="business-crud-page__waybill-attachments"> <div class="business-crud-page__waybill-attachments">
<span class="business-crud-page__waybill-label">附件</span> <span class="business-crud-page__waybill-label">附件</span>
<div> <div>
@@ -13955,6 +13964,10 @@ export default {
width: 100%; width: 100%;
} }
&__contract-name {
text-align: left;
}
&__contract-expiry-search { &__contract-expiry-search {
display: flex; display: flex;
align-items: center; align-items: center;
@@ -14583,7 +14596,7 @@ export default {
background: #fff; background: #fff;
border: 1px solid #eff1f7; border: 1px solid #eff1f7;
border-radius: 4px; border-radius: 4px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06); box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
:deep(.el-form-item) { :deep(.el-form-item) {
margin-bottom: 8px; margin-bottom: 8px;
@@ -15710,62 +15723,86 @@ export default {
grid-row: 1 / span 3; grid-row: 1 / span 3;
grid-column: 5; grid-column: 5;
min-width: 0; min-width: 0;
padding: 8px 0; padding: 4px 0;
} }
&__waybill-route-head { &__waybill-route-item {
position: relative;
display: flex; display: flex;
align-items: center; align-items: stretch;
justify-content: space-between;
gap: 12px; gap: 12px;
b { & + & {
display: inline-flex; margin-top: 18px;
}
}
&__waybill-route-dot {
position: relative;
flex: 0 0 auto; flex: 0 0 auto;
width: 34px; width: 12px;
height: 34px; margin-top: 2px;
align-items: center;
justify-content: center;
color: #fff;
border-radius: 4px;
background: #409eff;
&.end {
background: #e6a23c;
}
}
strong {
min-width: 0;
overflow: hidden;
color: #303133;
font-size: 18px;
text-overflow: ellipsis;
white-space: nowrap;
}
&::before { &::before {
flex: 1; display: block;
order: 2; width: 12px;
height: 4px; height: 12px;
border-radius: 50%;
content: ''; content: '';
background: #e4e7ed; background: #409eff;
box-shadow: 0 0 0 3px #fff, 0 0 0 4px #c6e0ff;
} }
b.end { &.is-end::before {
order: 3; background: #e6a23c;
} box-shadow: 0 0 0 3px #fff, 0 0 0 4px #f5d9b0;
strong:last-child {
order: 4;
} }
} }
&__waybill-route-text { &__waybill-route-item:not(:last-child) &__waybill-route-dot::after {
margin-top: 12px; content: '';
position: absolute;
top: 14px;
left: 5px;
width: 2px;
height: calc(100% + 10px);
background: repeating-linear-gradient(
to bottom,
#c0c4cc 0,
#c0c4cc 4px,
transparent 4px,
transparent 8px
);
}
&__waybill-route-detail {
flex: 1;
min-width: 0;
display: flex;
flex-direction: column;
gap: 4px;
}
&__waybill-route-label {
color: #909399;
font-size: 12px;
}
&__waybill-route-name {
color: #303133;
font-size: 15px;
font-weight: 500;
line-height: 1.4;
overflow: hidden;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
}
&__waybill-route-addr {
overflow: hidden; overflow: hidden;
color: #606266; color: #606266;
text-align: center; font-size: 12px;
text-overflow: ellipsis; text-overflow: ellipsis;
white-space: nowrap; white-space: nowrap;
} }
@@ -1810,8 +1810,9 @@ export default {
.route-dialog__search { .route-dialog__search {
margin-bottom: 8px; margin-bottom: 8px;
padding: 12px 12px 4px; padding: 12px 12px 4px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06); box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
} }
.common-address-dialog__search,
.common-cargo-dialog__search { .common-cargo-dialog__search {
background: #fff; background: #fff;
} }
@@ -1845,6 +1846,7 @@ export default {
:deep(.el-step__icon) { :deep(.el-step__icon) {
width: 32px; width: 32px;
height: 32px; height: 32px;
flex-shrink: 0;
border: 0; border: 0;
background: transparent; background: transparent;
} }
@@ -1852,6 +1854,9 @@ export default {
display: inline-flex; display: inline-flex;
width: 32px; width: 32px;
height: 32px; height: 32px;
min-width: 32px;
min-height: 32px;
flex-shrink: 0;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
border-radius: 6px; border-radius: 6px;
@@ -1870,15 +1875,15 @@ export default {
} }
.route-node-form { .route-node-form {
display: grid; display: grid;
grid-template-columns: minmax(360px, 1.8fr) minmax(200px, 1fr) minmax(260px, 1.2fr) minmax( grid-template-columns: repeat(2, minmax(420px, 1fr)) repeat(2, minmax(260px, 1fr));
260px,
1.2fr
);
gap: 0 16px; gap: 0 16px;
align-items: start; align-items: start;
:deep(.el-form-item) { :deep(.el-form-item) {
margin: 0 0 12px; margin: 0 0 12px;
} }
:deep(.el-form-item.route-address-form-item) {
grid-column: span 2;
}
:deep(.el-form-item__content) { :deep(.el-form-item__content) {
min-width: 0; min-width: 0;
} }
@@ -1894,7 +1899,7 @@ export default {
gap: 8px; gap: 8px;
} }
.route-address-name { .route-address-name {
flex: 0 0 140px; flex: 0 0 220px;
} }
.route-address-detail, .route-address-detail,
.route-contact-actions :deep(.el-input) { .route-contact-actions :deep(.el-input) {
@@ -1961,7 +1966,10 @@ export default {
} }
@media screen and (max-width: 1440px) { @media screen and (max-width: 1440px) {
.route-node-form { .route-node-form {
grid-template-columns: repeat(2, minmax(280px, 1fr)); grid-template-columns: repeat(2, minmax(320px, 1fr));
:deep(.el-form-item.route-address-form-item) {
grid-column: span 2;
}
} }
.route-step-title { .route-step-title {
align-items: flex-start; align-items: flex-start;
+1 -1
View File
@@ -3,7 +3,7 @@
:api="api" :api="api"
:config="config" :config="config"
:crud-option="option" :crud-option="option"
:menu-width="252" :menu-width="280"
contract-form-page contract-form-page
/> />
</template> </template>
+1 -1
View File
@@ -2354,7 +2354,7 @@ export default {
padding: 12px 12px 4px; padding: 12px 12px 4px;
margin-bottom: 8px; margin-bottom: 8px;
background: #fff; background: #fff;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06); box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
} }
.loading-manage-page__search-grid { .loading-manage-page__search-grid {
+1 -1
View File
@@ -398,7 +398,7 @@ export default {
margin-bottom: 8px; margin-bottom: 8px;
padding: 12px 12px 4px; padding: 12px 12px 4px;
background: #fff; background: #fff;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06); box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
.el-form-item { .el-form-item {
margin-bottom: 8px; margin-bottom: 8px;
} }
+2 -2
View File
@@ -958,7 +958,7 @@ load();
padding: 12px 12px 4px; padding: 12px 12px 4px;
margin-bottom: 8px; margin-bottom: 8px;
background: #fff; background: #fff;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06); box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
} }
&__search-grid { &__search-grid {
display: grid; display: grid;
@@ -1046,7 +1046,7 @@ load();
padding: 12px; padding: 12px;
margin-bottom: 8px; margin-bottom: 8px;
background: #fff; background: #fff;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06); box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
} }
:deep(.el-form-item) { :deep(.el-form-item) {
margin-bottom: 8px; margin-bottom: 8px;
@@ -1,8 +1,7 @@
<template> <template>
<el-dialog v-model="visible" :title="title" width="96%" top="2vh" append-to-body destroy-on-close> <el-dialog v-model="visible" :title="title" width="96%" top="2vh" append-to-body destroy-on-close>
<div v-loading="loading" class="formal-editor"> <div v-loading="loading" class="formal-editor">
<section class="formal-editor__section"> <section-card title="结算基本信息">
<div class="dialog-section-title">结算基本信息</div>
<el-form <el-form
ref="formRef" ref="formRef"
:model="form" :model="form"
@@ -64,11 +63,10 @@
</el-col> </el-col>
</el-row> </el-row>
</el-form> </el-form>
</section> </section-card>
<section class="formal-editor__section"> <section-card title="来源预结算单">
<div class="formal-editor__section-head"> <template #extra>
<div class="dialog-section-title">来源预结算单</div>
<div class="formal-editor__actions"> <div class="formal-editor__actions">
<el-button v-if="editable" type="primary" plain @click="openCandidateDialog" <el-button v-if="editable" type="primary" plain @click="openCandidateDialog"
>选择预结算单</el-button >选择预结算单</el-button
@@ -77,7 +75,7 @@
>选择结算明细</el-button >选择结算明细</el-button
> >
</div> </div>
</div> </template>
<el-table :data="sources" border> <el-table :data="sources" border>
<el-table-column type="index" label="序号" width="64" align="center" /> <el-table-column type="index" label="序号" width="64" align="center" />
<el-table-column <el-table-column
@@ -97,10 +95,9 @@
> >
</el-table-column> </el-table-column>
</el-table> </el-table>
</section> </section-card>
<section v-if="details.length" class="formal-editor__section"> <section-card v-if="details.length" title="结算明细">
<div class="dialog-section-title">结算明细</div>
<el-table :data="details" border> <el-table :data="details" border>
<el-table-column type="index" label="序号" width="64" fixed="left" align="center" /> <el-table-column type="index" label="序号" width="64" fixed="left" align="center" />
<el-table-column <el-table-column
@@ -131,10 +128,9 @@
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
</section> </section-card>
<section class="formal-editor__section"> <section-card title="附件">
<div class="dialog-section-title">附件</div>
<vehicle-attachment-upload <vehicle-attachment-upload
v-model="attachments" v-model="attachments"
:readonly="!editable" :readonly="!editable"
@@ -143,10 +139,9 @@
:max-size="500" :max-size="500"
:file-types="attachmentFileTypes" :file-types="attachmentFileTypes"
/> />
</section> </section-card>
<section v-if="readonly && payments.length" class="formal-editor__section"> <section-card v-if="readonly && payments.length" title="付款信息">
<div class="dialog-section-title">付款信息</div>
<el-table :data="payments" border> <el-table :data="payments" border>
<el-table-column type="index" label="序号" width="64" align="center" /> <el-table-column type="index" label="序号" width="64" align="center" />
<el-table-column <el-table-column
@@ -167,7 +162,7 @@
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
</section> </section-card>
</div> </div>
<template #footer> <template #footer>
<el-button @click="visible = false">取消</el-button> <el-button @click="visible = false">取消</el-button>
@@ -177,7 +172,7 @@
</template> </template>
<el-dialog v-model="candidate.visible" title="选择预结算单" width="88%" append-to-body> <el-dialog v-model="candidate.visible" title="选择预结算单" width="88%" append-to-body>
<el-form :model="candidate.query" inline label-position="right" label-width="160px"> <el-form :model="candidate.query" inline label-position="right" label-width="160px" class="formal-editor__candidate-search">
<el-form-item label="预结算单号" <el-form-item label="预结算单号"
><el-input v-model="candidate.query.preSettlementNo" clearable ><el-input v-model="candidate.query.preSettlementNo" clearable
/></el-form-item> /></el-form-item>
@@ -227,7 +222,7 @@
</el-dialog> </el-dialog>
<el-dialog v-model="detailCandidate.visible" title="选择结算明细" width="92%" append-to-body> <el-dialog v-model="detailCandidate.visible" title="选择结算明细" width="92%" append-to-body>
<el-form :model="detailCandidate.query" inline label-position="right" label-width="160px"> <el-form :model="detailCandidate.query" inline label-position="right" label-width="160px" class="formal-editor__detail-search">
<el-form-item label="批次号" <el-form-item label="批次号"
><el-input v-model="detailCandidate.query.batchNo" clearable ><el-input v-model="detailCandidate.query.batchNo" clearable
/></el-form-item> /></el-form-item>
@@ -725,15 +720,6 @@ export default {
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.formal-editor__section {
margin-bottom: 24px;
}
.formal-editor__section-head {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 12px;
}
.formal-editor__actions { .formal-editor__actions {
display: flex; display: flex;
gap: 8px; gap: 8px;
@@ -761,4 +747,13 @@ export default {
.formal-editor__adjust-reason { .formal-editor__adjust-reason {
margin-top: 16px; margin-top: 16px;
} }
/* 选择预结算单 / 选择结算明细 弹窗搜索区白底 */
.formal-editor__candidate-search,
.formal-editor__detail-search {
background: #fff;
border-radius: 6px;
padding: 12px;
margin-bottom: 16px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
}
</style> </style>
@@ -10,7 +10,7 @@
@closed="handleClosed" @closed="handleClosed"
> >
<div v-loading="loading" class="pre-settlement-editor__content"> <div v-loading="loading" class="pre-settlement-editor__content">
<div class="dialog-section-title">结算基本信息</div> <section-card title="结算基本信息">
<el-form <el-form
ref="formRef" ref="formRef"
:model="form" :model="form"
@@ -81,14 +81,14 @@
</el-col> </el-col>
</el-row> </el-row>
</el-form> </el-form>
</section-card>
<section class="pre-settlement-editor__section"> <section-card title="结算合计">
<div class="pre-settlement-editor__section-head"> <template #extra>
<div class="dialog-section-title">结算合计</div>
<el-button v-if="editable" type="primary" plain @click="addSummaryFee"> <el-button v-if="editable" type="primary" plain @click="addSummaryFee">
添加费用 添加费用
</el-button> </el-button>
</div> </template>
<el-table :data="summaryFees" border> <el-table :data="summaryFees" border>
<el-table-column type="index" label="序号" width="64" align="center" /> <el-table-column type="index" label="序号" width="64" align="center" />
<el-table-column <el-table-column
@@ -161,11 +161,10 @@
<div class="pre-settlement-editor__summary-total"> <div class="pre-settlement-editor__summary-total">
合计{{ formatMoney(summaryTotal, form.currency) }} 合计{{ formatMoney(summaryTotal, form.currency) }}
</div> </div>
</section> </section-card>
<section class="pre-settlement-editor__section"> <section-card title="结算明细">
<div class="pre-settlement-editor__section-head"> <template #extra>
<div class="dialog-section-title">结算明细</div>
<div class="pre-settlement-editor__section-actions"> <div class="pre-settlement-editor__section-actions">
<el-button <el-button
v-if="hasPermission('pre_settlement_export')" v-if="hasPermission('pre_settlement_export')"
@@ -182,7 +181,7 @@
{{ detailCollapsed ? '展开明细' : '收起明细' }} {{ detailCollapsed ? '展开明细' : '收起明细' }}
</el-button> </el-button>
</div> </div>
</div> </template>
<el-form <el-form
:model="detailQuery" :model="detailQuery"
inline inline
@@ -284,12 +283,9 @@
</el-table-column> </el-table-column>
</el-table> </el-table>
</div> </div>
</section> </section-card>
<section class="pre-settlement-editor__section"> <section-card title="附件">
<div class="pre-settlement-editor__section-head">
<div class="dialog-section-title">附件</div>
</div>
<div class="pre-settlement-editor__attachment"> <div class="pre-settlement-editor__attachment">
<div class="pre-settlement-editor__attachment-actions"> <div class="pre-settlement-editor__attachment-actions">
<vehicle-attachment-upload <vehicle-attachment-upload
@@ -344,10 +340,9 @@
</el-table-column> </el-table-column>
</el-table> </el-table>
</div> </div>
</section> </section-card>
<section v-if="form.id && readonly" class="pre-settlement-editor__section"> <section-card v-if="form.id && readonly" title="预付信息">
<div class="dialog-section-title">预付信息</div>
<el-table :data="advances" border> <el-table :data="advances" border>
<el-table-column type="index" label="序号" width="64" align="center" /> <el-table-column type="index" label="序号" width="64" align="center" />
<el-table-column <el-table-column
@@ -370,10 +365,9 @@
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
</section> </section-card>
<section v-if="form.id && readonly" class="pre-settlement-editor__section"> <section-card v-if="form.id && readonly" title="变更记录">
<div class="dialog-section-title">变更记录</div>
<el-table :data="changeRecords" border> <el-table :data="changeRecords" border>
<el-table-column type="index" label="序号" width="64" align="center" /> <el-table-column type="index" label="序号" width="64" align="center" />
<el-table-column <el-table-column
@@ -391,7 +385,7 @@
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
</section> </section-card>
</div> </div>
<template #footer> <template #footer>
@@ -1317,12 +1311,9 @@ export default {
&__content { &__content {
max-height: 82vh; max-height: 82vh;
overflow-y: auto; overflow-y: auto;
padding: 4px 12px 16px;
} }
&__form { &__form {
margin-top: 12px;
:deep(.el-select), :deep(.el-select),
:deep(.el-date-editor), :deep(.el-date-editor),
:deep(.el-input-number) { :deep(.el-input-number) {
@@ -1330,17 +1321,6 @@ export default {
} }
} }
&__section {
margin-top: 20px;
}
&__section-head {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 12px;
}
&__section-actions, &__section-actions,
&__links { &__links {
display: flex; display: flex;
@@ -1,8 +1,7 @@
<template> <template>
<el-dialog v-model="visible" :title="title" width="94%" top="3vh" append-to-body destroy-on-close> <el-dialog v-model="visible" :title="title" width="94%" top="3vh" append-to-body destroy-on-close>
<div v-loading="loading" class="settlement-adjustment-editor"> <div v-loading="loading" class="settlement-adjustment-editor">
<section class="settlement-adjustment-editor__section"> <section-card title="基本信息">
<div class="dialog-section-title">基本信息</div>
<el-form <el-form
ref="formRef" ref="formRef"
:model="form" :model="form"
@@ -57,11 +56,10 @@
> >
</el-row> </el-row>
</el-form> </el-form>
</section> </section-card>
<section class="settlement-adjustment-editor__section"> <section-card title="调整费用">
<div class="settlement-adjustment-editor__section-head"> <template #extra>
<div class="dialog-section-title">调整费用</div>
<el-button <el-button
v-if="editable && form.formalSettlementId" v-if="editable && form.formalSettlementId"
type="primary" type="primary"
@@ -69,7 +67,7 @@
@click="openFeeDialog" @click="openFeeDialog"
>添加费用</el-button >添加费用</el-button
> >
</div> </template>
<el-table :data="details" border> <el-table :data="details" border>
<el-table-column type="index" label="序号" width="64" align="center" /><el-table-column <el-table-column type="index" label="序号" width="64" align="center" /><el-table-column
prop="feeType" prop="feeType"
@@ -141,7 +139,7 @@
}}</strong }}</strong
>调整后结算金额<strong>{{ formatMoney(form.adjustedSettlementAmount) }}</strong> >调整后结算金额<strong>{{ formatMoney(form.adjustedSettlementAmount) }}</strong>
</div> </div>
</section> </section-card>
</div> </div>
<template #footer <template #footer
><el-button @click="visible = false">取消</el-button ><el-button @click="visible = false">取消</el-button
@@ -354,15 +352,6 @@ export default {
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.settlement-adjustment-editor__section {
margin-bottom: 24px;
}
.settlement-adjustment-editor__section-head {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 12px;
}
.settlement-adjustment-editor__summary { .settlement-adjustment-editor__summary {
padding: 12px 0; padding: 12px 0;
text-align: right; text-align: right;
@@ -379,18 +368,4 @@ export default {
.negative { .negative {
color: #f56c6c; color: #f56c6c;
} }
.dialog-section-title {
display: flex;
align-items: center;
min-height: 22px;
font-size: 16px;
font-weight: 600;
}
.dialog-section-title::before {
width: 4px;
height: 18px;
margin-right: 8px;
background: #409eff;
content: '';
}
</style> </style>
@@ -1,8 +1,7 @@
<template> <template>
<el-dialog v-model="visible" :title="title" width="98%" top="2vh" append-to-body destroy-on-close> <el-dialog v-model="visible" :title="title" width="98%" top="2vh" append-to-body destroy-on-close>
<div v-loading="loading" class="reconciliation-editor"> <div v-loading="loading" class="reconciliation-editor">
<section class="reconciliation-editor__section"> <section-card title="导入外部账单,与内部账单核对">
<div class="dialog-section-title">导入外部账单与内部账单核对</div>
<el-form <el-form
ref="formRef" ref="formRef"
:model="form" :model="form"
@@ -61,10 +60,9 @@
</el-col> </el-col>
</el-row> </el-row>
</el-form> </el-form>
</section> </section-card>
<section class="reconciliation-editor__section"> <section-card title="内部账单">
<div class="dialog-section-title">内部账单</div>
<div class="reconciliation-editor__stats"> <div class="reconciliation-editor__stats">
<div class="stat-card"> <div class="stat-card">
<b>{{ form.internalBillCount || 0 }}</b <b>{{ form.internalBillCount || 0 }}</b
@@ -149,11 +147,10 @@
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
</section> </section-card>
<section class="reconciliation-editor__section"> <section-card title="导入外部账单">
<div class="reconciliation-editor__section-head"> <template #extra>
<div class="dialog-section-title">导入外部账单</div>
<div class="reconciliation-editor__actions" v-if="editable"> <div class="reconciliation-editor__actions" v-if="editable">
<el-button type="primary" plain @click="downloadTemplate('vehicle')" <el-button type="primary" plain @click="downloadTemplate('vehicle')"
>下载整车对账模板</el-button >下载整车对账模板</el-button
@@ -171,7 +168,7 @@
@change="handleImport" @change="handleImport"
/> />
</div> </div>
</div> </template>
<el-tabs v-model="externalTab"> <el-tabs v-model="externalTab">
<el-tab-pane :label="`导入明细(${externalDetails.length}`" name="all" /> <el-tab-pane :label="`导入明细(${externalDetails.length}`" name="all" />
<el-tab-pane :label="`疑似重复(${duplicateRows.length}`" name="duplicate" /> <el-tab-pane :label="`疑似重复(${duplicateRows.length}`" name="duplicate" />
@@ -203,9 +200,9 @@
> >
</el-table-column> </el-table-column>
</el-table> </el-table>
</section> </section-card>
<section class="reconciliation-editor__section"> <section-card title="操作说明">
<el-collapse> <el-collapse>
<el-collapse-item title="操作说明" name="help"> <el-collapse-item title="操作说明" name="help">
<div class="reconciliation-editor__help"> <div class="reconciliation-editor__help">
@@ -224,7 +221,7 @@
</div> </div>
</el-collapse-item> </el-collapse-item>
</el-collapse> </el-collapse>
</section> </section-card>
</div> </div>
<template #footer> <template #footer>
@@ -744,15 +741,6 @@ export default {
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.reconciliation-editor__section {
margin-bottom: 24px;
}
.reconciliation-editor__section-head {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 12px;
}
.reconciliation-editor__actions, .reconciliation-editor__actions,
.reconciliation-editor__links { .reconciliation-editor__links {
display: flex; display: flex;
+12 -4
View File
@@ -117,7 +117,7 @@
<span v-else>{{ displayValue(row[column.prop]) }}</span> <span v-else>{{ displayValue(row[column.prop]) }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="操作" width="320" fixed="right" align="center"> <el-table-column label="操作" width="120" fixed="right" align="center">
<template #default="{ row }" <template #default="{ row }"
><div class="formal-page__links"> ><div class="formal-page__links">
<el-link <el-link
@@ -192,7 +192,14 @@
:readonly="editor.readonly" :readonly="editor.readonly"
@success="loadTable" @success="loadTable"
/> />
<el-dialog v-model="paymentDialog.visible" title="付款申请" width="520px" append-to-body> <el-dialog
v-model="paymentDialog.visible"
title="付款申请"
width="520px"
append-to-body
class="formal-payment-dialog"
>
<section-card title="付款信息">
<el-form :model="paymentDialog.form" label-position="right" label-width="auto"> <el-form :model="paymentDialog.form" label-position="right" label-width="auto">
<el-form-item label="结算单号">{{ <el-form-item label="结算单号">{{
paymentDialog.row.formalSettlementNo || '-' paymentDialog.row.formalSettlementNo || '-'
@@ -216,9 +223,10 @@
show-word-limit show-word-limit
/></el-form-item> /></el-form-item>
</el-form> </el-form>
</section-card>
<template #footer <template #footer
><el-button @click="paymentDialog.visible = false">取消</el-button ><el-button @click="paymentDialog.visible = false">取消</el-button
><el-button type="primary" :loading="paymentDialog.loading" @click="submitPayment" ><el-button type="success" :loading="paymentDialog.loading" @click="submitPayment"
>提交</el-button >提交</el-button
></template ></template
> >
@@ -530,7 +538,7 @@ export default {
.formal-page__search { .formal-page__search {
padding: 12px 12px 4px; padding: 12px 12px 4px;
background: #fff; background: #fff;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06); box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
} }
.formal-page__search-grid { .formal-page__search-grid {
display: grid; display: grid;
+11 -22
View File
@@ -130,7 +130,7 @@
<span v-else>{{ displayValue(row[column.prop]) }}</span> <span v-else>{{ displayValue(row[column.prop]) }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="操作" width="320" fixed="right" align="center"> <el-table-column label="操作" width="130" fixed="right" align="center">
<template #default="{ row }"> <template #default="{ row }">
<div class="pre-settlement-page__links"> <div class="pre-settlement-page__links">
<el-link <el-link
@@ -257,8 +257,14 @@
</template> </template>
</el-dialog> </el-dialog>
<el-dialog v-model="printDialog.visible" title="打印" width="620px" append-to-body> <el-dialog
<div class="dialog-section-title">选择打印模板</div> v-model="printDialog.visible"
title="打印"
width="620px"
append-to-body
class="pre-settlement-print-dialog"
>
<section-card title="选择打印模板">
<el-form label-position="right" label-width="auto" class="pre-settlement-page__print-form"> <el-form label-position="right" label-width="auto" class="pre-settlement-page__print-form">
<el-form-item label="项目"> <el-form-item label="项目">
<span>{{ printDialog.row.projectName || '-' }}</span> <span>{{ printDialog.row.projectName || '-' }}</span>
@@ -274,6 +280,7 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-form> </el-form>
</section-card>
<template #footer> <template #footer>
<el-button @click="printDialog.visible = false">取消</el-button> <el-button @click="printDialog.visible = false">取消</el-button>
<el-button type="primary" :loading="printDialog.loading" @click="handlePrintPreview"> <el-button type="primary" :loading="printDialog.loading" @click="handlePrintPreview">
@@ -699,7 +706,7 @@ export default {
&__search { &__search {
padding: 12px 12px 4px; padding: 12px 12px 4px;
background: #fff; background: #fff;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06); box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
} }
&__search-grid { &__search-grid {
@@ -754,8 +761,6 @@ export default {
} }
&__print-form { &__print-form {
margin-top: 20px;
:deep(.el-select) { :deep(.el-select) {
width: 320px; width: 320px;
} }
@@ -774,22 +779,6 @@ export default {
} }
} }
.dialog-section-title {
display: flex;
align-items: center;
min-height: 22px;
font-size: 16px;
font-weight: 600;
&::before {
width: 4px;
height: 18px;
margin-right: 8px;
background: #409eff;
content: '';
}
}
:deep(.pre-settlement-page .el-table) { :deep(.pre-settlement-page .el-table) {
--el-table-border-color: #eff1f7; --el-table-border-color: #eff1f7;
background: #fff; background: #fff;
@@ -76,7 +76,7 @@
<span v-else>{{ formatColumnValue(row, column) }}</span> <span v-else>{{ formatColumnValue(row, column) }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="操作" width="220" fixed="right" align="center"> <el-table-column label="操作" width="120" fixed="right" align="center">
<template #default="{ row }"> <template #default="{ row }">
<div class="settlement-detail-page__actions"> <div class="settlement-detail-page__actions">
<el-link v-if="row.settlementStatus === 'pending'" type="primary" @click="openAdjustDialog(row)"> <el-link v-if="row.settlementStatus === 'pending'" type="primary" @click="openAdjustDialog(row)">
@@ -111,7 +111,7 @@
destroy-on-close destroy-on-close
class="settlement-detail-dialog" class="settlement-detail-dialog"
> >
<el-tabs v-model="detailDialog.activeTab" @tab-change="handleDetailTabChange"> <el-tabs type="border-card" style="background-color: #ffffff" v-model="detailDialog.activeTab" @tab-change="handleDetailTabChange">
<el-tab-pane label="费用明细" name="fee"> <el-tab-pane label="费用明细" name="fee">
<el-table v-loading="detailDialog.loading" :data="feeRows" border> <el-table v-loading="detailDialog.loading" :data="feeRows" border>
<el-table-column type="index" label="序号" width="64" align="center" /> <el-table-column type="index" label="序号" width="64" align="center" />
@@ -399,7 +399,13 @@
</el-dialog> </el-dialog>
<el-dialog v-model="generateDialog.visible" title="生成费用" width="88%" append-to-body> <el-dialog v-model="generateDialog.visible" title="生成费用" width="88%" append-to-body>
<el-form :model="generateQuery" inline label-position="right" label-width="120px"> <el-form
:model="generateQuery"
class="settlement-detail-page__generate-search"
inline
label-position="right"
label-width="120px"
>
<el-form-item label="运单合同" required> <el-form-item label="运单合同" required>
<el-select <el-select
v-model="generateQuery.contractId" v-model="generateQuery.contractId"
@@ -1258,7 +1264,7 @@ export default {
margin-bottom: 8px; margin-bottom: 8px;
padding: 12px 12px 4px; padding: 12px 12px 4px;
background: #fff; background: #fff;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06); box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
:deep(.el-form-item__label) { :deep(.el-form-item__label) {
min-width: 160px; min-width: 160px;
@@ -1334,10 +1340,17 @@ export default {
} }
.settlement-detail-page__dialog-form { .settlement-detail-page__dialog-form {
padding: 16px 20px 0; padding: 16px 20px;
background: #fff;
border-radius: 6px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
:deep(.el-form-item) { :deep(.el-form-item) {
margin-bottom: 16px; margin-bottom: 16px;
&:last-child {
margin-bottom: 0;
}
} }
:deep(.el-select) { :deep(.el-select) {
@@ -1345,8 +1358,24 @@ export default {
} }
} }
.settlement-detail-page__adjust-toolbar {
margin-bottom: 8px;
}
.settlement-detail-page__generate-search {
margin-bottom: 16px;
padding: 12px 12px 4px;
background: #fff;
border-radius: 6px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
}
.settlement-detail-page__transfer-form { .settlement-detail-page__transfer-form {
margin-bottom: 16px; margin-bottom: 16px;
padding: 12px 12px 4px;
background: #fff;
border-radius: 6px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
} }
@media screen and (max-width: 1200px) { @media screen and (max-width: 1200px) {
@@ -1360,4 +1389,17 @@ export default {
grid-template-columns: 1fr; grid-template-columns: 1fr;
} }
} }
/* 详情弹窗 tabs 白底 */
.settlement-detail-dialog {
:deep(.el-tabs__content) {
background: #fff;
padding: 16px;
border-radius: 0 0 6px 6px;
}
:deep(.el-tab-pane) {
background: transparent;
}
}
</style> </style>
@@ -78,7 +78,7 @@
><span v-else>{{ displayValue(row[column.prop]) }}</span></template ><span v-else>{{ displayValue(row[column.prop]) }}</span></template
></el-table-column ></el-table-column
> >
<el-table-column label="操作" width="320" fixed="right" align="center" <el-table-column label="操作" width="120" fixed="right" align="center"
><template #default="{ row }" ><template #default="{ row }"
><div class="settlement-adjustment-page__links"> ><div class="settlement-adjustment-page__links">
<el-link <el-link
@@ -312,7 +312,7 @@ export default {
&__search { &__search {
padding: 12px 12px 4px; padding: 12px 12px 4px;
background: #fff; background: #fff;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06); box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
} }
&__search-grid { &__search-grid {
display: grid; display: grid;
+1 -1
View File
@@ -721,7 +721,7 @@ export default {
<style scoped> <style scoped>
.carrier-search-form { .carrier-search-form {
padding: 12px 12px 4px; padding: 12px 12px 4px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06); box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
} }
.carrier-pagination { .carrier-pagination {
+1 -1
View File
@@ -437,7 +437,7 @@ export default {
margin-bottom: 8px; margin-bottom: 8px;
padding: 12px 12px 4px; padding: 12px 12px 4px;
background: #fff; background: #fff;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06); box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
:deep(.el-form-item__label) { :deep(.el-form-item__label) {
min-width: 160px; min-width: 160px;
+1 -1
View File
@@ -384,7 +384,7 @@ export default {
margin-bottom: 8px; margin-bottom: 8px;
padding: 12px 12px 4px; padding: 12px 12px 4px;
background: #fff; background: #fff;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06); box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
} }
.risk-disposal-page__search-grid { .risk-disposal-page__search-grid {
@@ -1129,7 +1129,6 @@ export default {
color: #303133; color: #303133;
font-size: 14px; font-size: 14px;
font-weight: 400; font-weight: 400;
text-align: center;
} }
:deep(.score-description-input .el-input__inner) { :deep(.score-description-input .el-input__inner) {
+2 -2
View File
@@ -451,7 +451,7 @@ export default {
gap: 16px; gap: 16px;
margin-bottom: 16px; margin-bottom: 16px;
border-left: 4px solid var(--accent); border-left: 4px solid var(--accent);
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06); box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
transition: transform 0.2s, box-shadow 0.2s; transition: transform 0.2s, box-shadow 0.2s;
&:hover { &:hover {
transform: translateY(-2px); transform: translateY(-2px);
@@ -508,7 +508,7 @@ export default {
border-radius: 10px; border-radius: 10px;
padding: 18px 20px; padding: 18px 20px;
margin-bottom: 16px; margin-bottom: 16px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06); box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
// flex // flex
.trend, .trend,
+13 -13
View File
@@ -50,26 +50,26 @@ export default ({
__VUE_I18N_LEGACY_API__: true, __VUE_I18N_LEGACY_API__: true,
__INTLIFY_PROD_DEVTOOLS__: false, __INTLIFY_PROD_DEVTOOLS__: false,
}, },
server: {
port: 2888,
proxy: {
'/api': {
target: 'http://localhost',
//target: 'https://saber3.bladex.cn/api',
changeOrigin: true,
rewrite: path => path.replace(/^\/api/, ''),
},
},
},
// server: { // server: {
// port: 2889, // port: 2888,
// proxy: { // proxy: {
// '/api': { // '/api': {
// target: 'http://172.16.203.228:8000', // target: 'http://localhost',
// //target: 'https://saber3.bladex.cn/api',
// changeOrigin: true, // changeOrigin: true,
// rewrite: path => path.replace(/^\/api/, ''),
// }, // },
// }, // },
// }, // },
server: {
port: 2889,
proxy: {
'/api': {
target: 'http://172.16.203.228:8000',
changeOrigin: true,
},
},
},
resolve: { resolve: {
alias: { alias: {
'~': resolve(__dirname, './'), '~': resolve(__dirname, './'),