Commit Graph

107 Commits

Author SHA1 Message Date
Pine 1e9c4343d3 算力中心新增消耗明细和趋势统计接口
- compute_client.py 新增 user_logs 方法,封装引擎日志接口(支持分页)
- rbac_opc.py 新增两个接口:
  - GET /opc/compute/usage/logs - 消耗明细(分页,统一字段格式为前端期望的 snake_case)
  - GET /opc/compute/usage/trend - 消耗趋势统计(近N天趋势、模型分布、时段分布)
- 趋势接口基于引擎日志数据聚合计算:
  - 近N天消耗趋势(按日期聚合 cost 和 tokens)
  - 模型分布(按模型名聚合调用次数,Top 5 + 其他)
  - 时段分布(按24小时聚合消耗)
- 引擎对接失败时返回空数据,不报错(避免前端白屏)
- 模型分布自动分配颜色,便于前端饼图展示
2026-09-05 23:33:24 +08:00
Pine 2cb93b7751 修复:服务市场接口全线snake_case转camelCase,修复服务方信息加载
- 添加_to_camel通用转换函数,将所有snake_case字段转为camelCase
- 服务列表接口:添加LEFT JOIN talent_profiles,组装talent对象(userId/displayName/avatar/headline/bio)
- 服务详情接口:添加contentHtml字段转换,组装talent对象
- myServices接口:返回完整字段(category/description/contentHtml/paymentMethods等),支持编辑功能
- 修复前端无法正确读取opcName/publisherType/salesCount等camelCase字段的问题
2026-09-05 17:30:04 +08:00
Pine 7cfc0163e0 修复:服务详情接口浏览量自增异步任务导致SQLAlchemy会话状态冲突
- 根本原因:使用asyncio.create_task在后台执行db.commit(),主请求结束时调用db.close()导致会话状态冲突
- 错误:Method 'close()' can't be called here; method 'commit()' is already in progress
- 修复:改为同步执行浏览量自增和浏览历史记录,避免异步任务与会话生命周期冲突
2026-09-05 16:45:09 +08:00
Pine 9f1370dfe6 服务大厅电商化改造:数据库迁移+后端19个接口
- 迁移0062:opc_services扩展16列+service_orders扩展18列+新增3张表(评价/收藏/浏览)
- 新路由 rbac_service_market.py:服务CRUD/上下架/收藏/评价/订单全生命周期/支付,共19个接口
- 服务分类8个:技术开发/设计创意/营销推广/咨询服务/教育培训/生活服务/媒体内容/其他
- 双轨制支付:官方服务微信支付平台担保,个人服务支付方式徽章线下支付
- 订单状态机:待支付→待接单→服务中→待确认→已完成,含取消/退款分支
2026-09-05 15:46:46 +08:00
Pine 0fd1307d57 全线加入Redis缓存:1)统一Redis配置支持PINEAGENTS_REDIS_*前缀;2)增强cache.py:JSON序列化/缓存装饰器/批量删除/分布式锁/全局单例+连接池;3)大厅任务列表缓存8秒(key含用户ID+筛选条件);4)大厅总览缓存30秒;5)人才/服务/岗位列表缓存20秒;6)用户档案_actor_profile缓存30秒(can_accept核心依赖);7)认证类型列表缓存5分钟;8)应用启动时连接Redis,失败自动降级无缓存 2026-09-05 14:33:38 +08:00
Pine 166b0440c7 优化大厅任务列表性能:修复 N+1 查询问题。can_accept 支持传入预取的 actor_profile 参数;hall_tasks 预取一次用户档案后用 asyncio.gather 并发判断所有任务资格,避免每个任务都重复查询用户档案(23任务×4查询=92次串行查询→1次查询+并发判断)。tasks接口从4.5s降到0.8s 2026-09-05 14:14:22 +08:00
Pine 9b1df88bf0 任务资格要求:最低信用分/要求勋章/要求认证(0061),can_accept 校验,发布端点接收 2026-09-05 11:33:37 +08:00
Pine e131bba599 任务流程按模式适配:新增 assigned(指派/邀约待确认)/signed(签约托管) 状态 + accept-invite/sign 端点 + 按模式时间线 + 超时释放 2026-09-05 11:18:18 +08:00
Pine 6d0385ef88 task claim 表单承载:0058 迁移修复(TEXT 去 server_default) + register/grab 申请表单落库 + claims 返回 form 2026-09-05 11:08:55 +08:00
Pine 3061ceb2d8 实时通知体系后端:NotificationService 三通道(落库+MQTT+SSE)、迁移0057、通知接口增强(分页/分类/单条已读/未读计数/公告)、SSE /notify/events 鉴权流,事件接入任务/接单/认证/信用/培训/服务/点赞/评论/运营审核 2026-09-05 10:37:14 +08:00
Pine 1a614cb409 任务完整详情:detail 放开终态权限、聚合时间线/交付/验收/发票/参与方 2026-09-05 09:25:04 +08:00
Pine c12380cf8c 任务系统 v2/v3:状态机统一、v2 发布字段、接单/交付/验收/返工/结算/发票全链路 2026-09-05 03:40:58 +08:00
Pine e4d8534155 信用体系与徽章体系完整实现:L1-L8等级+无上限累加积分+26事件规则+26徽章引擎+全量重算+用户/运营端接口 2026-09-05 03:05:56 +08:00
Pine 035c4aec11 feat(提示词): 新增来访者信息获取能力说明 2026-09-05 02:47:18 +08:00
Pine e1459cda12 fix(审核): 审核列表返回真实HTML内容+支持全部状态筛选
- list_all() 替代 list_pending(), 支持 ?status= 过滤
- 审核列表对 html 模式调用 _load_html_content() 从 OSS 加载真实源码
- 修复 page_type 不一致数据(embed_url有值但page_type=html)
- admin端预览直接用返回的htmlContent生成Blob URL, 不再fetch /oss/
2026-09-05 02:30:29 +08:00
Pine 754a28eded fix(提示词): 个人主页是公开展示页, 移除所有编辑/保存/提交功能
- 明确页面定位: 面向其他用户的公开展示页, 非编辑页
- 移除浏览/编辑双模式、保存数据、提交审核等内容
- 强调只允许只读公开数据 + 展示类动作(沟通/分享/复制/跳转)
- 强调平台已注入固定页眉, 禁止重复绘制
- 清空数据库中旧的自定义提示词, 默认生效
2026-09-05 02:26:04 +08:00
Pine 051f7a1aed feat(个人主页): 审核日志全链路+驳回原因必填
- 新增 user_page_review_logs 表(迁移0054): 记录submit/approve/reject
- submit接口自动写日志(用户提交)
- review接口: 驳回必须填写原因; 通过/驳回均写日志(操作人+备注)
- 新增 GET /pages/admin/{user_id}/logs 审核日志查询
2026-09-05 01:42:13 +08:00
Pine 5e6571cfa4 feat(个人主页): 开发提示词存数据库, 支持管理员编辑
- GET /pages/dev-prompt: 优先读 system_configs.user_page_dev_prompt, 无则返回内置默认
- PUT /pages/admin/dev-prompt: 管理员更新提示词写入数据库
- 提示词包含完整开发规范: 沙箱约束/postMessage数据桥/动作调用/设计风格/审核要求
2026-09-05 00:46:59 +08:00
Pine 1ec34c0a5c feat(个人主页): 审核流程+OSS存储+能力数据公开+URL模式强制无能力
- 迁移0053: html_url/review_status/review_note/submitted_at/reviewed_at
- HTML保存时上传OSS,数据库存html_url;URL模式只存embed_url
- URL(embed)模式强制capabilities为空(第三方网页无法接入平台能力)
- HTML模式选择能力后警告:必须真实接入,否则下架+永久关闭功能
- 上架流程: 保存草稿→提交审核→审核通过→上架;修改已上架内容自动下架
- GET /pages/{user_id} 根据capabilities返回公开的能力数据(订单/证书)
- postMessage桥注入capabilityData给HTML
- 运营端审核接口: /pages/admin/review/list + /pages/admin/{user_id}/review
- OSS新增download方法
2026-09-04 23:51:47 +08:00
Pine fbad02d823 feat(pages): 个人主页未自定义时返回平台默认名片 — 人才档案+已上架服务+头像直链解析 2026-09-04 22:05:16 +08:00
Pine 279341dd51 feat(pages): 新增OPC个人主页(user_pages)后端 — 自写HTML/第三方嵌入、能力接入声明、徽章规则、公开渲染接口 2026-09-04 21:51:33 +08:00
Pine 3fe6bf6dbc feat: 登录注入 MQTT 凭证、官方智能体平台化、会话ID扩容、微信支付分账/认证迁移 2026-09-03 12:40:05 +08:00
Pine ab52d4013d fix: 修复接口错误 - _loads未定义+重新注册ecosystem路由
1. repositories.py: 添加 _loads 函数定义(之前从 hall_repositories 隐式依赖导致 NameError)
   - 修复 /cert/types 返回 500 错误
