Commit Graph
244 Commits
Author SHA1 Message Date
TermiNexus 632881b5c5 feat(ehrm): 员工档案新增身份证号列(加密存库 + 二次密码解锁查看)
- EmployeeProfile 新增 IdCard 列,落库前用 payment 的 XOR+base64 加密(迁移 0049)
- 新增 idcard_access:解锁态按登录用户存 10 分钟 cache(切换他人档案同样有效)
- FormAPI 读路径:未解锁时身份证一律抹空(完全隐藏);写路径加密,空值不覆盖已存证号
- 新增 /API/Ehrm/UnlockIdCard 与 /API/Ehrm/IdCardStatus(复用 AuthManager.VerifyUserPassword)
2026-10-02 14:13:26 +08:00
TermiNexus f3920a35ca chore: 更新完成提示 toast 文案(部门员工抽屉) 2026-10-02 12:56:16 +08:00
TermiNexus 2f7bf3ea65 chore: 更新完成提示 toast 文案(两仓 push 完成) 2026-10-01 23:38:21 +08:00
TermiNexus 2a8922ebc7 chore: 更新完成提示 toast 文案(注销 4 个账号及其关联) 2026-10-01 23:30:58 +08:00
TermiNexus 0509cc2517 chore: 更新完成提示 toast 文案(银河锋锐缺 eHRM 档案名单) 2026-10-01 23:22:24 +08:00
TermiNexus 82ddddce00 chore: 更新完成提示 toast 文案(工作组卡片角色数/用户数) 2026-10-01 23:18:11 +08:00
TermiNexus fbae55f017 chore: 更新完成提示 toast 文案(员工卡片角色数/用户数) 2026-10-01 23:16:32 +08:00
TermiNexus 07e44eefc6 feat(gerp): 员工列表支持按需统计去重用户数
部门详情「部门员工」与公司详情「员工」卡片标题需要显示「角色数:x/用户数:y」。

get_table 新增 WithUserCount 参数:带该参数时额外统计去重用户数(UserRole 直接按
UserUUID 去重;UserRoleDepartment/UserRoleWorkgroup 只存 UserRoleUUID 且非外键,
需回查 UserRole 后再去重)。默认不统计,避免给所有列表加一次查询。

Get/List 响应新增 _FormListResponse:仅在请求了计数时改为 {list, total, user_count}
对象结构 —— 前端 axios 拦截器只透传 data,计数挂在 data 之外读不到;不带该参数时
仍返回原有的数组结构,既有调用方行为不变。
2026-10-01 23:15:50 +08:00
TermiNexus d92797eb31 chore: 更新完成提示 toast 文案(三仓推送同步) 2026-10-01 22:23:28 +08:00
TermiNexus 22d4c0cfab chore: 更新完成提示 toast 文案(Main.py 热重载修复与单实例改造) 2026-10-01 21:16:35 +08:00
TermiNexus 5a8d29d31a fix(Main): 修复热重载卡死事件循环并改造为单实例
--reload 改为纯通知指令:只通过 127.0.0.1:57321 控制端口通知既有实例重启,
本进程立即退出;找不到实例也直接退出,不再新开服务器抢占 80/443。

根因修复:monkey.patch_all() 把 threading 一并打补丁,导致 watchdog 的
Observer 变成 gevent 协程,其阻塞的 ReadDirectoryChangesW 不让出 hub,
整个事件循环被卡死(端口在监听却不再 accept)。改为轮询 .py 的 mtime/size,
并从 requirements.txt 移除 watchdog。

