Commit Graph

174 Commits

Author SHA1 Message Date
Pine f441614f47 fix: 政策详情接口添加content_html字段映射
详情接口返回的正文字段是body,前端期望content_html。
在_resolve_content_media后添加content_html = body映射,确保前端能正确渲染正文。
2026-09-13 23:43:28 +08:00
Pine 1a9e669145 fix: 修复企业↔个人算力互转500错误
根因: rbac_compute_pricing.py 中函数内导入路径错误
  from ..infrastructure.models import User as _User
会解析为 app/api/infrastructure/models,实际应为
  from ...infrastructure.models import User as _User
解析为 app/infrastructure/models

修复: transfer_to_personal 和 transfer_from_personal 两处函数内导入
2026-09-13 23:39:39 +08:00
Pine e3bed34a3a refactor: 身份切换改为纯前端状态,不重新签发JWT
JWT始终包含所有身份的叠加能力(capabilities),权限判断基于所有能力。
移除/auth/select-identity接口,身份切换仅在前端状态中管理。
2026-09-13 23:33:36 +08:00
Pine 407a8fcda4 feat: 多身份切换功能 + 政策详情公开访问修复
1. 政策详情修复: 政策(type=policy)属于公开内容,详情接口不再要求is_public=True
   - 之前错误地加了public_only=True过滤,已撤销
   - 详情接口对政策类型绕过is_public检查

2. 多身份切换功能:
   - 新增_compute_identities函数,动态计算用户所有可用身份
     - operator: 平台运营方
     - carrier:<park_id>: 园区管理员(每个园区一个)
     - enterprise:<company_id>: 企业管理员(每个企业一个)
     - opc_member: 个人用户(始终存在)
   - 登录接口返回identities列表
   - 新增/auth/select-identity接口,切换身份后重新签发JWT
   - 新增SelectIdentityRequest schema
2026-09-13 23:28:36 +08:00
Pine d80550cb36 fix: 政策列表增加public_only过滤,与详情接口保持一致
根因: 政策列表接口未传public_only=True,返回了is_public=false的政策;
详情接口要求is_public=True,导致点击政策详情返回404'政策不存在或已下架'。

修复: /opc/policy 接口增加public_only=True,并对媒体字段调用_resolve_content_media
2026-09-13 23:16:38 +08:00
Pine b701f8ea95 feat: 补贴资格认证+手动申请转发接口
- compute_client: user_eligibility_status/apply, user_subsidy_apply/calc_preview
- rbac_opc: /opc/compute/subsidy/eligibility/status|apply, /apply, /calc-preview
2026-09-13 20:38:40 +08:00
Pine 2f5fdde7d6 feat: 补贴记录转发接口
- compute_client新增user_subsidy_records(PAT鉴权调用compute端)
- rbac_opc新增GET /opc/compute/subsidy/records路由
2026-09-13 19:40:21 +08:00
Pine 8c30e2c45b feat: 算力补贴体系 - usage_records加成本字段+补贴发放接口
- compute_usage_records加4字段(cost_amount/gross_profit/model_cost_ratio/subsidy_eligible)
- 新增alembic迁移0080
- compute_internal新增subsidy-grant接口(增加用户算力余额)
- deduct_by_engine_cost透传成本/毛利字段并保存
2026-09-13 19:04:16 +08:00
Pine edca0dcfa7 P1/P2 计费体系修复:统一扣费回调+请求前预检+对账接口+折扣同步
P1-1 统一扣费回调:
- 新增 POST /api/compute/internal/deduct(COMPUTE_ADMIN_TOKEN鉴权,engine_log_id幂等)
- compute 扣费后异步回调,按引擎实际费用(微元)扣平台来源账本
- 删除 relay.py 中 _bill_usage/_bill_usage_anthropic 调用(改由compute回调记账)
- ComputeUsageRecord 加 engine_log_id 字段,alembic 0079 迁移

P1-2 请求前预检:
- _user_engine_pat 中查 compute 余额(5s缓存),余额<=0直接403
- 避免无余额请求仍转发到引擎