2. main.py: 重新注册 rbac_ecosystem 路由(通知/信用/任务/合同/争议等基础功能)
   - 修复 /me/credit 返回 404 错误
3. rbac_ecosystem.py: 将已移除的 service 角色统一替换为 opc_member
   - _ANY 元组移除 service
   - 所有 require_roles 中的 service 替换为 opc_member
2026-09-03 11:05:37 +08:00
Pine cb1492f2d6 fix: 完整审查修复 - 5个问题
1. _resolve_identity: permissions_for 未归一化 role → 使用 account_type+permission_role
2. rbac_org.py: 用 user.role 判断 operator → 改用 capabilities
3. membership_service: sync_user_affiliation 不同步 organization_members → 新增 _sync_org_members
4. repositories.to_profile: capabilities 只查旧表 → 增加 organization_members 查询
5. Header.RoleBadge: account_type_label 被 t() 重复翻译 → 优先直接显示中文
2026-09-03 09:43:34 +08:00
Pine d851b54755 refactor: 角色组织模型重构 - 阶段二完成
1. 运行迁移脚本:同步 2 条园区管理员 + 1 条企业管理员到 organization_members
2. 新增 get_user_organizations / get_user_primary_org 辅助函数
3. 改造各路由优先从 organization_members 查询组织:
   - rbac_org.py: /org/me 返回所有绑定组织
   - rbac_portals.py: referrals 和 carrier_park 优先用 organization_members
   - rbac_hall.py: 发布岗位优先用 organization_members 获取企业
