feat(approval): 新增业务审批流程及配置管理

- 新增审批配置主子表(biz_approval_config / biz_approval_config_user),支持或签
- 5 个业务模块接入审批: 采购订单/客户报价/供应商报价/发货单/订单异议
- 统一审批动作接口(提交/通过/驳回),status=10 表示审批中
- 新增"待我审批"聚合页面,按业务类型筛选
- 修复 logback 写本地路径报错,去除文件 appender
- 修复 Redis SSL 配置在 Spring Boot 4 下需对象格式
- 补齐部分业务表缺失的 update_by/update_time 审计列

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-06-16 11:14:46 +08:00
parent 0180388a2f
commit 7ffc140cf8
69 changed files with 1563 additions and 446 deletions

View File

@@ -1,6 +1,6 @@
/* ═══════════════════════════════════════════════════════════════
京东风格 — 全局主题CSS 变量 + Element UI 覆盖)
主色:#e4393c 深红:#c81623 背景灰:#f5f5f5
主色:#e4393c 深红:#c81623 背景灰:#ffffff
═══════════════════════════════════════════════════════════════ */
:root {
@@ -8,11 +8,11 @@
--jd-red: #e4393c;
--jd-red-dark: #c81623;
--jd-red-hover: #e55a5d;
--jd-red-light: #fff5f5;
--jd-red-bg: #fff0f0;
--jd-red-light: #fafafa;
--jd-red-bg: #ffffff;
/* ═══ 灰色系 ═══ */
--bg-gray: #f5f5f5;
--bg-gray: #ffffff;
--bg-white: #ffffff;
--border-gray: #e5e5e5;
--border-light: #f0f0f0;
@@ -23,7 +23,7 @@
--text-light: #999999;
/* ═══ 功能色 ═══ */
--link-blue: #005ea7;
--link-blue: #e4393c;
--color-success: #67c23a;
--color-warning: #e6a23c;
--color-danger: #f56c6c;
@@ -61,7 +61,7 @@
--space-xl: 20px;
/* ═══ 表格 ═══ */
--table-header-bg: #f5f5f5;
--table-header-bg: #ffffff;
--table-header-text: #666666;
--table-row-hover: #f5f7fa;
--table-stripe: #fafafa;
@@ -69,12 +69,12 @@
/* ═══ 导航 ═══ */
--nav-height: 50px;
--nav-bg: #f5f5f5;
--nav-bg: #ffffff;
--nav-text: #333333;
--nav-hover: rgba(0, 0, 0, 0.04);
/* ═══ 侧栏 ═══ */
--sidebar-width: 200px;
--sidebar-width: 192px;
--sidebar-bg: #ffffff;
--sidebar-text: #666666;
--sidebar-text-active: #e4393c;
@@ -107,11 +107,21 @@ body {
顶部导航栏
═══════════════════════════════════════════ */
.navbar {
background: #f5f5f5 !important;
border-bottom: 1px solid #e5e5e5 !important;
box-shadow: none !important;
background: #ffffff !important;
border-bottom: 1px solid #ececec !important;
box-shadow: 0 1px 4px rgba(0, 0, 0, 0.04) !important;
height: var(--nav-height) !important;
color: #333 !important;
position: relative;
/* 顶部红色品牌细条 */
&::before {
content: '';
position: absolute;
left: 0; right: 0; top: 0;
height: 3px;
background: linear-gradient(90deg, #e4393c 0%, #c81623 60%, #e4393c 100%);
}
.hamburger-container svg {
color: #666 !important;
@@ -119,7 +129,8 @@ body {
}
.hamburger-container:hover {
background: rgba(0, 0, 0, 0.04) !important;
background: rgba(228, 57, 60, 0.06) !important;
svg { fill: #e4393c !important; color: #e4393c !important; }
}
.breadcrumb-container {
@@ -127,12 +138,15 @@ body {
.el-breadcrumb__inner a,
.el-breadcrumb__separator {
color: #999 !important;
font-weight: 400 !important;
}
.el-breadcrumb__inner.is-link {
font-weight: 400 !important;
&:hover {
color: #e4393c !important;
}
&:hover { color: #e4393c !important; }
}
.el-breadcrumb__item:last-child .el-breadcrumb__inner {
color: #333 !important;
font-weight: 500 !important;
}
}
@@ -142,36 +156,25 @@ body {
font-size: 16px !important;
&.hover-effect:hover {
color: #333 !important;
background: #f0f0f0 !important;
color: #e4393c !important;
background: rgba(228, 57, 60, 0.06) !important;
}
svg,
i {
color: #666 !important;
}
&:hover svg,
&:hover i {
color: #333 !important;
}
svg, i { color: #666 !important; }
&:hover svg, &:hover i { color: #e4393c !important; }
}
.avatar-container {
.user-nickname {
color: #333 !important;
font-weight: 500 !important;
}
.avatar-wrapper {
margin-top: 6px !important;
}
.user-nickname { color: #333 !important; font-weight: 500 !important; }
.avatar-wrapper { margin-top: 6px !important; }
}
.el-dropdown {
color: #333 !important;
}
.el-dropdown { color: #333 !important; }
.el-badge__content {
border-color: #fff !important;
background: #e4393c !important;
color: #fff !important;
}
}
@@ -183,7 +186,7 @@ body {
.el-menu-item,
.el-submenu__title {
color: #666 !important;
color: #555 !important;
background: transparent !important;
border-bottom: none !important;
height: var(--nav-height) !important;
@@ -191,12 +194,13 @@ body {
&:hover {
color: #e4393c !important;
background: rgba(0, 0, 0, 0.03) !important;
background: rgba(228, 57, 60, 0.04) !important;
}
&.is-active {
color: #e4393c !important;
background: transparent !important;
border-bottom: 2px solid #e4393c !important;
}
}
}
@@ -269,6 +273,21 @@ body {
.el-submenu.is-active > .el-submenu__title {
color: var(--sidebar-text-active) !important;
background: transparent !important;
}
/* 强制清除 element-ui 默认 hover 黄色背景 */
.el-submenu__title:hover,
.el-submenu__title:focus,
.el-menu-item:focus {
background: var(--sidebar-hover-bg) !important;
outline: none !important;
}
/* 子菜单展开时 inline-style 的浅色背景一并覆盖 */
.el-menu .el-menu-item,
.el-menu .el-submenu__title {
background-color: transparent !important;
}
/* 子菜单 */
@@ -277,12 +296,23 @@ body {
}
.el-submenu .el-menu-item {
padding-left: 42px !important;
padding-left: 32px !important;
height: 34px !important;
line-height: 34px !important;
font-size: 12px !important;
color: var(--text-medium) !important;
/* 二级菜单图标隐藏 */
.svg-icon,
> i,
> .el-icon-,
[class^="el-icon-"],
[class*=" el-icon-"] {
display: none !important;
width: 0 !important;
margin: 0 !important;
}
&:hover {
color: var(--text-medium) !important;
background: var(--sidebar-hover-bg) !important;
@@ -322,38 +352,39 @@ body {
/* ═══════════════════════════════════════════
按钮样式 — 银灰风格
═══════════════════════════════════════════ */
/* 主按钮 — 银灰色 */
/* 主按钮 — 京东红 */
.el-button--primary {
background: #909399 !important;
border: 1px solid #909399 !important;
background: var(--jd-red) !important;
border: 1px solid var(--jd-red) !important;
color: #fff !important;
border-radius: var(--radius-base) !important;
transition: all 0.2s;
&:hover,
&:focus {
background: #6b7280 !important;
border-color: #6b7280 !important;
background: var(--jd-red-dark) !important;
border-color: var(--jd-red-dark) !important;
}
&:active {
background: #4b5563 !important;
border-color: #4b5563 !important;
background: #a30f1c !important;
border-color: #a30f1c !important;
}
&.is-disabled,
&.is-disabled:hover {
background: #d1d5db !important;
border-color: #d1d5db !important;
background: #fbcecf !important;
border-color: #fbcecf !important;
color: #fff !important;
}
&.is-plain {
background: #fff !important;
border-color: #909399 !important;
color: #909399 !important;
border-color: var(--jd-red) !important;
color: var(--jd-red) !important;
&:hover {
background: #909399 !important;
background: var(--jd-red) !important;
color: #fff !important;
}
}
@@ -744,8 +775,8 @@ body {
color: #e6a23c !important;
}
.el-tag--primary {
background: #ecf5ff !important;
color: #409eff !important;
background: var(--jd-red-light) !important;
color: var(--jd-red) !important;
}
.el-tag--success {
background: #f0f9eb !important;