P2-1 对账接口:
- GET /admin/compute/reconcile 对比引擎used_quota vs 平台累计扣费
- 支持分页、only_mismatch过滤

P2-2 折扣统一:
- 用户级折扣设置/删除时异步同步等效系数到引擎users.discount
- compute /api/user/manage 支持 username 定位用户
- compute_client 新增 set_user_discount_by_username
2026-09-13 17:41:02 +08:00
Pine 0ac392e64a fix: 算力用户自动同步+单价统一+流式多退少补配套(server-core)
- P0-4: 用户注册/登录时自动同步算力引擎账号(ensure_user+PAT+回写provisioned)
- P0-4: 服务启动时异步全量对账补建缺失用户
- P0-2: calculate_compute_price从compute引擎取真实单价(30s缓存),硬编码仅兜底
- compute_catalog新增get_model_price和30s内存缓存
2026-09-13 17:28:57 +08:00
Pine 00ee4b0333 fix(compute): 个人余额转企业以引擎可用额度为权威,修复账本与引擎不一致导致无法转出
根因:个人可用算力有三套口径——引擎 quota(实际可消费)、平台账本
compute_personal_balance(充值/企业转入记录)、充值订单。三者可能不一致
(赠送/历史调整后引擎额度 > 账本),而 from-personal 转账硬校验账本
>= 金额,导致「算力/我的余额显示有余额,但企业管理个人余额 0、无法转企业」。