4. users.org_id 保留作回退,不删除字段,风险可控
2026-09-03 09:18:28 +08:00
Pine 97f3c1956c refactor: 角色组织账号模型重构 - 阶段二(保守)
1. 创建数据迁移脚本 migrate_members_to_org.py
   - ParkMember.admin 同步到 organization_members (type=carrier)
   - CompanyMember.is_admin 同步到 organization_members (type=enterprise)
   - 自动创建缺失的 organization 记录,幂等
2. 修改 _compute_capabilities,优先查 organization_members
   - carrier 能力:org_members.role=admin + org.type=carrier
   - enterprise 能力:org_members.role=admin + org.type=enterprise
   - 旧表 park_members/company_members 保留兼容
3. 不删除旧表,不修改表结构,风险可控
2026-09-03 00:39:41 +08:00
Pine 6bb988cc3e refactor: 角色组织账号模型重构 - 阶段一
1. capabilities 写入 JWT,避免每次请求查库
2. 移除 service 账号类型,非 operator/carrier 统一归为 opc_member
3. 前端统一基于 capabilities 判断权限
4. 清理登录接口死代码,恢复账号密码登录
5. 移除 enterprise/provider/government/investor/developer 角色
6. 清理 seed.py 中多余角色和权限定义
7. 重写 rbac_portals.py 只保留 carrier 路由
2026-09-03 00:35:40 +08:00
Pine 8dc48ac072 fix(hall): /tasks/mine 和 /jobs/mine 移至参数化路由之前注册,避免被 {task_id}/{job_id} 抢先匹配返回任务不存在 2026-09-02 18:58:23 +08:00
Pine 0f4a951c38 feat(admin): 调研/政策详情匹配题目定义返回 answer_list;新增 5 模块汇总统计 API + 调研题目定义 API 2026-09-02 17:20:45 +08:00
Pine e67636f6d3 fix(auth): 小程序码 page 路径修正为 pages-extra/scan-login/index
scan-login 页面在 subPackages(root=pages-extra) 中,完整路径应为
pages-extra/scan-login/index,之前误写为 pages/scan-login/index,
导致微信扫码后找不到页面→白屏。

