feat(tasks): 新增任务种子脚本(幂等) —— 21 个多类型丰富演示任务

- scripts/db/seed_tasks.py:按 task_code 幂等插入;四种接单方式(grab/bid/assign/recommend)全覆盖、多分类(经 task_categories 映射 category_id)、多预算/交付时限/人数(限额或独占)/发包方/状态(published 上墙 + claimed/doing/completed/cancelled 对照)。21 条,当前任务总数 30、上墙 25。

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Pine
2026-08-25 20:18:16 +08:00
parent 9d60e0afc6
commit 6b0c3ba134
+164
View File
@@ -0,0 +1,164 @@
# -*- coding: utf-8 -*-
"""任务种子脚本(非运行态,幂等)—— 增加更多更丰富、不同类型的任务演示数据。
用法:uv run python scripts/db/seed_tasks.py
覆盖四种接单方式(grab 抢单 / bid 竞标 / assign 指派 / recommend 推荐)、35 类分类、
多种预算/交付时限/人数(限额或独占)/发包方/状态(含 上墙 published 与 claimed/doing/completed 对照)。
幂等:按 task_code 判断,已存在则跳过(可重复运行,不重复插入)。
"""
from __future__ import annotations
import os
import sqlite3
import sys
from datetime import datetime, timezone
from pathlib import Path
ROOT = Path(__file__).resolve().parent.parent.parent
sys.path.insert(0, str(ROOT))
DB_PATH = ROOT / "serverdata" / "data" / "app.db"
def _now():
return datetime.now(timezone.utc).isoformat()
# 构造任务:category 用分类名(脚本内经 task_categories 映射 id),mode 四种全覆盖
_SEED = [
# ---------- 抢单 grab(多数上墙,扫码即领) ----------
dict(code="TKG-001", title="公司官网首页改版设计(独占)", cat="平面设计", sub="网页设计",
desc="为园区科技企业官网改版首页,含 3 张主视觉与响应式适配,独占一人 7 天交付。",
tags="网页,设计", mode="grab", bmin=1800, bmax=3600, deadline="2026-09-10",
dl=7, hc=1, ex=True, pri=60, status="published", pub="园区运营方"),
dict(code="TKG-002", title="小程序埋点上报开发", cat="移动端开发", sub="小程序开发",
desc="在现有电商小程序增加事件埋点上报,接入后端统计,3 天交付。", tags="开发,埋点",
mode="grab", bmin=1500, bmax=2500, deadline="2026-09-05", dl=3, hc=1, ex=True,
pri=58, status="published", pub="云南某某甲方企业"),
dict(code="TKG-003", title="短视频口播脚本撰写(可多人)", cat="写作和内容", sub="内容写作",
desc="每周 10 条产品短视频口播脚本,支持多人分批接单。", tags="文案,短视频",
mode="grab", bmin=800, bmax=1500, deadline="2026-09-20", dl=14, hc=3, ex=False,
pri=50, status="published", pub="品牌策划公司"),
dict(code="TKG-004", title="公众号推文排版(限2人)", cat="策划", sub="内容排版",
desc="每周 6 篇公众号排版+头图,限 2 人协作。", tags="排版,公众号",
mode="grab", bmin=500, bmax=900, deadline="2026-09-15", dl=10, hc=2, ex=False,
pri=45, status="published", pub="园区运营方"),
dict(code="TKG-005", title="产品 3 秒 AE 片头制作", cat="音视频", sub="视频剪辑",
desc="制作 3 秒品牌片头,含转场与音效,独占接单。", tags="视频,AE",
mode="grab", bmin=1200, bmax=2000, deadline="2026-09-08", dl=5, hc=1, ex=True,
pri=55, status="published", pub="云南某某甲方企业"),
dict(code="TKG-006", title="数据清洗脚本(限5人)", cat="数据服务", sub="数据处理",
desc="清洗 3 万条订单数据并产出报表,支持多人协作接单。", tags="数据,脚本",
mode="grab", bmin=1000, bmax=1800, deadline="2026-10-01", dl=14, hc=5, ex=False,
pri=40, status="published", pub="数据中台"),
dict(code="TKG-007", title="政策 H5 长图设计", cat="平面设计", sub="H5 设计",
desc="将云南创业补贴政策做成 H5 长图,扫码即可接单。", tags="H5,政策",
mode="grab", bmin=600, bmax=1200, deadline="2026-09-12", dl=4, hc=0, ex=False,
pri=48, status="published", pub="园区运营方"),
dict(code="TKG-008", title="产品使用说明书排版(已接)", cat="策划", sub="排版",
desc="20 页产品说明书排版,已接单,做单中。", tags="说明书,排版",
mode="grab", bmin=900, bmax=1500, deadline="2026-09-30", dl=12, hc=1, ex=True,
pri=30, status="claimed", pub="硬件厂商"),
# ---------- 竞标 bid ----------
dict(code="TKB-001", title="跨境 ERP 系统开发", cat="软件开发", sub="管理系统",
desc="开发进销存+订单一体化 ERP,支持多语言,投标竞标。", tags="开发,ERP",
mode="bid", bmin=40000, bmax=90000, deadline="2026-11-30", dl=60, hc=1, ex=False,
pri=70, status="published", pub="跨境贸易公司"),
dict(code="TKB-002", title="品牌全案策划(月度)", cat="策划", sub="品牌策略",
desc="含定位、视觉、传播三件套的品牌月度全案,公开竞标。", tags="品牌,策划",
mode="bid", bmin=15000, bmax=30000, deadline="2026-10-20", dl=30, hc=1, ex=False,
pri=62, status="published", pub="品牌咨询机构"),
dict(code="TKB-003", title="工业设计外观打样", cat="工业设计与制造", sub="外观设计",
desc="智能硬件外观设计并打样,竞标选出。", tags="设计,打样",
mode="bid", bmin=12000, bmax=25000, deadline="2026-10-15", dl=40, hc=1, ex=False,
pri=56, status="published", pub="硬件厂商"),
dict(code="TKB-004", title="商标注册顾问服务", cat="知识产权", sub="商标",
desc="商标注册检索+代理,竞标,按件计价。", tags="商标,知产",
mode="bid", bmin=2000, bmax=5000, deadline="2026-09-25", dl=20, hc=2, ex=False,
pri=35, status="published", pub="法律服务所"),
dict(code="TKB-005", title="SaaS 私有化部署", cat="SaaS服务", sub="部署",
desc="将客户 SaaS 环境私有化部署到园区机房,竞标。", tags="部署,SaaS",
mode="bid", bmin=30000, bmax=80000, deadline="2026-12-15", dl=45, hc=1, ex=False,
pri=66, status="published", pub="科技服务商"),
# ---------- 指派 assign ----------
dict(code="TKA-001", title="政务数据看板(指派)", cat="科技服务", sub="数据大屏",
desc="为园区政务侧搭建数据看板,已指派给指定合伙人。", tags="看板,政务",
mode="assign", bmin=8000, bmax=15000, deadline="2026-10-10", dl=25, hc=1, ex=True,
pri=52, status="published", pub="园区运营方"),
dict(code="TKA-002", title="园区三维模型优化(指派)", cat="VR/AR/MR", sub="3D 建模",
desc="优化园区数字孪生大屏的三维资产,指派专人。", tags="3D,孪生",
mode="assign", bmin=6000, bmax=12000, deadline="2026-09-28", dl=18, hc=1, ex=True,
pri=49, status="published", pub="园区运营方"),
dict(code="TKA-003", title="财务报表整理(指派)", cat="工商财税", sub="财务",
desc="整理月度财务流水并出报表,指派给指定财务合伙人。", tags="财务,报表",
mode="assign", bmin=500, bmax=1200, deadline="2026-09-18", dl=7, hc=1, ex=True,
pri=33, status="published", pub="中小企业账务"),
# ---------- 推荐 recommend ----------
dict(code="TKR-001", title="AI 智能客服搭建(推荐)", cat="AI人工智能", sub="智能体",
desc="搭建园区 AI 智能客服,推荐候选人,选定后交付。", tags="AI,客服",
mode="recommend", bmin=10000, bmax=25000, deadline="2026-10-25", dl=35, hc=1, ex=False,
pri=64, status="published", pub="科技服务商"),
dict(code="TKR-002", title="园林绿化方案(推荐)", cat="空间设计服务", sub="景观设计",
desc="园区绿化改造方案,推荐设计合伙人接单。", tags="景观,设计",
mode="recommend", bmin=5000, bmax=12000, deadline="2026-10-08", dl=20, hc=1, ex=False,
pri=46, status="published", pub="园区运营方"),
dict(code="TKR-003", title="直播带货运营(推荐)", cat="直播服务", sub="直播运营",
desc="农产品直播带货月度代运营,推荐主播/运营合伙人。", tags="直播,运营",
mode="recommend", bmin=8000, bmax=18000, deadline="2026-11-10", dl=30, hc=1, ex=False,
pri=50, status="published", pub="农产品企业"),
# ---------- 其它状态对照 ----------
dict(code="TKM-001", title="已完成:Logo 设计", cat="平面设计", sub="Logo",
desc="Logo 设计与规范文档(已完成示例)。", tags="Logo", mode="grab",
bmin=800, bmax=2000, deadline="2026-08-15", dl=8, hc=1, ex=True, pri=5,
status="completed", pub="园区运营方"),
dict(code="TKM-002", title="下架:后端重构", cat="软件开发", sub="后端",
desc="ERP 后端模块重构(已下架示例)。", tags="开发", mode="bid",
bmin=20000, bmax=50000, deadline="2026-10-01", dl=40, hc=1, ex=False, pri=10,
status="cancelled", pub="科技服务商"),
]
def _main() -> None:
if not DB_PATH.exists():
print(f"数据库不存在,请先迁移:python scripts/db/migrate.py -> {DB_PATH}")
return
conn = sqlite3.connect(DB_PATH)
conn.row_factory = sqlite3.Row
now = _now()
cat_map = {r["name"]: r["id"] for r in conn.execute("SELECT id,name FROM task_categories")}
cols = [r[1] for r in conn.execute("PRAGMA table_info(tasks)")]
insert = (
"INSERT INTO tasks (id,task_code,title,category,category_id,sub_category,description,tags,"
"mode,budget_min,budget_max,deadline,delivery_days,headcount,exclusive,display_priority,"
"status,published_at,claimed_at,doing_at,publisher_name,created_at,updated_at) "
"VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
)
added = skipped = 0
for t in _SEED:
code = t["code"]
if conn.execute("SELECT 1 FROM tasks WHERE task_code=?", (code,)).fetchone():
skipped += 1
continue
cat = t["cat"]
cat_id = cat_map.get(cat)
status = t["status"]
published_at = now if status in ("published", "claimed", "doing", "completed") else ""
conn.execute(insert, (
code, code, t["title"], cat, cat_id, t["sub"], t["desc"], t["tags"], t["mode"],
t["bmin"], t["bmax"], t["deadline"], t["dl"], t["hc"], 1 if t["ex"] else 0,
t["pri"], status, published_at, now if status == "claimed" else "",
now if status == "doing" else "", t["pub"], now, now,
))
added += 1
conn.commit()
total = conn.execute("SELECT COUNT(*) FROM tasks").fetchone()[0]
conn.close()
print(f"任务种子:新增 {added} 个(跳过已存在 {skipped} 个),当前任务总数 {total}")
if __name__ == "__main__":
_main()