修复:转账校验与扣减改为引擎可用额度(quota - used_quota,个人实际可消费
的算力)为权威;账本同步扣减、不足扣到 0 不转负(账本仅记录充值/转入部分);
错误信息中文友好(不再外泄引擎异常细节)。
2026-09-13 17:14:44 +08:00
Pine 6d4c592e0e feat(opc): 新增公开模型系列接口 /opc/compute/series(含图标直链)
各端口(web/桌面)渲染系列分组时从数据库读取系列与系列图标,
无需登录;系列图标经 series_to_dict + resolve_url 补全为可访问直链。
2026-09-13 13:36:11 +08:00
Pine b890cd3ed5 fix(compute): 修复删除图标/系列无效——AsyncSession.delete 漏 await
根因:SQLAlchemy 2.0 AsyncSession.delete() 返回 coroutine,必须 await;
漏 await 导致 DELETE SQL 从未执行,commit 提交空事务仍返回 200,
DB 记录原封不动、列表重载后不变(RuntimeWarning 提示但无异常)。
已用内存 SQLite 实测:await 后删除成功(数量归 0)。
2026-09-13 12:57:28 +08:00
Pine 08dcbc8056 fix(compute): 修复 write_audit 调用签名错误(keyword-only)
- 系列/图标 6 处 write_audit 改为 action/resource/resource_id/detail/user/request 关键字风格
- 6 个写端点补充 request: Request 参数(按仓库惯例置于 db 之前)
- 运行时验证:模块 import + write_audit 签名调用 + py_compile 全通过
2026-09-13 12:52:07 +08:00
Pine bbfd8ddab0 fix(compute): 修复图标/系列接口 AsyncSession 未 await 导致的 500
- list_icons/list_series 等 20 处 db.session.execute/get/commit 补 await
- series_to_dict/icon_to_dict 的图标 URL 统一 resolve_url 补全(兼容相对路径)
- 全局核查:其余 execute 均为 sqlite 同步连接,无同类问题
2026-09-13 12:44:14 +08:00
Pine 0ab2c84813 fix(compute): 图标中心 URL 统一 resolve 补全 + 生产库运维脚本
- icon_to_dict/options/create/update 用 resolve_url 补全相对路径
- 新增生产库结构对比/索引修复/建表脚本
2026-09-13 12:23:24 +08:00
Pine a163e661a1 feat(compute): 模型系列管理 + 图标中心(表、迁移、API)
- ComputeSeries/ComputeIcon 模型 + alembic 0078 迁移
- rbac_compute_assets 系列 CRUD 与图标上传/引用计数
- main.py 挂载 compute_assets 路由
2026-09-13 11:14:21 +08:00
Pine 76351cc91a fix(org): 机构/企业成员统一返回格式(补齐姓名、头像)
- _normalize_org_member 统一 user_id/name/username/avatar/role/is_admin
- 机构成员无头像时批量从 users 表补查
2026-09-13 11:14:20 +08:00
Pine 000e3b5cb7 feat(hall): 任务/岗位编辑与审核接口
- 任务编辑(发布者或运营端,非运营编辑后重新进审核)
- 岗位编辑/审核/上下架(运营端 published 上架)
- JobRepository.update 支持字段白名单更新
2026-09-13 11:14:20 +08:00
Pine 5d7d00ae5a fix(compute): /api/opc/compute/base 公开返回中继地址
- 鉴权放开为 optional_current_user,未登录也返回 base_url/relay_path/messages_path/models_path
- 仅登录附 username
2026-09-13 11:14:20 +08:00
Pine 9f6c4fc21f feat(relay): 中继新增 /v1/messages(Anthropic 格式)通道与记账
- 显式 relay_messages 路由,支持 x-api-key 鉴权
- _bill_usage_anthropic 按 Anthropic 用量格式记账
2026-09-13 11:14:20 +08:00
Pine 416ade4842 feat: 统一权限聚合端点 + 事件名同步昵称 + IM/企业路由补强
- 新增 rbac_permissions 统一权限/组织归属聚合端点
- sync_event_name_to_nickname 脚本:事件名同步用户昵称
- im router/client、rbac_enterprise/opc/org/public 增强
- compute_catalog、nginx 配置、env.example 更新
2026-09-11 21:15:36 +08:00
Pine 46b06b28f1 feat: 实现 /agents/directory 企业智能体目录接口,返回可调用智能体列表+在线状态,支持管理员/同企业/临时授权三级权限模型 2026-09-10 13:24:44 +08:00
Pine d49719fcf2 fix(sms): 验证码发送增加本地60s冷却(独立于验证码记录),SmsError(阿里云流控/冷却)转429友好提示;verify错误文案中文化 2026-09-10 12:19:23 +08:00
Pine c9edad2f98 feat(agent-gate): 新增 GET /agents/directory 企业智能体目录接口(成员+可调用智能体,供桌面端选择器/授权页使用) 2026-09-10 10:33:53 +08:00
Pine 23e17560f6 feat(agent-gate): 智能体互通编排层——authorize_call 三层权限(L1管理员/L2同企业/L3临时授权)+MQTT invoke 派发+agent-events 内部接口+agent-grants CRUD+幂等迁移SQL 2026-09-10 01:40:38 +08:00
Pine 91db9d1a70 feat: 微信分享图独立配置 + 默认问卷开关 + 发布方/管理员权限拆分
- 迁移 0074: events/content_items 加 share_img_timeline(朋友圈1:1)/share_img_message(会话5:4)
- 迁移 0075: events 加 show_default_question(默认问卷「最想解决的问题」admin可控)
- 迁移 0076: events 加 publishers_json(发布方手机号绑定,可编辑活动+审核报名)
- 权限拆分: _can_edit_event(发布方+创建者+运营,不含管理员)/ _can_review_booking(发布方+管理员+创建者+运营)
- 审核报名相关端点改用 _can_review_booking;活动编辑用 _can_edit_event
- event_out 输出 canEdit/canReview/publishers;create/update 接收 publishers
- 我管理的活动包含发布方+管理员命中
2026-09-09 21:52:37 +08:00
Pine 722ed8ba85 fix:修复报名码 2026-09-09 15:38:54 +08:00
Pine d5b322dc22 feat:报名 2026-09-09 14:23:26 +08:00
Pine 8276bef63b feat(desktop-updates): 新增 artifacts/signature 接口,支持更新包已上传后仅登记/更换 .sig 签名
- 只传签名场景:校验 minisign 签名后仅更新 artifacts[target].signature,保留既有 url/sha256/size
- 更新包未上传时返回 400 提示先传更新包
2026-09-09 09:17:07 +08:00
Pine 11a9ad0105 fix: 云超服待修复清单 #1/#3 + 园区成员公司列表 + main 修复
- #1 站内消息:新增 GET /opc/messages/unread-count(红点角标)、POST /opc/messages/read(批量/全部已读),MessageRepository 补 unread_count/mark_read
- #3 发布活动 500:events 表补 created_at 列(models.Event + alembic 0072 迁移,旧库需执行 alembic upgrade head)
- rbac_admin 园区成员接口补充所属公司列表 companies(含 is_admin)
- main.py 修复 root() 语法错误,APP_NAME 更新为云南省超级个体服务平台
- 补充 nginx ssl 证书(opc.pinesound.cn)
2026-09-09 04:50:08 +08:00
Pine 5328835dbe 修复个人主页提交审核 422:rbac_pages 缺少 Request 导入
submit_for_review(request: Request) 未导入 Request,注解求值失败被
FastAPI 当作必填 query 参数(loc: query.request)→ 422。补上导入后
request 正确注入,submit 走正常审核流程
2026-09-09 03:33:56 +08:00
Pine e53ac06313 服务重新上架(online)提交审核时通知发布者与运营
- 个人重新上架进入 pending 后,通知发布者「已提交重新上架审核,
  审核通过后自动上架」,同时 notify_roles(operator) 运营收到待审核提醒,
  与发布提交通知一致(此前 online 无任何通知,审核链易断)