修改3处:
- /auth/mp-qr/start
- /auth/mp-qr/bind-start
- wechat.get_wxacode 默认参数
2026-09-02 11:13:13 +08:00
Pine cae96824ec fix(auth): mp-qr失败时返回详细错误信息,便于排查小程序码生成失败
- /auth/mp-qr/start 和 /auth/mp-qr/bind-start 在 get_wxacode 失败时
  返回 error 字段,包含具体失败原因(缺少 WECHAT_APPID/SECRET 或微信API调用失败)
- 之前只返回 mp_enabled:false + qr_url,前端无法区分是配置问题还是API问题
2026-09-02 11:03:53 +08:00
Pine 751e8ae02f feat(admin): 测评/报名/调研/政策/流程 五模块统一补齐详情与删除接口
- training_admin_bridge: pack_test 增加 username;新增 get_test/delete_test、get_booking/delete_booking、get_survey/delete_survey、get_policy/delete_policy、get_plan/delete_plan
- rbac_operator: 新增 10 个接口(5 模块 × GET详情 + DELETE删除),删除写 audit_log
- 详情接口返回完整字段(含 JSON 解析后的 answers/tracks/topics)
2026-09-02 10:49:45 +08:00
Pine 700bafdb26 feat(invite): 完整邀请归因系统
数据模型:
- User表添加inviter_id/invite_code/invited_at/invite_share_count字段
- 新建invite_records表记录分享/扫码/注册归因
- MySQL迁移已执行

