POST /api/projects/create 发布企划。projects.status 默认为 open,color_mode 是单选字符串,prod_format 是数组,right_template_id 关联权利模板树。status=open 的企划;close、私密或归档的企划不进入公开发现流。pending,同一 artist 存在 pending 或 user_chosen 应征时不能重复应征同一个 project。requested_list 返回公开、隐藏、已选等筛选数据和数量,并带 artist/user 展示信息。POST /api/project_requests/choose 以 project_request_id 为准创建 work task。第一次选择会把应征状态从 pending 改为 user_chosen;之后仍保持 user_chosen。同一个 project 或同一个 project request 可以创建多个 active work task。remuneration 只作为本次新建 work task 的最终成交价;不传时使用 project_requests.budget。work task 币种固定使用 project_requests.currency_id,也就是 artist 应征时选择的收款币种。auto_accept=true,选择后 work task 直接进入 wait_pay;否则进入 pending,由 artist 调用 work task accept/reject。artist 拒绝某个 work task 只影响该 work task,不会把 project_requests.status 回退为 pending。close 后,公开列表不再展示,并阻止新的应征;已有 project request 和 work task 继续保留原有流程状态。| 对象 | 字段 | 说明 |
|---|---|---|
projects | status | project 开关状态,当前使用 open / close。close 不进入公开列表,也不允许新的应征。 |
projects | color_mode | 单选字符串,不是数组。前端 pages/u 当前按 string 处理。 |
projects | prod_format | 制作格式,多选数组。 |
projects | right_template_id | 关联 right template;详情需要返回 right template tree 供前端展示。 |
project_requests | status | 应征状态,核心状态包括 pending、user_chosen、artist_canceled。被选中后保持 user_chosen,不会因某个 work task 被 artist 拒绝而回退。 |
project_requests | budget | artist 应征时提交的原始报价。user choose 时传入 remuneration 也不会覆盖它。 |
project_requests | currency_id | artist 应征时选择的收款币种。project 来源 work task 必须使用该币种。 |
project_requests | visibility | 应征展示可见性,用于公开、隐藏、选中筛选和数量统计。 |
project_requests | auto_accept | 为 true 时 user choose 后 work task 直接进入 wait_pay;否则进入 pending 等 artist 确认。 |
project_requests | day_start / day_end / days_need | artist 应征的工期范围和展示工期。 |
work_tasks | busable_type / busable_id | project 来源 work task 的业务对象为 project。 |
work_tasks | reqable_type / reqable_id | project 来源 work task 的请求对象为 project request。 |
work_tasks | price | 当前 work task 的最终成交价,来自 remuneration 或 project_requests.budget。 |
work_tasks | currency_id | 当前 work task 的收款币种,来自 project_requests.currency_id。 |
work_tasks | busable_snap / reqable_snap | work task 创建时的 project 和 project request 快照,用于后续列表、详情、评价稳定展示。 |
| 通知 meta | project_id / project_request_id | project request 相关通知都需要携带这两个字段;存在 work task 时同时携带 work_task_id。 |
POST /api/content/projects/list
keyword、category_ids、art_style_ids、user_cname、price_currency_id、price_from、price_to、order_by。feature/project_add_right_template 的返回结构,列表项会返回 right_template,并在 right_template.right_tree 中展开权益树;内部 pivot 字段 right_pivots、rights 不返回。status=open 的 project,status=close 的 project 不进入公开列表。GET /api/content/projects/filters
categories 和 art_styles。GET /api/content/projects/info
status=open 的公开 project;status=close 会按不存在处理。project_requests 不返回 visibility=hidden_all 的应征;新增 hidden_project_requests_count 统计完全隐藏的应征数量。visibility=hidden_offer 的应征仍会返回,由前端隐藏报价和周期。requested_artist_ids,用于前端判断当前画师是否已经应征。该字段包含公开可见应征画师;如果当前登录画师有 hidden_all 应征,也会包含当前画师自己的 artist_id,但不会泄露其他隐身画师。user 新增 commissioned_work_tasks_count,用于展示 user 下单数量;应征画师 project_requests[].artist 新增 completed_work_tasks_count,用于展示画师完稿数量。project_requests[].artist 补充 languages,包含语言基础信息和 pivot.fluency。POST /api/projects/list
right_template.right_tree,结构与 content/projects/list 一致。project_requests_count、chosen_project_requests_count、created_commissions_count。project_requests 应征预览,包含应征画师 artist.avatar,用于用户中心 project 列表展示头像。chosen_project_requests 和 work_tasks 预览,用于展示选定画师和已达成约稿。POST /api/project_requests/choose
remuneration。传入时只作为本次新建 work task 的 price 和阶段金额计算基础,不覆盖 project_requests.budget。remuneration 时,使用 artist 应征时提交的 project_requests.budget 创建 work task。currency_id 固定使用 project_requests.currency_id,也就是 artist 应征时选择的收款币种。project_snap,并把 project 快照写入 work_tasks.busable_snap,把 project request 快照写入 work_tasks.reqable_snap。auto_accept=true,新建 work task 状态直接为 wait_pay;否则仍为 pending。POST /api/project_requests/requested_list
artist 补充 languages;应征对象可返回 day_start、day_end、revision、visibility、auto_accept。artist 补充 completed_work_tasks_count,用于 user project 详情页展示应征画师完稿数量。filter 参数,支持 all / public / hidden / selected。order_by 参数,支持 latest / lower_price / artist_commission。counts,返回 all、public、hidden、selected 四类数量。POST /api/project_requests/choosed_list
artist 补充 languages;应征对象可返回 day_start、day_end、revision、visibility、auto_accept。artist 补充 completed_work_tasks_count,用于 user project 详情页展示已选画师完稿数量。POST /api/projects/update_status
status 切换为 open 或 close。POST /api/work_tasks/list
reqable 会加载 project_snap、currency、artworks.uploadImage、artworks.uploadVideo。GET /api/work_tasks/info
reqable 会加载 project_snap、currency、artworks.uploadImage、artworks.uploadVideo。POST /api/artist_center/project_request/create
day_start、day_end、revision、visibility、auto_accept;artworks 最多支持 6 个。is_anonymous 仍可作为入参兼容,但已废弃;新前端应改用 visibility。days_need。如果未传 days_need,后端会根据 day_start 与 day_end 计算 days_need。POST /api/artist_center/project_request/update
status=pending 的应征。currency_id、detail、artworks、budget、days_need、day_start、day_end、revision、visibility、is_anonymous、auto_accept。POST /api/artist_center/project_request/cancel
status=pending 的应征;撤回后状态为 artist_canceled。POST /api/artist_center/project_request/list
day_start、day_end、revision、visibility、auto_accept,并加载应征作品的图片/视频信息。user,字段口径与 content project 详情中的发布人一致,包含 avatar、language、languages、commissioned_work_tasks_count、rating_score、rec_reviews_count。work_tasks,包含 currency、work_task_stages、paying_order。POST /api/artist_center/project_request/list_by_chosen
day_start、day_end、revision、visibility、auto_accept,并加载应征作品的图片/视频信息。user,字段口径与 content project 详情中的发布人一致,包含 avatar、language、languages、commissioned_work_tasks_count、rating_score、rec_reviews_count。work_tasks,包含 currency、work_task_stages、paying_order。POST /api/artist_center/work_tasks/list
reqable 会加载 project_snap、currency、artworks.uploadImage、artworks.uploadVideo。GET /api/artist_center/work_tasks/info
reqable 会加载 project_snap、currency、artworks.uploadImage、artworks.uploadVideo。POST /api/artist_center/work_tasks/accept
pending work task 后,work task 进入 wait_pay;通知 meta 包含 project_id、project_request_id、work_task_id。POST /api/artist_center/work_tasks/reject
pending work task 时,只把当前 work task 标记为拒绝,不再把 project_requests.status 回退为 pending;通知 meta 包含 project_id、project_request_id、work_task_id。POST /api/artist_center/user_rec_reviews/create_work_task_review
type 仅支持 service、project;project 来源 work task 的评价会关联 project_snap。POST /api/content/projects/list| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
page | number | 否 | 页码,默认 1 |
size | number | 否 | 每页数量,默认 15,最大 50 |
keyword | string | 否 | 搜索 project name、content、发布者 name/cname |
category_ids | number[] | 否 | 分类 id 列表 |
art_style_ids | number[] | 否 | 画风 id 列表 |
user_cname | string | 否 | 发布者 cname 或 id |
price_currency_id | number | 否 | 价格筛选使用的币种 id |
price_from | number | 否 | 最低价格 |
price_to | number | 否 | 最高价格 |
order_by | string | 否 | latest / deadline / most_applicants / highest_budget |
422:参数校验失败。
right_template:project 绑定的权益模板。right_template.right_tree:按权益层级展开的树,每个节点包含该模板中的 state。right_template.right_pivots / right_template.rights:内部关系字段,不在响应中返回。GET /api/content/projects/filters无。
无新增,沿用原有错误语义。
GET /api/content/projects/infoproject_requests;公开但隐藏报价的应征仍返回。| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
id | number | 是 | project id |
404:project 不存在或不是公开 project。
status=close 的 project 也会返回 404。
POST /api/projects/list| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
page | number | 否 | 页码,默认 1 |
size | number | 否 | 每页数量,默认 15,最大 50 |
is_archived | boolean | 否 | 是否归档 |
sort_by | string | 否 | id / created_at / updated_at |
sort_order | string | 否 | desc / asc |
| 字段 | 说明 |
|---|---|
right_template.right_tree | 绑定权益模板的权益树 |
project_requests_count | 非 artist_canceled 应征数量 |
chosen_project_requests_count | status=user_chosen 的应征数量 |
created_commissions_count | 当前 project 已创建的 work task 数量 |
project_requests | 应征预览,包含 artist.avatar,用于列表头像 |
chosen_project_requests | 已选中应征预览 |
work_tasks | 已达成约稿预览,包含 currency、artist.avatar、paying_order |
POST /api/project_requests/chooseremuneration;创建 project snap;根据 auto_accept 决定 work task 初始状态。remuneration 只影响本次新建 work task 的 price 和阶段金额;不会覆盖 project_requests.budget。不传时使用 project_requests.budget。currency_id 固定使用 project_requests.currency_id,前端不需要也不应该按 user 币种换算。| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
project_request_id | number | 是 | project request id |
deadline | string | 是 | work task 截止时间 |
remuneration | number | 否 | 本次 work task 的最终成交稿酬;不传则使用应征原始 budget |
name | object / string | 否 | work task 名称,多语言格式同现有 setTransByReq 约定 |
remuneration,后端会写入:
work_tasks.price = remunerationwork_task_stages.amount 按 remuneration 分阶段计算remuneration,后端使用 project_requests.budget 创建 work task。project_requests.budget;该字段始终表示 artist 应征时提交的原始报价。work_tasks.currency_id 使用 project_requests.currency_id。project_requests.status 从 pending 更新为 user_chosen;重复创建 work task 时保持 user_chosen。project_snaps 记录:
snap_type = "project_request"snap_id = project_request_iddata 保存 project 快照,并包含应征时的 artworks 快照work_tasks.busable_snap 保存 project 快照。work_tasks.reqable_snap 保存 project request 快照。auto_accept=true,新 work task 状态为 wait_pay;否则为 pending。404:应征不存在或不属于当前用户。
422:参数校验失败。
POST /api/project_requests/requested_list| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
project_id | number | 是 | project id |
page | number | 否 | 页码,默认 1 |
size | number | 否 | 每页数量,默认 15,最大 50 |
filter | string | 否 | all / public / hidden / selected,默认 all |
order_by | string | 否 | latest / lower_price / artist_commission,默认 latest |
| 字段 | 说明 |
|---|---|
counts.all | 非 artist_canceled 应征总数 |
counts.public | visibility=public 或旧数据 visibility=null 的数量 |
counts.hidden | visibility=hidden_offer/hidden_all 的数量 |
counts.selected | status=user_chosen 的数量 |
data[].artist.completed_work_tasks_count | 画师已完成 work task 数量 |
data[].artist.languages[].pivot.fluency | 画师语言熟练度 |
data[].work_tasks | 该应征已关联的 work task |
order_by | 说明 |
|---|---|
latest | 按应征 id 倒序 |
lower_price | 按 budget 从低到高 |
artist_commission | 按画师已完成 work task 数量从高到低 |
POST /api/work_tasks/listreqable 会返回 project_snap。无新增,沿用原有错误语义。
POST /api/projects/update_statusclose 后该 project 不再进入 POST /api/content/projects/list,公开 GET /api/content/projects/info 也会按不存在处理。| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
id | number | 是 | project id,只能操作当前用户自己的 project |
status | string | 是 | open / close |
403:project 不属于当前用户。
422:status 不是 open / close。
GET /api/work_tasks/infoPOST /api/work_tasks/list 一致,project 来源 work task 的 reqable 会加载 project_snap。无新增,沿用原有错误语义。
POST /api/artist_center/project_request/create| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
project_id | number | 是 | project id |
currency_id | number | 是 | 应征报价币种 id |
detail | object / string | 是 | 应征附言,多语言格式同现有 setTransByReq 约定 |
artworks | number[] | 是 | 应征作品 id,最多 6 个 |
budget | number | 是 | artist 期望稿酬 |
days_need | number | 否 | 预计工期。旧字段,仍兼容 |
day_start | string | 否 | 预计开始时间 |
day_end | string | 否 | 预计结束时间,不能早于 day_start |
revision | string | 否 | 修改次数或修改策略 |
visibility | string | 否 | 应征可见性:public / hidden_offer / hidden_all,默认 public |
is_anonymous | string | 否 | 已废弃兼容字段,仅兼容 hidden_offer / hidden_all;新前端不要继续使用 |
auto_accept | boolean | 否 | 发布者选定时是否自动接受,默认 false |
days_need 和 day_start/day_end 至少提供一组。days_need 时,后端按 day_start 到 day_end 的天数计算并写入 days_need。visibility=public 表示公开应征。visibility=hidden_offer 表示公开应征卡片,但隐藏报价和周期。visibility=hidden_all 表示完全隐藏应征,不出现在公开详情 project_requests 中。400:不能应征自己的 project,或已存在 active 应征。
422:参数校验失败,或未提供 days_need / day_start + day_end。
POST /api/artist_center/project_request/updatestatus=pending 的应征。| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
id | number | 是 | project request id |
currency_id | number | 否 | 报价币种 id |
detail | object / string | 否 | 应征附言 |
artworks | number[] | 否 | 应征作品 id,最多 6 个;传入时全量替换 |
budget | number | 否 | 期望稿酬 |
days_need | number | 否 | 预计工期 |
day_start | string | 否 | 预计开始时间 |
day_end | string | 否 | 预计结束时间,不能早于 day_start |
revision | string | 否 | 修改次数或修改策略 |
visibility | string | 否 | public / hidden_offer / hidden_all |
is_anonymous | string | 否 | 已废弃兼容字段 |
auto_accept | boolean | 否 | 发布者选定时是否自动接受 |
400:应征不是 pending,不能编辑。
POST /api/artist_center/project_request/cancelstatus=pending 的应征,撤回后状态为 artist_canceled。| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
id | number | 是 | project request id |
400:应征不是 pending,不能撤回。
POST /api/artist_center/work_tasks/listreqable 会返回 project_snap。与 user 侧 POST /api/work_tasks/list 的 project 来源 work task 返回结构一致。
无新增,沿用原有错误语义。
GET /api/artist_center/work_tasks/inforeqable 会返回 project_snap。无新增,沿用原有错误语义。
POST /api/artist_center/user_rec_reviews/create_work_task_reviewtype 只接受真实业务类型 service / project;project 来源 work task 会关联 project_snap。| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
work_task_id | number | 是 | work task id |
type | string | 是 | service / project,必须与 work task 的 busable_type 一致 |
rating_score | number | 是 | 评分,0 到 5 |
rating_content | object / string | 是 | 评价内容 |
400:type 与 work task 业务类型不一致。
visibility| 值 | 含义 | 公开详情是否返回 |
|---|---|---|
public | 公开应征 | 是 |
hidden_offer | 公开应征卡片,但隐藏报价和周期 | 是 |
hidden_all | 完全隐藏应征 | 否,仅计入 hidden_project_requests_count |
is_anonymous 是废弃兼容字段:旧客户端传 hidden_offer / hidden_all 时,后端会写入同名 visibility 值;响应中暂时保留 is_anonymous 作为别名,visibility=public 时该别名为 null。
remunerationremuneration 表示本次创建 work task 的最终成交稿酬。它是 work task 级字段,不是 project request 级字段。
写入链路:
remuneration 不会写回 project_requests.budget。project_requests.budget 始终保持 artist 应征时提交的原始报价。
如果不传 remuneration,后端使用 project_requests.budget 作为新 work task 的 price。
币种固定使用 project_requests.currency_id,即 artist 应征时选择的收款币种。
ProjectSnap /project_snapsproject_snaps 是数据库表,用于保存 project 相关业务快照。ProjectSnap 是 Laravel Eloquent 模型,对应 project_snaps 表。project_snap 是 morphMap 类型名,会写入 bizable_type 等多态字段。project 应征被选定时会创建或更新一条快照:
| 字段 | 说明 |
|---|---|
snap_type | 固定为 project_request |
snap_id | 对应 project_requests.id |
data | project 快照,并包含应征当时选择的 artworks 快照 |
注意:project_snap 按 project request 维护;如果需要某个 work task 创建时的独立快照,应读取 work_tasks.busable_snap / work_tasks.reqable_snap。
| 字段 | 返回位置 | 统计口径 |
|---|---|---|
completed_work_tasks_count | project_requests[].artist、requested_list.data[].artist、choosed_list.data[].artist | 该画师 status=finished 的 work task 数量 |
commissioned_work_tasks_count | content/projects/info.data.user、artist_center/project_request/list.data[].user、artist_center/project_request/list_by_chosen.data[].user | 该 user 非取消、非拒绝 work task 数量 |
project_requests_count | projects/list.data[] | 当前 project 非 artist_canceled 应征数量 |
chosen_project_requests_count | projects/list.data[] | 当前 project status=user_chosen 应征数量 |
created_commissions_count | projects/list.data[] | 当前 project 已创建 work task 数量 |
| 字段 | 返回位置 | 说明 |
|---|---|---|
languages | project_requests[].artist、requested_list.data[].artist、choosed_list.data[].artist | 画师语言列表 |
languages[].pivot.fluency | 同上 | 语言熟练度:native / fluent / Intermediate |
| 值 | 含义 | 公开列表 | 公开详情 |
|---|---|---|---|
open | 开启,应征中或公开展示中 | 返回 | 返回 |
close | 关闭,不再公开展示 | 不返回 | 404 |
POST /api/artist_center/project_request/create 仍兼容旧字段 days_need。day_start、day_end、revision、auto_accept、visibility。is_anonymous 已废弃,不再作为数据表字段保存;新前端不要继续按 boolean 或主字段使用它。hidden_offer 与 hidden_all 的展示语义不同,前端不能再只按 boolean 判断。POST /api/project_requests/choose 不传 remuneration 时使用应征原 budget;传入 remuneration 也只影响新建 work task,不覆盖应征原 budget。