2026-09-09 03:16:23 +08:00
Pine f36a2b6059 admin/tasks:所有可空外键/关联字段空串统一转 NULL 防 1452
前端未填 publisher_id 时传空字符串违反 tasks_ibfk_3(publisher_id→users.id)外键,
与 category_id 同类问题。将可空关联字段(publisher_id/publisher_org_id/claimed_by/
assign_park_id/assign_opc_id/park_id/category_id 及可空时间字段)统一清洗为 NULL;
NOT NULL 列(deadline/published_at 等)保留空串原样,避免 1048
2026-09-09 01:51:38 +08:00
Pine 33a896a0f9 admin/tasks:空分类/空截止转 NULL 防外键 500
task_categories 为空时前端传空字符串 category_id 违反 tasks_ibfk_1 外键约束,
create/update 统一将空分类与空截止转 None(列可空),不再 500
2026-09-09 01:37:12 +08:00
Pine ec482bda51 移除未使用的 s2s 实时语音栈及重依赖,大幅加速镜像构建
- 删除 app/park/vendor/s2s-cloud(201 文件)与 s2s_bridge.py
- 清理 app.py/config.py/routers.py/rag.py/tools.py 中 s2s 相关代码与配置
- park_config 智能体提示词配置改名 PARK_AGENT_INSTRUCTIONS(原 S2S_INSTRUCTIONS,仍被园区 AI 问答使用)
- pyproject 移除 torch/transformers/scipy/soundfile/nltk/openai(均仅 s2s 使用,Linux 下 torch CUDA 依赖曾致镜像构建下载 4-6GB、耗时 300s+)
- 重新生成 uv.lock(移除 torch 等 40+ 传递依赖)
- 修复 app/api/schemas/admin.py 缺失 Database import(3.14 延迟注解掩盖的既有 bug,3.12 下启动必崩)
- .python-version 同步为 3.12(与镜像一致)
2026-09-08 22:18:52 +08:00
Pine c151788f7c feat: 园区成员列表返回企业管理员信息 2026-09-08 20:26:28 +08:00
Pine d57a611c54 feat: 桌面更新支持OSS预签名直传与安装包确认登记 2026-09-08 20:26:28 +08:00
Pine 92db5a0802 fix: 运营端改价同步compute服务models表,修复实际计费仍用旧价的问题 2026-09-08 18:17:11 +08:00
Pine b56831eb46 feat(rbac): 生态/OPC/培训 RBAC 路由与市场服务更新 2026-09-08 00:10:33 +08:00
Pine ff234f7071 feat(sms): 迁移 PineSound 阿里云短信+Redis缓存+真实随机数;强制MySQL禁用SQLite;连接池取消请求shield修复 2026-09-08 00:10:16 +08:00
Pine 539282f18f security: 平台中继令牌不对外展示、不允许删除
平台中继令牌由系统自动创建(name='平台中继令牌'),桌面端智能体
调用模型时使用此令牌。为防止用户复制外泄配额或误删导致桌面端
无法调用模型:

