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
31d7aa80d2
修复 dispatcher 路由:/api/* 默认走 core_app(去掉 /api 前缀),仅 training 特有端点走 training_app;修复通知/信用/大厅等新端点 404 问题
2026-09-05 12:29:03 +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
22674fbc63
市场目录支持 region 过滤(tags_json LIKE,如 yunnan-opc 专区标记)
2026-09-05 10:50:18 +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
b90ee8aabc
fix(agents): AgentRepository 空串 port 不再被拦截,修复服务端查不到/删不掉智能体
...
require_port 单角色后恒定 port='',但 AgentRepository 用 if not port 把空串当无 port 直接返回空/None,导致 GET /agents 永远为空、GET/DELETE 404 'Agent not found';本地删除依赖服务端先删身份,被 404 卡死后本地也无法删除。改为 if port is None 后空串正常参与查询。
2026-09-04 17:49:00 +08:00
Pine
a3cf1e0cd7
feat(market): 商品封面图 cover_url + 图标/封面上传接口
...
- MarketItem 新增 cover_url 字段(0051 迁移,已应用)
- service.create_item / _row 支持 cover_url
- ItemCreate/UpdateRequest 增加 cover_url;create/update 持久化
- 新增 POST /market/admin/items/upload-image(kind=icon|cover,
OSS market/images/,5MB 限制,返回稳定相对路径)
- 数据库连接切换到新主机 47.108.226.213(.env 已更新)
2026-09-03 21:37:19 +08:00
Pine
fef55e0fbb
feat(market): 市场分类字典 + 商品标识 slug 规范化
...
市场分类字典(admin 端弹窗维护,已运行生效):
- 新增 MarketCategory 模型 + 0050 迁移 + seed
- categories.py 重构为数据库驱动(list/valid/CRUD)
- admin 分类管理端点:增删改/排序/启停;商品列表支持分类筛选
商品标识 slug 规范化(修复云超服市场安装下载链路):
- 新增 _normalize_slug:标识不含 '/' 自动补 pineagents/ 前缀,
避免单段 slug 在 owner/name 拆分时产生 undefined
- admin_create_item:创建时 slug 规范化
- admin_update_item:修复标识首次提交后再次编辑无效
(此前 handler 未把 slug 传给 update_item)
配套:存量单段 slug 数据已批量规范化为 pineagents/<slug>
2026-09-03 20:28:44 +08:00
Pine
3fe6bf6dbc
feat: 登录注入 MQTT 凭证、官方智能体平台化、会话ID扩容、微信支付分账/认证迁移
2026-09-03 12:40:05 +08:00
Pine
6bac6b5c80
fix: RatingRepository 添加 list_for 方法,修复 /me/credit 500 错误
...
/me/credit 接口调用了 db.ratings.list_for(),但 RatingRepository 只有 avg_for 和 create 方法,
导致 AttributeError 返回 500。添加 list_for 方法返回用户收到的评价列表。
2026-09-03 11:16:23 +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
5b229f3de8
refactor: users.role 归一化为默认端口标记
...
1. 创建 normalize_user_roles.py 迁移脚本
2. 8 个旧角色用户(developer/enterprise/investor/provider)归一化为 opc_member
3. account_types.py 注释明确 role 语义:仅用于默认端口和前端展示
4. 权限判断完全依赖 capabilities 叠加制,role 仅作回退安全网
2026-09-03 09:20:24 +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
153b61bec6
fix(market): skill bundle 注入商品中文 display_name;_parse_skill_bundle 优先从 frontmatter 取 name
2026-09-02 15:06:31 +08:00
Pine
1a8cd4a3ee
fix(market): 技能包名称解析——优先从 SKILL.md frontmatter 取 name,修复根目录 zip 名称变成 SKILL.md 的 bug
2026-09-02 14:50:19 +08:00
Pine
581ef33112
fix(market): bundle_json 字段 MySQL 已 ALTER 为 MEDIUMTEXT(skill 内嵌 SKILL.md 可能超 64KB)
2026-09-02 14:44:03 +08:00
Pine
a689fbdf7f
fix(market): 详情接口浏览量+1,下载接口下载量+1(bump_stats 此前定义未调用)
2026-09-02 14:41:33 +08:00
Pine
5db03936f9
feat(pay): 支付支持代付——任意登录用户均可为订单支付,余额到账订单创建者
...
移除所有支付相关接口的订单归属校验和 opc_member 角色限制:
【算力充值 pay/service.py + pay/routers.py】
- build_pay_params: 移除 order.user_id != user.id 归属校验
- recharge_pay_params: require_roles(opc_member) → get_current_user(任意登录用户)
- recharge_status: 移除归属校验,角色放宽为任意登录用户
【市场购买 market/service.py + market/routers.py】
- build_pay_params: 移除归属校验
- query_status: 移除归属校验
- market_pay_params / market_order_status: 角色放宽为任意登录用户
【到账逻辑不变】
- process_paid_order 按订单 engine_user_id(订单创建者)加款
- 支付者 B 的 openid 仅用于 JSAPI 下单,不影响到账目标
- 审计日志 user_id 记录订单创建者
场景:A 用户 web 端创建充值订单 → B 用户小程序扫码 → B 登录并支付 → 余额到账 A 用户
2026-09-02 12:13:21 +08:00
Pine
86c6d24b17
fix(pay): 所有支付小程序码 page 路径修正为 pages-extra 子包路径
...
统一修正3处支付相关小程序码的 page 参数(之前误写为主包 pages/ 路径,
扫码后微信找不到页面→白屏):
- app/pay/service.py: 算力充值支付 → pages-extra/pay/index
- app/market/service.py: 市场购买支付 → pages-extra/pay/index
- app/training/main.py: 活动报名支付 → pages-extra/pay-qr/index
加上之前修复的 scan-login(auth.py + wechat.py 默认参数),
后端所有 get_wxacode 调用的 page 路径现已全部正确。
2026-09-02 11:47:34 +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
541c60e64f
feat(test): 测评逐题答案存储与详情展示
...
- alembic 0043: tests 表增加 answers 列(TEXT,JSON 格式逐题答案)
- report_test(POST /api/tests): 接收并存储 answers 字段
- get_test: 返回 answers + answer_list(带题目文本/part/选项/用户选择的逐题列表)+ 答题进度
- pack_test: 增加 answers 字段
2026-09-02 10:57:26 +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
e346d952c1
fix(training): 驳回报名 status 置 rejected 与审核一致——消除 admin 端「驳回仍显示待审核」
...
- update_booking:审核 rejected → status=rejected(终态),而非 pending
- _count_enrolled:排除 rejected(被驳回不计入已报名人数)
- 仪表盘 stats 补 rejected 分类
- 历史数据:1 条 rejected+pending 已同步为 rejected
- 冒烟测试同步更新
2026-09-02 10:35:48 +08:00
Pine
4d027db5a8
fix(training): 报名审核状态与生命周期状态联动一致——消除 admin 端「状态全是待审核」
...
- create_booking:免费+自动审核活动报名即置 status=confirmed(与 audit_status=approved 一致);人工审核/付费活动保持 pending
- update_booking:审核 approved→status=confirmed;rejected→status=pending;显式 status 不覆盖
- 修正历史数据:approved+pending 的报名已同步为 confirmed(4 条)
- 新增冒烟测试 scripts/smoke_booking_status.py
2026-09-02 10:30:44 +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
052349a496
incubator: 申请时段/时长校验+平台运营方管理兜底
...
- create_reservation 增加开放时段(open_hour_start/end)与单次时长(max_minutes)校验
- resolve_identity 增加 operator 角色管理方兜底(平台运营方可管理本园区)
- 保留 yunpeng(admin_username) 精确绑定为园区载体管理员
2026-09-01 23:16:47 +08:00