另修两处启动隐患:预置 WSGI SERVER_NAME 跳过 gevent 对 0.0.0.0 的反向 DNS
(实测 1.3s 起,期间服务器不 started);WaitForPortFree 用裸 bind 探测端口,
避免 SO_REUSEADDR 造成的"假绑定→静默停服"。
2026-10-01 21:16:12 +08:00
TermiNexus 45a710783b chore: 更新完成提示文案 2026-10-01 20:27:18 +08:00
TermiNexus a3e28011e4 feat(tools): 新增 eHRM 档案导入脚本 ImportEhrmProfiles
把「成员信息.xlsx」入组问卷按字段口径写入 EmployeeProfile / EmployeeContact:内置行号→账号映射与问卷→eHRM 的字段换算(年龄区间桶、政治面貌/学历/行业归一、其它志愿工作、设备与备注、联系方式类型),默认 dry-run,--write 时事务内写库;已建档员工自动跳过,可反复执行,后续问卷新增行只需补 ROW_USER 一行。
2026-10-01 20:27:10 +08:00
TermiNexus 748d27b76d chore: 更新完成提示文案 2026-10-01 20:22:37 +08:00
TermiNexus 19b9360d57 feat(gerp): 联系方式新增 Github/电报 类型,设备选项新增「平板」
成员问卷里联系方式有 Github、电报两类,设备有平板;CONTACT_TYPE_OPTIONS 补 8=Github / 9=电报(EmployeeContact.ContactType 为 SmallInteger,无需迁移),Devices 的 tags 选项补「平板」,并同步模型注释。列定义由后端下发,前端无需改动。
2026-10-01 20:22:28 +08:00
TermiNexus c55ea4cf0a chore: 更新完成提示文案 2026-10-01 20:05:32 +08:00
TermiNexus 5b20e1b053 chore: 更新完成提示文案 2026-10-01 20:03:26 +08:00
TermiNexus 07803791a0 chore: 更新完成提示文案 2026-10-01 20:02:00 +08:00
TermiNexus f8c412bebf chore: 更新完成提示文案 2026-10-01 19:57:53 +08:00
TermiNexus 3ec985a26d chore: 更新完成提示文案 2026-10-01 19:54:25 +08:00
TermiNexus 633cc71622 feat(gerp): 「其它」说明字段统一按 visibleWhen 条件显示
以 EMPLOYEE_PROFILE_OTHER_FIELDS 登记表替代原先写死的一条,覆盖志愿工作与他人关系两处;选项值直接取自对应单选字段的选项表,两种「其它/其他」写法都算命中。
2026-10-01 19:53:54 +08:00
TermiNexus adc5e55532 chore: 更新完成提示文案 2026-10-01 19:51:35 +08:00
TermiNexus 2af519a4cc feat(gerp): 其它志愿工作改为条件显示字段
EmployeeProfile.VolunteerWorkOther 增加 visibleWhen(仅当 VolunteerWork = 其它 时显示),前端统一按该规则判定。
2026-10-01 19:51:22 +08:00
TermiNexus aca425b113 chore: 更新完成提示文案 2026-10-01 19:39:53 +08:00
TermiNexus 6695b9fe1e chore: 更新完成提示文案 2026-10-01 19:37:05 +08:00
TermiNexus 46be2bd3e2 feat(gerp): 员工档案字段重建 + 联系方式子表
EmployeeProfile 按新清单重建:删工号,新增姓名/性别/年龄/种族/政治面貌/生日、网络昵称/志愿/志愿工作、从事行业、设备与备注、派发设备与奖罚意愿、期望工作时段、躯体疾病/精神障碍、紧急联系人关系与自定义联系方式;员工名/部门名/职务改为关联只读展示(不再写 DeptName)。新增 EmployeeContact 子表与 0048 迁移;form_service 下发选项模板(性别/年龄/学历/行业/志愿/关系/疾病/设备)与 subform 列,add/modify 同步子表明细,get_table 注入职务与联系方式明细。
2026-10-01 19:36:45 +08:00
TermiNexus dc7f133b5f chore: 更新完成提示文案 2026-10-01 16:56:53 +08:00
TermiNexus 9dd9b41147 chore: 更新完成提示文案 2026-10-01 16:28:12 +08:00
TermiNexus 0367165072 chore: 更新完成提示脚本文案
toast 临时脚本:同步本次任务标题与提交号。
2026-10-01 16:27:51 +08:00
TermiNexus fd56a9e4ff feat(gerp): 部门新增成员改用部门员工关联选择器
UserRoleDepartment 表单人员输入统一为 DEPT_EMPLOYEE_PICKER(与 eHRM/工作组同源单一配置):新增虚拟列置顶,用户/角色列改为纯列表展示,DeptUUID 表单隐藏(上下文优先,否则取选择器解析的部门),删除就地写的 UserRoleSearch 选择器;add_record/modify_record 支持 UserRoleDepartmentUUID 解析 UserRoleUUID 并拒绝选到别的员工。
2026-10-01 14:16:18 +08:00
TermiNexus 4669a7c53c docs(gerp): 补充实体选择器浏览面板标题与尺寸约定
新增第 7 条约定:浏览面板标题用 browseTitle 去重前缀,面板统一 680px 宽、列表 420-560px 高。
2026-10-01 14:10:10 +08:00
TermiNexus f1673c09e2 feat(gerp): 工作组新增成员改用部门员工关联选择器
取值与 eHRM 员工档案统一为「部门员工关联」(UserRoleDepartmentUUID = 部门 + 用户-角色对),仅是否多选暂存不同:常量 DEPT_EMPLOYEE_PICKER_BY_USER_ROLE → DEPT_EMPLOYEE_PICKER_MULTI。UserRoleWorkgroup 新增虚拟列 UserRoleDepartmentUUID 作为表单唯一人员选择入口,真实关系列 UserRoleUUID 置 hideInForm;列表行注入 UserRoleDepartmentUUID 与回显标签。_ResolveDeptEmployee 收敛为唯一解析实现(同时给出 UserUUID/DeptUUID/DeptName 与 UserRoleUUID),add_record/modify_record 按表取键。文档同步;137 用例全绿。
2026-10-01 14:06:32 +08:00
TermiNexus 86ae4fb2a1 feat(gerp): 新增表单把部门员工关联选择器置顶
新增 DEPT_EMPLOYEE_FIRST_TABLES(UserRoleWorkgroup / EmployeeProfile)并在 get_columns 收尾处把「部门员工关联」列移到表单最前:先选它即可带出员工/部门/角色,其余字段(职务/类型等)为派生或可选。实测顺序:工作组成员新增 = 部门员工关联 → 职务 → 类型。
2026-10-01 14:03:03 +08:00
TermiNexus b44dddd857 fix(gerp): 介绍类字段表单统一按多行输入渲染
WorkgroupIntroduction(工作组介绍)等 CharField 介绍字段此前被映射成单行 text,编辑时不好输入长文本。现按「字段名以 Introduction 结尾 或 verbose_name 含"介绍"」统一置为 textarea(TextField 类介绍字段本就已是 textarea,不受影响)。
2026-10-01 13:48:11 +08:00
TermiNexus 3859aa1762 docs(gerp): 新增实体选择器标准文档
记录 EntityPicker/MultiEntityPicker 的分层与单一来源、Search 接口数据契约、配置字段(含 treeGroup 与多选暂存)、部门员工关联常量的取值与落库对应、el-tree 自绘场景的 useDeptEmployeeTree,以及新增/改动时必须遵守的约定与变更检查清单。
2026-10-01 12:37:15 +08:00
TermiNexus edd4a85f98 refactor(gerp): 部门员工关联选择器配置抽成单一来源
新增 DEPT_TREE_GROUP / DEPT_EMPLOYEE_PICKER / DEPT_EMPLOYEE_PICKER_BY_USER_ROLE 三个常量并加注释说明使用点,三处(eHRM 员工档案 / 工作组新增成员 / 部门挂靠)改为引用,禁止再就地复制 entityPicker 配置。eHRM 员工档案的「部门员工关联」取值不变(仍为 UserRoleDepartmentUUID),UI 换成工作组的部门树分组浏览面板(treeGroup + secondaryField + dependCompany)。
2026-10-01 00:32:10 +08:00
TermiNexus 29031de724 feat(ehrm): 员工档案一人一份,新增与改绑均拦截重复建档
EmployeeProfile 与员工一一对应:add_record 解析出 UserUUID 后先查重(前端在已有档案时已隐藏新增入口,这里兜住直接调接口/并发提交);modify_record 改绑到已有档案的员工时同样拦截(排除当前档案自身),避免编辑换员工绕过约束。
2026-09-30 23:38:01 +08:00
TermiNexus 90c7c3403a feat(gerp): 租户详情编辑仅允许修改租户名称
- 列配置:Tenant 的 TenantStatus/TenantExpireTime/ReviewStatus/ReviewRemark/ReviewerUUID/ReviewTime
  统一 editable=False + hideInForm=True(位置在 entityPicker 强制可编辑之后,避免被改回)
