diff --git a/src/components/IdCardUnlockDialog.vue b/src/components/IdCardUnlockDialog.vue new file mode 100644 index 0000000..bef6bb7 --- /dev/null +++ b/src/components/IdCardUnlockDialog.vue @@ -0,0 +1,76 @@ + + + + + diff --git a/src/components/UserDetailPanel.vue b/src/components/UserDetailPanel.vue index 3219e8f..6731729 100644 --- a/src/components/UserDetailPanel.vue +++ b/src/components/UserDetailPanel.vue @@ -19,10 +19,12 @@ import { ElMessage, ElMessageBox } from 'element-plus' import InfoGrid from '@/components/InfoGrid.vue' import CrudTable from '@/components/CrudTable.vue' import CrudFormPanel from '@/components/CrudFormPanel.vue' +import IdCardUnlockDialog from '@/components/IdCardUnlockDialog.vue' import EntityPicker from '@/components/EntityPicker.vue' import { formApi } from '@/api/form' import { get } from '@/api/request' import { useUserStore } from '@/stores/user' +import { useIdCardUnlock } from '@/composables/useIdCardUnlock' import { getServerScopeParams } from '@/utils/serverScope' import { formatUtcTime as formatTime } from '@/utils/dateTime' import { isColumnVisible, columnDateValueFormat } from '@/utils/column' @@ -213,6 +215,17 @@ const EHRM_PROFILE_PATH = '/ehrm/profile' *(员工=本页用户;部门用 DeptUUID 的关联标签展示为「部门名称」;联系方式子表单独成块) */ const PROFILE_HIDDEN_FIELDS = ['EmployeeProfileUUID', 'UserUUID', 'TenantUUID', 'CompanyUUID'] +// 身份证二次密码解锁:与档案管理页共用同一套后端解锁态(按登录用户 10 分钟共享), +// 所以任一处解锁后,这里(含切换查看别的员工)也能直接看到身份证明文。 +const { + unlocked: idCardUnlocked, + dialogVisible: idCardDialogVisible, + submitting: idCardSubmitting, + refreshStatus: loadIdCardStatus, + open: openIdCardUnlock, + submit: submitIdCardUnlock, +} = useIdCardUnlock(loadProfile) + const profileLoading = ref(false) /** 该员工的档案记录(一人一份,最多一条) */ const profileRecord = ref | null>(null) @@ -243,6 +256,8 @@ const profileDisplayColumns = computed(() => c.type !== 'divider' && c.type !== 'html' && !PROFILE_HIDDEN_FIELDS.includes(c.field) && + // 身份证号:未解锁时整行隐藏(后端此时也不会返回值,避免出现空行) + (idCardUnlocked.value || c.field !== 'IdCard') && // 条件字段(如「其它志愿工作」):只有条件命中才展示,与表单口径一致 isColumnVisible(c, profileRecord.value), ), @@ -250,18 +265,30 @@ const profileDisplayColumns = computed(() => /** 填写/编辑表单列:排除隐藏/主键/非表单类型,以及由本页上下文注入的 UserUUID */ const profileFormColumns = computed(() => - profileColumns.value.filter( - (c) => - c.editable !== false && - !c.hideInForm && - c.type !== 'hidden' && - c.type !== 'divider' && - c.type !== 'html' && - c.field !== 'EmployeeProfileUUID' && - c.field !== 'UserUUID' && - // 部门员工关联:按本页员工自动带出后隐藏(查不到时才显示让用户手动选) - !(profilePickerHidden.value && c.field === 'UserRoleDepartmentUUID'), - ), + profileColumns.value + .filter( + (c) => + c.editable !== false && + !c.hideInForm && + c.type !== 'hidden' && + c.type !== 'divider' && + c.type !== 'html' && + c.field !== 'EmployeeProfileUUID' && + c.field !== 'UserUUID' && + // 部门员工关联:按本页员工自动带出后隐藏(查不到时才显示让用户手动选) + !(profilePickerHidden.value && c.field === 'UserRoleDepartmentUUID'), + ) + .map((c) => + // 身份证号:未解锁时禁用输入 + 明确提示;其余字段照常可改 + !idCardUnlocked.value && c.field === 'IdCard' + ? { + ...c, + disabled: true, + placeholder: '需先验证密码才能查看/修改', + tip: '身份证号需先点右上角「查看身份证」验证密码后才能查看或修改;不验证不影响修改其它字段。', + } + : c, + ), ) /** 只读展示值:实体标签(*_label)优先 → 选项映射 → 布尔/多选/日期 → 原值 */ @@ -468,6 +495,8 @@ watch( // 列定义与 2FA 信息只依赖登录用户,挂载时拉一次 void loadColumns() void loadTwoFactor() +// 身份证解锁态也只依赖登录用户,挂载时查一次(已解锁则档案直接显示明文) +void loadIdCardStatus() // 供调用方的「编辑」按钮触发本面板的编辑抽屉 defineExpose({ handleEdit }) @@ -590,16 +619,21 @@ defineExpose({ handleEdit })
员工档案(eHRM) - +
@@ -776,6 +810,13 @@ defineExpose({ handleEdit }) mode="drawer" @submit="submitProfile" /> + + +