1. GET /opc/compute/tokens:过滤掉 name='平台中继令牌' 的令牌,
   不返回给前端展示
2. DELETE /opc/compute/tokens/{id}:删除前校验,若目标令牌是
   平台中继令牌,返回 403 拒绝删除
3. 定义常量 PLATFORM_RELAY_TOKEN_NAME 统一管理
2026-09-08 00:08:27 +08:00
Pine dfeda0c784 feat: URL 名单支持通配 *.gov.cn 与正则 /pattern/ 形态(后端编译校验) 2026-09-07 22:25:23 +08:00
Pine 7cce5cd14a feat: 站点 URL 白名单/黑名单管理 API
- GET/POST /admin/site/url-rules、DELETE /admin/site/url-rules?rule_type&host
- 存储于 site.url_whitelist / site.url_blacklist(SystemConfig,公共 /site/config 可读)
- 域名规范化校验;写审计
2026-09-07 22:19:26 +08:00
Pine 3a1bb75417 fix: 运营方兜底审核园区级认领/入驻(admin 园区详情可用)
- claims/reviews、companies/applies/reviews:运营方可见全部待审园区级申请
- review_claim/review_apply:park_admin 级允许运营方兜底审核
2026-09-07 16:23:43 +08:00
Pine 1cd26e174e feat: 企业认领/企业入驻申请/团队 身份链路
- company_claim_requests:认领园区入驻企业(仅搜索);admin 认领仅当企业无管理员;
  审核人:admin→园区管理员,member→有企业管理员则企业管理员否则园区管理员;
  证明资料(姓名/身份证/手机号)仅存证
- company_apply_requests:已有企业加入平台;park_entered 园区管理员审,
  independent 运营方审;通过后建 ParkCompany 并设提交人为管理员
- teams/team_members:团队即建即用;支持升级为企业(复用企业入驻申请)
- 审核权限:园区管理员=ParkTenant.operator_user_id;企业管理员=is_admin;运营方=operator
- 新表由启动时 create_all 幂等创建
2026-09-07 16:15:35 +08:00
Pine e831fdd34e feat: 内容审核体系(0070)— 违规内容库/举报表/IP采集/统一审核服务/审核API
- 迁移0070:content_moderation_records(违规库,快照+发布者+IP+原因+处置人)、
  content_reports(举报队列);各内容表加 ip 列,dm_messages 加 hidden,
  community_comments/ratings 加 status,users 加 profile_hidden/original_nickname
- moderation_service:hide/restore/delete(物理删除留档)/list/archive/report/
  handle_report/scan + 申诉通知;用户资料隐藏自动脱敏昵称
- rbac_moderation:/admin/moderation/{type} 列表、hide/restore/delete、
  violations 违规库、reports 举报处理、scan 巡查;/content/report 用户举报入口
- IP 采集:任务/岗位/服务/社区帖子/评论/私信/评价/主页提交创建端点写入发布者 IP
- 前台可见性:社区评论/私信查询过滤 hidden
2026-09-07 15:07:43 +08:00
Pine f6e66213bd fix: 保存人才档案即上架;新增独立上架/下架接口
- hall_upsert_talent patch 补 published=True:保存即进入人才大厅(修复保存后仍显示已下架/上架后大厅不展示)
- 新增 PUT /talents/me/publish:published 单独上架/下架(下架后大厅不展示,本人仍可见)
2026-09-07 14:20:06 +08:00
Pine edf87cbe5e feat: 算力令牌名称自定义,留空自动编号
- POST /opc/compute/tokens 接受 name 字段
- name 为空时按该用户名下令牌数自动命名(令牌1/令牌2/…)
2026-09-07 14:08:02 +08:00
Pine 1462ad3c82 feat: 消耗账单加渠道字段(桌面端 / Key·令牌名)
token_name 为空或平台中继令牌 → 桌面端;自建令牌 → Key · 名称
2026-09-07 14:03:04 +08:00