- 写路径白名单:modify_record 对 Tenant 仅保留 Table/PK/Action/UUID/TenantName,其余字段丢弃,
  防绕过前端直接提交;审核仍走 /API/TenantReview 专用接口
2026-09-30 18:25:23 +08:00
TermiNexus 228fa993c8 feat(gerp): 工作组「部门员工关联」编辑回显带部门
UserRoleWorkgroup 的表单选择器(visible=False 的 UserRoleUUID 列)编辑回显标签由角色名改为「部门 · 员工」:关系表不存部门,故按 UserRoleUUID 取主部门关联(同当前公司优先,否则首条,与批量调整职务取法一致)。仅影响工作组的该标签,UserRoleDepartment 的同类标签不变。

冒烟(真库,工作组 255599f6):回显标签为「运维部 · 耀月」「运维部 · felix/余凤」;列配置标题=部门员工关联、api=DeptEmployeeSearch?Dedup=UserRole、treeGroup 保留多选批量。
2026-09-30 11:03:20 +08:00
TermiNexus d503a28fae feat(gerp): 工作组新增改用真「部门员工关联」数据源
工作组详情「新增」的成员选择器由 UserRoleSearch(用户-角色对)换成 DeptEmployeeSearch(UserRoleDepartment 部门员工关联):选项展示「部门 · 员工」并按部门树分组,仍支持多选暂存批量新增;值取 UserRoleUUID(工作组关系表只存该列,写入路径不变)。

