TermiNexus
|
8abbe1eefc
|
feat(Talk): 群头像支持自定义上传与成员九宫格默认
|
2026-10-13 18:23:17 +08:00 |
|
TermiNexus
|
5707ab0371
|
feat(Talk): 群操作写系统消息并广播会话事件
新增 AppendSystemMessage:改群名/群公告/移出成员/转让群主/设取消管理员时写入 MsgType=3 系统消息,同时回填会话最后消息摘要,使不在会话内的成员通过未读提醒感知(群公告提醒即走此路径)。
新增 BroadcastConversation,向会话广播 talk:conversation 事件(renamed/announcement/role_changed/members_removed/owner_transferred/dissolved),供前端立即同步会话列表与成员。
|
2026-10-13 17:20:27 +08:00 |
|
TermiNexus
|
f608a6f9c0
|
feat(Talk): 新增移出群成员、转让群主与群公告
移出群成员 POST Conversation/Member/Remove:群主可移出任何人(群主除外),群管理员仅可移出普通成员,Talk 管理员不受限;转让群主 POST Conversation/Transfer:仅群主或 Talk 管理员,原群主转为群管理员;群公告 POST Conversation/Announcement:群主/群管理员可编辑(空串清空),TalkConversation 增 Announcement/AnnouncementTime(迁移 0056)。
群主判定改为「成员表 Role=群主 优先,仅无群主行时回退创建人」,避免转让后创建人仍被当作群主;群主退出时优先移交给最早加入的管理员;会话列表返回群公告字段。
|
2026-10-13 16:37:53 +08:00 |
|
TermiNexus
|
90b20f3c94
|
feat(Talk): 群支持最多 10 个管理员,改群名收紧到群主/管理员
成员角色新增 2=管理员(MAX_GROUP_ADMINS=10);新增 POST API/Talk/Conversation/Member/Role 设置/取消管理员(仅群主或 Talk 管理员,不能变更群主);会话列表返回 IsGroupAdmin/MyRole/AdminCount/CanManage 与成员 MemberRole;RenameConversation 增加 IsTalkAdmin 参数并把群聊改名权限收紧到群主/群管理员;Entry 下发 GroupAdminLimit。
|
2026-10-13 16:07:52 +08:00 |
|
TermiNexus
|
4bd5697cff
|
feat(订阅式软件提供): 包详情支持依赖列表与 README,打通产品官网数据链路
GVSDServiceServer:VenomPackage 增 Dependencies(JSON)/Readme(Text) 与迁移 0002,新增按包名取详情接口 /api/venom/project/<包名>/,定制页配置新增依赖编辑器与 README 编辑。
gvsds:新增 /API/Venom/Project/<包名> 公开只读接口,按 PublicSiteHost 反查产品并回源提供者;SubscriptionGroup 增 PublicSiteHost 字段(迁移 0055)。
Main.py:venom 子域加 SPA fallback,/project/<包名>/ 回退 index.html。
|
2026-10-07 19:35:46 +08:00 |
|
TermiNexus
|
edecc6435a
|
feat(订阅式软件提供): 远端入口 URL 带内容版本号,免除浏览器旧副本
- ProxyEntryURL 追加 ?v=<SHA256前16位>:内容一变 URL 就变,浏览器/中间缓存旧副本自动作废,提供者重建后无需强制刷新
- 重新声明定制页时清缓存并立即回源预热,使版本号自第一刻起即为新值(返回体新增 WarmError 供排查)
|
2026-10-07 18:05:23 +08:00 |
|
TermiNexus
|
6165df5d78
|
fix(订阅式软件提供): 远端资源改 no-cache 条件校验,且 ETag 按 RFC7232 弱比较
- 浏览器侧 max-age=24h 会把旧产物挡住一天,提供者重建后被浏览器旧副本劫持;改为 no-cache + ETag:每次校验、未变 304,回源仍受主服务 24h TTL 限制
- 实测响应 ETag 被网关降为弱校验(W/ 前缀),严格相等匹配拿不到 304;改为归一化(去 W/ 与引号)后按弱比较命中,实测 304
|
2026-10-07 17:59:59 +08:00 |
|
TermiNexus
|
8d98abe231
|
feat(订阅式软件提供): 提供者重新声明定制页即失效该产品资源缓存
入口 URL 通常不含内容版本号,24h TTL 内主服务不会回源,重建后的产物要等过期才生效;改为 SetGroupRemotePage 时清空该产品缓存(PurgeRemoteAssets),下次请求立即回源并按 SHA256 只换来真正变化的文件
|
2026-10-07 17:44:29 +08:00 |
|
TermiNexus
|
89274ea2bd
|
fix(订阅式软件提供): 远端资源浏览器侧缓存与主服务统一为 24h
Cache-Control 由 max-age=3600 改为 max-age=86400(复用 REMOTE_ASSET_TTL_SECONDS),保留 ETag 条件请求
|
2026-10-07 17:31:09 +08:00 |
|
TermiNexus
|
eecb4f66e9
|
feat(订阅式软件提供): 主服务缓存代理提供者子服务器资源,浏览器不再直连
- 新增 SubscriptionRemoteAsset 缓存表(迁移 0054):内容落库,TTL 24h,过期回源按 SHA256 判断变更,回源失败降级用旧缓存
- 新增 GET /API/Subscription/RemoteAsset/<GroupUUID>/<Path>(带 ETag/条件请求)与 ANY /API/Subscription/RemoteApi/<GroupUUID>/<Path> 实时接口透传(不缓存、不转发 Cookie)
- ListMySubscriptions 下发的 RemoteEntry 改写为主服务同源代理 URL;venom_ui API base 随之走 RemoteApi 透传
|
2026-10-07 17:22:48 +08:00 |
|
TermiNexus
|
b078f8e9fe
|
feat(订阅式软件提供): 产品定制页远端入口 + 我的订阅 + GVSDServiceServer
订阅组新增 RemoteEntry/RemoteModule(0053 迁移);新增 Provider/Page/Save(提供者用 ApiKey+密钥换取令牌后声明定制页)与 MySubscriptions(按当前用户查已订阅产品,含定制页入口)接口;清单新增「我的订阅」菜单与 subscriber 虚拟职务;新增提供者子服务器 GVSDServiceServer(仿 ATestCServer:MSYNC 桥接 + 托管 Venom 定制页远端组件 + 用订阅凭据声明定制页)。
|
2026-10-05 17:00:05 +08:00 |
|
TermiNexus
|
2c8dd45206
|
feat(订阅式软件提供): 产品级 API Key/密钥与订阅成员
新增 SubscriptionApiCredential(每产品一对 ApiKey+密钥,密钥仅存 bcrypt 哈希,激活/重置时明文仅返回一次)与 SubscriptionMember(以「部门-员工键」记录订阅,写入时校验部门必须归属该产品消费者公司);manager 增加凭据激活/查看/重置/校验与访问令牌签发、成员列表/批量保存/删除;views/urls 增加管理端凭据与成员接口,以及提供者子服务器 Token(免登录换令牌)与 Ping(Bearer 鉴权);新增 permissions 提供者令牌认证与权限。
|
2026-10-05 11:29:04 +08:00 |
|
TermiNexus
|
a647508214
|
feat(gerp): 订阅允许同一家公司同时作为提供者与消费者
- SaveGroup / SaveAppParties 去掉两方交集校验(唯一键按 PartyType 区分,同一公司可落两行)
- 保留「同一身份下不可重复出现」校验
- 同步更新 models 文档说明
|
2026-10-05 11:03:13 +08:00 |
|
TermiNexus
|
1ac76006c6
|
fix(gerp): 部门详情页修改成员误报「不属于当前公司」
_ResolveDeptEmployee 的跨公司校验未按公司隔离开关生效:管理员(admin:super/admin:tenant)本就关闭公司隔离,当「当前角色公司 ≠ 目标部门所属公司」时(如同一用户切到默认角色后浏览其它公司的部门,PUT /API/FormAPI/Modify/UserRoleDepartment/<pk> 恒返回 400)。
- 改为仅在 self.company_scope=True(非管理员)时校验,与批量调整职务等处的既有写法一致
|
2026-10-02 23:44:38 +08:00 |
|
TermiNexus
|
f060fb14f1
|
fix(gerp): 订阅应用职务门禁改挂既有业务职务,撤回误建的字典项
提供方/消费方是公司级、组内身份,不应建成租户级通用部门/职务。
- 清单 VirtualPositions 改为 业务主管/订单专员/业务经理/产品专员(各可见三个菜单)
- 移除 PositionTemplates(不再声明通用部门与职务模板)
- 数据侧已删除误建的通用部门「订阅」与其下三个职务,并重新自动绑定
|
2026-10-02 23:26:35 +08:00 |
|
TermiNexus
|
02bb7b3852
|
feat(gerp): 订阅应用新增应用级订阅方与业务虚拟职务
- 新增 SubscriptionAppParty(应用级提供者/消费者公司,作为初始化引用)+ 迁移 0051
- 新增接口 GET /API/Subscription/AppParties、POST /API/Subscription/AppParty/Save
- 清单新增 RequirePositionBinding、菜单「软件管理」(/subscription/software)、3 个业务虚拟职务(软件提供方/软件消费方/订阅管理员)与「订阅」职务模板
|
2026-10-02 23:12:27 +08:00 |
|
TermiNexus
|
e60200b334
|
feat(gerp): 新增「订阅式软件提供」应用
订阅组 = 一个产品,为产品指定一家或多家提供者公司/消费者公司;可选公司范围 = 当前管理员可管理的全部公司(跨租户管理员可选任意租户)。
- 新增 subscription 子应用:models/manager/views/urls/manifest
- SubscriptionGroup / SubscriptionGroupCompany(PartyType 1提供者/0消费者)
- 校验:产品名必填且同租户唯一、提供者/消费者各至少一家、同一产品内不可双重身份、越权公司拒绝
- 新增迁移 0050_subscription
- urls 挂载 API/Subscription/;app_manifests 登记父菜单「订阅式软件提供」
- 修复 CompanyRows 中 UUIDObj/bytes 键不匹配导致公司名为空
- 修复 SaveGroup 的 AllowedCompanyUUIDs 未归一(UUIDObj 无 hex)
|
2026-10-02 21:36:10 +08:00 |
|
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
|
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
|
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
|
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
|
633cc71622
|
feat(gerp): 「其它」说明字段统一按 visibleWhen 条件显示
以 EMPLOYEE_PROFILE_OTHER_FIELDS 登记表替代原先写死的一条,覆盖志愿工作与他人关系两处;选项值直接取自对应单选字段的选项表,两种「其它/其他」写法都算命中。
|
2026-10-01 19:53:54 +08:00 |
|
TermiNexus
|
2af519a4cc
|
feat(gerp): 其它志愿工作改为条件显示字段
EmployeeProfile.VolunteerWorkOther 增加 visibleWhen(仅当 VolunteerWork = 其它 时显示),前端统一按该规则判定。
|
2026-10-01 19:51:22 +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
|
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
|
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
|
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
|
8c18f6d386
|
feat(gerp): 新增按公司查询已启用应用接口 /API/App/CompanyApps
公司详情页需要展示该公司启用的应用并支持卸载/配置,原 /API/App/ManageCompanies 是反向(按应用查公司安装状态),故补正查接口:AppManager.ListCompanyEnabledApps 按公司列出 InstallStatus=1 的应用,AppCompanyAppsView 按可管理范围校验(super=全部 / tenant=本租户 / company=被授权公司)。
|
2026-09-29 18:50:10 +08:00 |
|
TermiNexus
|
51d6e220ee
|
perf(core): 构建产物静态资源改 72h 强缓存
- _serve_file 识别 Vite 内容 hash 文件名(-<hash>.<ext>,hash 段须含大写或数字)
- hash 产物: public, max-age=259200, immutable(72h,路径随版本变化不影响新版本生效)
- 非 hash 的传统资源保持 1h/24h,index.html 仍 no-cache
|
2026-09-29 11:32:35 +08:00 |
|
TermiNexus
|
24db976efd
|
feat(gerp): 授权审批限定公司/租户/平台管理员,并按其级别收窄数据范围
- 菜单 app-pending 加权限属性 admin:company(迁移 0047):公司管理员 + 租户管理员 + 平台管理员可见
- AppPendingView/AppApproveView 权限放宽到 IsCompanyAdminUser,按管理员级别解析可管辖公司
- ApproveUserApp 增加越权校验;返回值统一为三元组(失败原为 2 元组,视图解包会抛 ValueError)
- CheckAdmin 下发 is_company_admin 供前端判定
|
2026-09-28 18:23:13 +08:00 |
|
TermiNexus
|
5236821c97
|
fix(core): 子域未命中时不再回退站点根 HTML,修复部署空窗期串台
- _resolve_file 原先在专属目录未命中时回退 TempLate/<path>,deploy 删除
index.html 的窗口期内 gerp.gvsds.com 会命中根目录 index.html(www/GVSite)
- 改为:专属目录已落盘时仅放行 assets/ 与 pages/ 共享前缀,其余不回退
- 目录未落盘的别名子域(nav/history)沿用旧回退,避免误伤
|
2026-09-28 18:03:13 +08:00 |
|
TermiNexus
|
cdf843e640
|
refactor(gerp): 清理 dingcalc-finance 清单冗余空 LegacySrc
- 缺失与空串等价(app_manifests 用 \or ''\),删除后与其它清单保持一致
|
2026-09-28 17:53:51 +08:00 |
|
TermiNexus
|
428bea8c74
|
chore(gerp): product_order 补 models.py 说明纯清单应用
- 该应用无自有数据表,复用 gvsdsdk.order,转发层在 form_service.TABLES
- 为「每应用含 models」规约补齐形式一致性
|
2026-09-28 17:53:49 +08:00 |
|
TermiNexus
|
2684490dd0
|
fix(talk): 修正成员搜索的 Manager 调用并把成员判定归一为 bytes
- SearchCompanyUsers 与 _IsCompanyUser 改用 RoleManager.GetCompanyUserUUIDs
(原误用 CompanyManager,该类没有此方法,成员搜索接口 500)
- _IsCompanyUser 统一转 bytes 后再比对(GetCompanyUserUUIDs 返回 UUIDObj 集合,
UUIDObj 与 bytes 的 hash 不同,原写法成员判定恒为 False,导致邀请成员必失败)
- 菜单链接由 pages/talk/index.html 改为 pages/talk.html
(前端 normalizeMenuPath 只去 pages/ 前缀与 .html 后缀,原写法规范化为 /talk/index 会 404)
|
2026-09-28 17:29:15 +08:00 |
|
TermiNexus
|
fbf1bb7d6e
|
refactor(gerp): 应用按子应用目录规约重组,清单外置并拆分路由
- 新增 gvsds/apps/gerp/apps/<appid>/:talk/mailbox/gitea/oa/ehrm/dingcalc_finance/
product_order/shop/store_value/wallet/enterprise,各应用自带 models/manager/views/urls
与 apps.gerp_manifests(JSON 清单,$schema 指向 apps/gerp_manifests.schema.json)
- 删除 app_manifests.py 内联 _LEGACY_MANIFESTS,改为扫描各应用清单文件(未知键/缺必填键即判非法并跳过)
- 路由按应用拆:/API/Mail/、/API/Gitea/、/API/Oa/ 由扁平直挂改为 include 子应用 urls.py
(reverse() 断言 19 个 name 的路径逐字不变)
- AppConfig 移至 gerp_app.py 并改显式点分路径注册,规避 apps/ 目录与 Django <app>.apps 同名冲突
- gerp/models.py 裁剪已搬迁模型(保留 _NewUuidBytes 与平台模型),修复 views/__init__.py 与 oidc.py 导入
- AssetDownloadView:优先按 FileAsset.StoragePath 定位并回退 ./resource 旧布局,修上传成功却下载 404
- 同批落地 Talk 应用后端(app 已迁入 apps/talk,gerp.0046 状态认领迁移)
- 注意:app.ini 被 .gitignore 忽略,INSTALLED_APPS 需在部署环境手工同步 gvsds.apps.gerp.gerp_app.GerpConfig
|
2026-09-26 23:46:00 +08:00 |
|
TermiNexus
|
b1d9758923
|
refactor(form_service): 写路径裸 ORM 收敛进 SDK Manager
- get_tables 表行数改用 SDK CachedTableCount(带 300 秒缓存)
- add_record:用户-角色规则拦截、URD 同步建关联委托 RoleManager
- modify_record:UserRole 查重(排除自身)、URD 同步委托 RoleManager
- delete_record:部门成员计数、batch_positions 5 个分支解析委托 RoleManager
- 净减约 80 行;get_table 三表 sha1 快照与改造前逐字节一致
|
2026-09-15 14:15:11 +08:00 |
|
TermiNexus
|
048001b5de
|
refactor(form_service): get_table 富化块裸 ORM 收敛进 SDK Manager
三处富化逻辑改调 SDK 批量方法:UserRoleWorkgroup/UserRoleDepartment 的 UserRole 反查与人名/角色名映射、UserRoleDepartment 的职务多值聚合、UserRole 的部门/职务虚拟列,分别改用 RoleManager.GetUserRolesByUUIDs / GetRoleNameMap / GetUserRoleDepartmentsForUserRoles、AuthManager.GetUserNames、PositionManager.GetUrdPositionRowsForUrds / GetPositionNameMap、DepartmentManager.GetDepartmentNameMap;员工详情页子表 UserUUID 过滤改用 RoleManager.ListUserRoleUUIDs。get_table 内已无裸 ORM(仅保留基础 model.objects.all())。
新增 _StrKeyMap 适配层:SDK 批量映射统一以 UUID 字节为键(避免 UUIDObj 与 bytes 的 hash 不等陷阱),本模块历史代码以字符串为键,此处显式转换。业务语义(标签列名、逗号聚合、覆盖名 RoleNameCover)完全留在 gvsds 侧。
等价性已用改造前快照校验:UserRole / UserRoleDepartment / UserRoleWorkgroup 三表 get_table 记录 sha1 与改造前逐字节一致(abc1f5820bcb5671 / 6344295216b39cfc / ac03fc8eacfe526a),员工详情页子表按 UserUUID 过滤与非法 UUID 空结果行为不变。
|
2026-09-15 13:34:28 +08:00 |
|
TermiNexus
|
34a7e21c2b
|
refactor(form_service): 删除已下沉 SDK 的 entityPicker 两个方法
删除本地重复实现 _get_entity_picker_fields / _enrich_entity_labels(约 170 行),改由 FormServiceBase 继承:调用点更新为 _GetEntityPickerFields / _EnrichEntityLabels(get_table 的 entityPicker 分支),两处注释同步更名。
行为不变:仍按 ENTITY_PICKER_MAP/UUID_FIELD_ENTITY_MAP 识别字段,仍按 db_column 前缀回填 _label 与 extraFields。
|
2026-09-15 13:31:43 +08:00 |
|
TermiNexus
|
042b9ed989
|
refactor(form_service): get_table 查询链复用 SDK 公共辅助
精确字段过滤(含 UUID/FK 转字节)、关键字模糊过滤、分页参数解析、entityPicker 的 select_related、实例转 PascalCase 字典共 5 段重复实现改调 FormServiceBase 的 ApplyExactFilters/ApplyKeyword/ParsePagination/ApplySelectRelated/BuildRecords,get_table 净减约 60 行。
顺带:去掉 model.objects.all() 外层的 try/except(构造 QuerySet 不会抛错,异常实际发生在求值处,包裹只会掩盖问题);分页控制参数集合补入 pageSize;清理不再使用的 Q 与 _PascalizeRecord import。
|
2026-09-14 19:28:54 +08:00 |
|
TermiNexus
|
605a892a98
|
refactor(gerp): viewsets 方法内公司隔离查询收敛进 SDK Manager
DepartmentViewSet.search / WorkgroupViewSet.search / UserRoleViewSet.search 的「显式 CompanyUUID 强制收窄」与 FileAssetViewSet.get_queryset 的全量取数,分别改走 DepartmentManager / WorkgroupManager / RoleManager / AssetManager。
UserRoleViewSet.search 内的两处函数级 RoleManager import 上提至方法顶部,与新增的 DepartmentManager 合并为一行。
|
2026-09-14 16:01:54 +08:00 |
|
TermiNexus
|
d637c3bfe0
|
refactor(gerp): 清除最后 4 处跨 app 裸 ORM
mail/gitea 管理员列表的 CoreUser 批量取名改走 AuthManager.GetUserNames,同时省掉原先「先占位再回填」的两轮循环;viewsets 用户-角色搜索已与相邻的 RoleManager.GetRoleNameMap 用法对齐,一并统一。
asset.py 的公司归属校验改用 CompanyManager.BelongsToTenant,不再直接持有 Company ORM。
|
2026-09-14 15:46:52 +08:00 |
|
TermiNexus
|
a7c70401c2
|
refactor(gerp): 种子/清理命令裸 ORM 收敛进 SDK Manager
CleanAuditLogs 改用 AuditManager.QueryBefore/PurgeBefore;SeedPositions、SeedPositionCategories 改用 TenantManager.ListAllTenants 与 PositionManager 的 ListPositionCodes/CreatePosition/GetCategoriesForTenant/CreateCategory。
SeedPositionCategories 建通用部门时由「逐个 get 已存在编码」改为一次性取回按 CategoryCode 建索引,减少 N 次查询;顺带移除两处已失效的 import uuid。
|
2026-09-14 15:38:12 +08:00 |
|