后端API(/invite/*):
- GET /invite/me 获取我的邀请码和统计
- GET /invite/qrcode 生成带邀请参数的小程序码(体验版/正式版)
- POST /invite/share 记录分享行为
- POST /invite/scan 记录扫码行为(无需登录)
- GET /invite/invitees 获取我邀请的用户列表

登录归因:
- wx_login支持inviter参数,新用户自动绑定邀请人
- 用户列表返回inviter_name和invite_count

服务层:
- invite_service.py:邀请码生成、归因绑定、小程序码生成、统计
2026-09-02 02:18:41 +08:00
Pine 04624ab477 feat(dm): 站内会话 + 我发布的任务/岗位(0041)
- 0041 迁移:dm_messages 点对点私信表(会话按双方聚合,read_at 未读标记)
- DmRepository:send/conversations(聚合末条+未读数)/thread/mark_read
- /dm/conversations、/dm/messages(GET 记录+已读、POST 发送,禁自发、校验接收人存在)
- /hall/tasks/mine(发布者视角,附接单/报名/投标计数)、/hall/jobs/mine(附投递计数)
2026-09-01 20:19:04 +08:00
Pine 496c006ba0 feat(task): 载体端任务流通——平台级任务下发载体端+可下架/上架(不可编辑)+大屏联动
- 新增 task_park_visibility 表(task_id+park_id+visible,唯一约束),alembic 0038 迁移
- TaskParkVisibilityRepository:get/set(幂等 upsert)/hidden_ids
- rbac_portals 新增载体端任务管理:GET /carrier/tasks(平台级任务+本载体下架状态)、POST /carrier/tasks/{id}/hide|unhide(不可编辑,无 update 端点)
- 大屏 /park/api/tasks 过滤升级:本园专属 ∪ 平台级任务(受载体下架控制)
- seed:u_car_01 幂等绑定默认园区 T001
2026-09-01 14:44:14 +08:00
Pine 61c572a19a feat(task,sms): 任务功能增量合并到大厅 + 短信生态配置
- 任务统一合并到 /hall:新增 grab/grab-by-code/bid/doing/complete/deliver/recommend 操作端点(走 TaskService 真实逻辑)
- 删除 rbac_opc 全部旧任务端点(广场/详情/grab/bid/doing/complete/assign/recommend/select/deliver),/opc/tasks 返回 404
- /opc/my-tasks 改真实聚合(task_claims 承接 + bids 投标,附任务信息),不再读 opc_tasks 演示表
- dashboard_service.opc_dashboard 改 task_claims 统计
- 删除 opc_tasks 演示表(models/seed/repositories)
- BidRepository 新增 list_by_opc
- 短信生态(上一轮):sms.py 阿里云签名、seed 7 项配置、send-code scene、rbac_hall 预约/订单短信
2026-09-01 11:22:19 +08:00
Pine 6d0bfae6aa feat(hall): 服务订单状态机 + 发包方任务操作(0036)
- 0036 迁移 + ServiceOrder ORM/仓储(service_orders:预约/下单→接单→交付→完成)
- /hall/services/{id}/order 预约下单(禁下自己的单);/hall/orders/bought|selling 双视角
- /hall/orders/{id}/{action} 六动作流转(accept/reject/start/deliver/complete/cancel),
  服务方/买方/运营三方权限约束 + 状态机非法流转校验
- /hall/tasks/{id}/win|assign|select|cancel:评标定标/指派/报名选定/取消(仅发包方或运营端)
2026-08-31 23:09:27 +08:00
Pine 40c2f75b18 feat(admin): 大厅与社区治理接口(岗位/OPC服务/人才/大厅任务/帖子)
- /admin/hall/jobs* 岗位列表与审核上下架
- /admin/hall/services* OPC 服务审核
- /admin/hall/talents* 人才档案列表与上架下架
- /admin/hall/tasks* 大厅任务审核列表(含 pending)与通过/驳回/下架
- /admin/community/posts* 帖子列表、隐藏/恢复、置顶/取消置顶
- 全部走 operator 角色 + write_audit 审计
2026-08-31 23:05:13 +08:00
Pine 4602c8dac7 feat(hall): 大厅/社区接口 + 任务报名(register)模式
- 新增 rbac_hall.py:/hall/*(overview/任务列表详情/发布任务/报名/接单列表/
  人才列表详情/档案维护/岗位发布详情投递/服务发布列表详情编辑询单)+
  /community/*(Hub/帖子/发帖/点赞/评论/载体列表详情/关注/入驻)
- TaskService.register/register_select:报名即占位状态机(复用 can_accept 资格判定,
  register_quota 限额、去重、选定转 assigned,任务保持 published)
- can_accept 修复 actor 不在 users 表时 full=None 崩溃;写权限按叠加制 capabilities 判定
- 路由挂载 app/main.py(/hall + /community)
2026-08-31 22:20:16 +08:00
Pine 374767bbca chore: 清理废弃 SQLite 代码与过时注释
- 删除死代码 app/db.py / app/repositories.py / app/dependencies.py(legacy 模块,
  import 即损坏且全仓无引用,活跃实现在 app/infrastructure/)
- 删除废弃库文件 serverdata/data/opc.db(2026-08-24 并入总库前的旧分库)
- 注释措辞同步 SQLite→统一总库(DATABASE_URL 决定方言)
2026-08-31 21:46:22 +08:00
Pine dbc29eee59 feat(membership): 成员制归属重构与叠加制身份(多对多成员表+转园两级审核)
- park_members/company_members 多对多成员表(0028),users.affiliation 为派生缓存由 sync_user_affiliation 刷新
- 转园两级审核状态机(0029):pending_from→pending_to→approved,支持用户/企业整体转园与运营端兜底
- 叠加制身份(0030):身份恒为运营/载体/OPC,企业管理员为能力叠加非身份,去除 enterprise/carrier 直写角色
- rbac 新增 memberships/park-transfers/企业管理员工作台 /admin/ent/* 接口

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-31 20:36:26 +08:00
Pine bb3559bd51 feat(pay): 微信支付子应用与活动定价报名(event_orders/EV_ 前缀/支付后自动确认)
- app/pay 域新增活动订单模型与事件服务,复用充值支付链路(JSAPI+回调验签+幂等+15 分钟过期+对账补单)
- 0027: bookings 加 pay_status/order_no,events 加 price_fen(0=免费)
- 运营端桥透传活动定价字段

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-31 20:36:16 +08:00
Pine 7493383f6a feat(users): 建号规则收紧与手机号绑定
- 管理端/园区端创建用户:账号系统随机生成不可指定,手机号必填且全局唯一
- 管理端用户管理支持绑定/更换手机号(PATCH /admin/users/{id}/phone)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-30 22:29:44 +08:00
Pine e44fea96ca feat(compute): /v1中继鉴权重写与平台用户余额视图
- relay 鉴权重写:JWT→引擎 PAT 逐用户归属,拒绝匿名调用,余额<=0 预检 403
- compute_client 增 list_engine_users/get_engine_user/sync_user_mirror 等
- 运营端新增 /admin/compute/platform-users 平台用户视图(引擎真实余额/折扣/用量)与充值镜像回写

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-30 22:29:44 +08:00
Pine 9c4908fb87 feat(auth): 停用账密登录 + 扫码会话有效期下发 + 叠加制身份模型
- /auth/login 全端口停用(403 引导手机号/小程序扫码登录)
- 扫码会话接口下发 expires_in(前端二维码倒计时)
- role_allowed 叠加制身份:所有账号自带 OPC 基础身份,operator/carrier 仅业务叠加,35 处 C 端端点统一放行
2026-08-28 17:17:58 +08:00
Pine 4f11931143 feat(content): 资讯发布时间/来源/发布人规范 + 点赞/留言/分享互动体系
- published_at 发布时间(迁移0022):运营端不限、园区端禁早于3天前,双方均支持定时发布;C端/大屏到点才可见
- 发布人:运营端可设(留空显示官方)、园区端固定园区名只能填来源
- 点赞/分享/留言(迁移0023-0025):content_likes 去重点赞、like_count/share_count、留言回复+评论点赞
- 各出口(内容/留言/入驻资料 docs)统一 resolve_url 生成 CDN 直链;入库统一 to_object_path 对象路径
2026-08-28 17:17:49 +08:00
Pine 985b85cb4e feat(oss): 统一OSS/CDN对象存储与直链出口体系
- infrastructure/oss.py 重写:服务端上传/预签名上下行/CDN鉴权直链(方式A)/resolve_url·to_object_path 出入口规范
- config.py 新增 OSS_REGION/OSS_CDN_BASE_URL/OSS_CDN_AUTH_KEY
- media_upload 统一走 oss 单例,返回 CDN 直链;dispatcher /oss 前缀路由
- 管理端用户列表头像出口 CDN 化
2026-08-28 17:17:38 +08:00
Pine 89396eb6b0 chore: 汇总提交(园区资料/内容审核/任务相关)+迁移0019/0021及部署编排调整 2026-08-27 21:02:47 +08:00
Pine 4ef0f81629 feat(auth): /auth/me 与登录响应暴露 wxBound/wxMiniBound 绑定状态
- UserProfile schema 增加 wxBound/wxMiniBound(LoginResponse/ProfileResponse 继承)
- to_profile 补 wx_openid/wx_mini_openid 判定,web/admin 正确识别手机号+小程序绑定
2026-08-27 20:26:34 +08:00
Pine b745328d49 feat(tasks): 运营端任务详情/竞标/报名端点 + 园区发布任务端点
- 运营端 /admin/tasks/{id} 详情、/{id}/bids、/{id}/claims、/{id}/bids/{bid_id}/win 开标定标(余标置lost+进 in_progress)
- 园区端 POST /park/api/park/tasks 发布任务(publisher_role=park/park_id=本园/发布即上架/默认公有)
2026-08-27 20:19:40 +08:00