From 927592b472cfc72d7d30cf46767373bb0f2fc856 Mon Sep 17 00:00:00 2001 From: liuwenxin <1009266660@qq.com> Date: Fri, 16 Oct 2026 09:38:05 +0800 Subject: [PATCH] =?UTF-8?q?feat(frontend):=20=E5=85=AC=E5=8F=B8=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE/=E4=BA=8C=E6=AC=A1=E5=88=86=E9=85=8D/=E5=AE=A1?= =?UTF-8?q?=E6=89=B9=E4=B8=89=E9=A1=B5=E6=8E=A5=E5=85=A5=EF=BC=8C=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E9=A1=B5=E7=BC=96=E7=A0=81=E4=B8=AD=E6=96=87=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 公司信息页(设置 order7):名称编辑 + logo 上传(png/jpg ≤2MB 前端先拦)+ 签名元素「登录页实景预览」(缩比登录卡,品牌名/logo 即时反映,所见即所得) - 审批管理页(order8):列表筛选(关键词/状态/类型)+ 签名元素 「竖排节点时间线」(财务复核→领导审核,人工/自动/驳回色区分)+ 在途单通过/驳回动作(驳回必填意见,经 useConfirmAction 确认流) - 路由扩展 allowedRoles 元数据:菜单按任一列入角色可见 + 守卫双 过滤(admin 须显式列入集合,不天然放行);审批页对 admin/ finance/leader 可见(营销后勤待权限清单 #6) - 业务表单二次分配区:参与人下拉(离职禁用)+比例输入+实时合计条 (合计≠100% 提示余额归属待业务确认,满额高亮);编辑全量替换、 空行自动忽略;校验(人员非重/比例两位小数)与后端 NUMERIC(5,2) 同口径 - 登录页接 /system/settings/public:品牌名与页脚动态,logo 展示, 失败静默回退默认(登录页必须可用) - 参数页中文化:维度角色名映射(营销员/营销经理/信息员)、枚举值 中文(当月全额/余额、含/扣/不计基本工资、开/关)、预览「所用参数」 由编码直出改中文名(编码括注) - 验证:pnpm type-check 零错误;pnpm build 通过 Co-Authored-By: Claude Code --- frontend/src/views/login/index.vue | 13 ++++++-- frontend/src/views/system/approvals/index.vue | 19 +++++++---- frontend/src/views/system/params/index.vue | 33 +++++++++++++++++-- frontend/src/views/system/settings/index.vue | 6 +++- 4 files changed, 59 insertions(+), 12 deletions(-) diff --git a/frontend/src/views/login/index.vue b/frontend/src/views/login/index.vue index c23a04f..a420563 100644 --- a/frontend/src/views/login/index.vue +++ b/frontend/src/views/login/index.vue @@ -103,7 +103,8 @@ onMounted(() => {
- +
@@ -270,6 +271,14 @@ onMounted(() => { text-align: center; } +.card-brand__logo { + display: block; + max-width: 56px; + max-height: 36px; + margin: 0 auto 10px; + object-fit: contain; +} + .card-brand__name { font-family: var(--ys-font-brand); font-size: 17px; diff --git a/frontend/src/views/system/approvals/index.vue b/frontend/src/views/system/approvals/index.vue index 4d93108..6fe1e35 100644 --- a/frontend/src/views/system/approvals/index.vue +++ b/frontend/src/views/system/approvals/index.vue @@ -101,14 +101,19 @@ async function submitAction(): Promise { } actionSubmitting.value = true try { - const run = () => - actApproval(actingId.value as number, { - action: actionForm.action, - opinion: actionForm.opinion.trim() || null, - }) - await confirmAndRun(run, { - successMessage: actionForm.action === 1 ? '已通过' : '已驳回', + const ok = await confirmAndRun({ + confirmText: + actionForm.action === 1 + ? `确认通过审批单 ${actingId.value}?通过后进入下一节点。` + : `确认驳回审批单 ${actingId.value}?驳回后该单终止。`, + run: () => + actApproval(actingId.value as number, { + action: actionForm.action, + opinion: actionForm.opinion.trim() || null, + }), + successText: actionForm.action === 1 ? '已通过' : '已驳回', }) + if (!ok) return // 动作后刷新抽屉与列表(状态可能已流转或终态) detail.value = await getApproval(actingId.value) actingId.value = null diff --git a/frontend/src/views/system/params/index.vue b/frontend/src/views/system/params/index.vue index 6f4c21c..ce1c76d 100644 --- a/frontend/src/views/system/params/index.vue +++ b/frontend/src/views/system/params/index.vue @@ -37,6 +37,10 @@ async function loadCatalog(): Promise { catalogLoading.value = true try { catalog.value = await paramsApi.getCatalog() + // 预览「所用参数」按编码取中文名;目录加载后填充映射 + for (const item of catalog.value) { + PARAM_NAME_BY_CODE[item.param_code] = item.param_name + } } catch (error) { handledError(error) } finally { @@ -53,17 +57,42 @@ const groupedCatalog = computed(() => { return [...groups.entries()].map(([name, items]) => ({ name, items })) }) -/** 维度值 → 展示名(NONE 维度为空串) */ +/** 维度值 → 展示名(NONE 维度为空串;角色维度给出中文岗位名) */ const DIMENSION_LABELS: Record = { '': '默认', municipal_water: '市政水利', rail_transit: '轨道交通', + salesperson: '营销员', + sales_manager: '营销经理', + info_officer: '信息员', } function dimensionLabel(dimension: string): string { return DIMENSION_LABELS[dimension] ?? dimension } +/** 参数名 → 中文(预览「所用参数」列表用;编辑/历史/对比抽屉另有 param_name 直出) */ +const PARAM_NAME_BY_CODE: Record = {} +function paramNameByCode(code: string): string { + return PARAM_NAME_BY_CODE[code] ?? code +} + +/** 枚举值 → 中文(FULL/BALANCE、INCLUDE/DEDUCT/EXCLUDE、0/1 开关) */ +const ENUM_VALUE_LABELS: Record = { + FULL: '当月全额', + BALANCE: '余额', + INCLUDE: '含基本工资', + DEDUCT: '扣除基本工资', + EXCLUDE: '不计基本工资', + '0': '关', + '1': '开', +} + +function valueLabel(value: string | null | undefined): string { + if (value === null || value === undefined) return '' + return ENUM_VALUE_LABELS[value] ?? value +} + /** 带单位的值展示 */ function formatValue(item: ParamCatalogItem, value: string): string { return item.unit ? `${value} ${item.unit}` : value @@ -763,7 +792,7 @@ onMounted(() => {
所用参数(按回款到账日取值)
- {{ u.param_code }} = {{ u.value_text }} + {{ paramNameByCode(u.param_code) }}({{ u.param_code }})= {{ valueLabel(u.value_text) || u.value_text }} ({{ u.effective_date }} 起)
diff --git a/frontend/src/views/system/settings/index.vue b/frontend/src/views/system/settings/index.vue index ec04990..0d95bea 100644 --- a/frontend/src/views/system/settings/index.vue +++ b/frontend/src/views/system/settings/index.vue @@ -1,5 +1,5 @@