DeptEmployeeSearch 配套增强:Dedup=UserRole 按用户-角色对去重(同一员工多部门只出现一条,避免同值重复选项);tree=1 返回部门树;每项补 RoleName(副文本)与 UserRoleUUID。

冒烟(真库):全量 20 条含 RoleName;Dedup 后 20 条唯一值 20;tree=1 返回 5 个部门节点、非树请求不含 tree 字段;关键字=工程 命中 8 条(同名不同角色各一条,符合预期)。
2026-09-30 11:01:46 +08:00
TermiNexus 59d72af7a5 refactor(gerp): 统一「部门员工关联」叫法(工作组新增 + 员工档案)
工作组详情「新增」表单里原「用户-角色关联」字段(UserRoleWorkgroup.UserRoleUUID 选择器)标题与占位文案改为「部门员工关联」,与员工档案新增的同类选择器叫法一致;员工档案虚拟列标题由「部门-员工」改为「部门员工关联」,相关校验提示同步改为该叫法。
2026-09-30 10:59:33 +08:00
TermiNexus 9a2d1be1b2 feat(gerp): 员工档案直接绑定「部门-员工」关系
档案表单原来要分别选「员工」(UserSearch) 与「部门」(DepartmentSearch),易出现员工与部门不匹配;现改为一个「部门-员工」选择框,直接绑定一条 UserRoleDepartment 关系,选中即同时确定员工与部门,表结构不变(仍写 UserUUID/DeptUUID/DeptName)。

新增 GET /API/FormAPI/DeptEmployeeSearch:数据源为 UserRoleDepartment,返回 UserRoleDepartmentUUID/DeptUUID/DeptName/UserUUID/UserName 与标签「部门 · 员工」;keyword 同时匹配用户名与部门名;显式 CompanyUUID 优先,否则用当前角色公司,无公司上下文返回空。EmployeeProfile 注入虚拟列 UserRoleDepartmentUUID(仅表单可见),表单内隐藏 UserUUID/DeptUUID/DeptName(列表仍展示);get_table 按 (UserUUID, DeptUUID) 反查关系回填 UUID 与标签保证编辑回显;add_record/modify_record 解析该 UUID 写三列(新增未选时提示「请选择部门-员工」,跨公司关系拒绝)。

顺带修复:/Modify/ 与 /ModifyItem/ 补错误字典透出(原来错误被当成功返回);add_record/modify_record 返回主键由 bytes repr 归一化为标准 UUID 字符串。
2026-09-30 10:39:30 +08:00
TermiNexus 8d2e389e04 chore(部署): 同步 GVSite 构建产物(index-CEf7BUYR.js) 2026-09-30 00:02:13 +08:00
TermiNexus d500509d82 chore(部署): 同步 GVSite 构建产物(index-BRfB7xqD.js) 2026-09-29 23:57:03 +08:00
TermiNexus 74ad6143cd chore(部署): 同步 GVSite 构建产物(index-IWFpVeOm.js) 2026-09-29 23:54:02 +08:00
TermiNexus 7728535b9e chore(部署): 同步 GVSite 构建产物(index-N7G4X2ty.js) 2026-09-29 23:51:39 +08:00
TermiNexus d5598e7846 chore(部署): 同步 GVSite 构建产物(index-DN44jXnz.js) 2026-09-29 23:48:30 +08:00
TermiNexus c957fafee0 chore(部署): 同步 GVSite 构建产物(index-3-4D0mYL.js) 2026-09-29 23:42:42 +08:00
TermiNexus 3276dedb3d chore(部署): 同步 GVSite 构建产物(index-W2o18l9k.js) 2026-09-29 23:40:02 +08:00
TermiNexus e893f262bb chore(部署): 同步 GVSite 构建产物(index-Crj6GnMn.js) 2026-09-29 23:23:12 +08:00