chore: 汇总提交(园区资料/内容审核/任务相关)+迁移0019/0021及部署编排调整

This commit is contained in:
Pine
2026-08-27 21:02:47 +08:00
parent 4ef0f81629
commit 89396eb6b0
9 changed files with 149 additions and 14 deletions
+3 -1
View File
@@ -1322,7 +1322,9 @@ async def park_user_update(uid: str, body: ParkUserUpdateBody, db=Depends(_carri
existing = await db.users.get_by_id(uid)
if existing is None or existing.get("park_id") != t["id"]:
raise HTTPException(status_code=403, detail="仅可管理本园区用户")
u = await db.users.update_profile(uid, body.model_dump(exclude_none=True))
# 铁律:账号(username)一旦创建不可再次编辑;此接口仅更新个人资料。
fields = {k: v for k, v in body.model_dump(exclude_none=True).items() if k != "username"}
u = await db.users.update_profile(uid, fields)
return {"ok": True, "user": u}
+48 -4
View File
@@ -143,7 +143,14 @@ def _co(r) -> dict:
"founder": r.founder, "status": r.status, "employees": r.employees, "created_at": r.created_at,
"compute_discount": r.compute_discount, "compute_quota": r.compute_quota,
"compute_quota_used": r.compute_quota_used, "engine_group": r.engine_group,
"owner_user_id": r.owner_user_id}
"owner_user_id": r.owner_user_id,
"legal_person": getattr(r, "legal_person", ""), "legal_phone": getattr(r, "legal_phone", ""),
"registered_capital": getattr(r, "registered_capital", ""), "company_type": getattr(r, "company_type", ""),
"honors": getattr(r, "honors", ""), "address": getattr(r, "address", ""),
"contact_phone": getattr(r, "contact_phone", ""), "founded_at": getattr(r, "founded_at", ""),
"emp_total": getattr(r, "emp_total", None), "emp_grad": getattr(r, "emp_grad", None),
"emp_layoff": getattr(r, "emp_layoff", None), "emp_veteran": getattr(r, "emp_veteran", None),
"emp_migrant": getattr(r, "emp_migrant", None)}
def _kb(r) -> dict:
@@ -303,11 +310,25 @@ async def list_companies(tenant_id: str) -> list[dict]:
return out
_COMPANY_FIELDS = ("name", "zone", "room", "industry", "bio", "founder", "status", "employees",
"owner_user_id", "legal_person", "legal_phone", "registered_capital", "company_type",
"honors", "address", "contact_phone", "founded_at",
"emp_total", "emp_grad", "emp_layoff", "emp_veteran", "emp_migrant")
async def create_company(tenant_id: str, payload: dict) -> dict:
row = ParkCompany(id=_new_id("PC"), tenant_id=tenant_id, name=payload.get("name", ""),
zone=payload.get("zone", ""), room=payload.get("room", ""), industry=payload.get("industry", ""),
bio=payload.get("bio", ""), founder=payload.get("founder", ""),
status=payload.get("status", "applying"), employees=payload.get("employees"), created_at=_now())
status=payload.get("status", "applying"), employees=payload.get("employees"),
legal_person=payload.get("legal_person", ""), legal_phone=payload.get("legal_phone", ""),
registered_capital=payload.get("registered_capital", ""), company_type=payload.get("company_type", ""),
honors=payload.get("honors", ""), address=payload.get("address", ""),
contact_phone=payload.get("contact_phone", ""), founded_at=payload.get("founded_at", ""),
emp_total=payload.get("emp_total"), emp_grad=payload.get("emp_grad"),
emp_layoff=payload.get("emp_layoff"), emp_veteran=payload.get("emp_veteran"),
emp_migrant=payload.get("emp_migrant"), owner_user_id=payload.get("owner_user_id", ""),
created_at=_now())
async with _get_session() as s:
s.add(row)
await s.commit()
@@ -316,7 +337,7 @@ async def create_company(tenant_id: str, payload: dict) -> dict:
async def update_company(tenant_id: str, cid: str, payload: dict) -> dict | None:
fields = {k: v for k, v in payload.items() if v is not None and k in ("name", "zone", "room", "industry", "bio", "founder", "status", "employees", "owner_user_id")}
fields = {k: v for k, v in payload.items() if v is not None and k in _COMPANY_FIELDS}
if not fields:
return None
async with _get_session() as s:
@@ -331,6 +352,20 @@ async def update_company(tenant_id: str, cid: str, payload: dict) -> dict | None
return _co(row)
async def set_company_owner(company_id: str, user_id: str) -> dict | None:
"""设置企业负责人:该用户须为企业成员(park_company_id 命中)。"""
async with _get_session() as s:
u = await s.get(User, user_id)
c = await s.get(ParkCompany, company_id)
if u is None or c is None:
return None
if u.park_company_id != company_id:
return {"ok": False, "reason": "该用户不隶属此企业,无法设为负责人"}
c.owner_user_id = user_id
await s.commit()
return {"ok": True, "company_id": company_id, "owner_user_id": user_id}
async def delete_company(tenant_id: str, cid: str) -> bool:
async with _get_session() as s:
r = await s.execute(delete(ParkCompany).where(ParkCompany.id == cid, ParkCompany.tenant_id == tenant_id))
@@ -361,18 +396,27 @@ async def company_members(company_id: str) -> list[dict]:
"id": r.id, "username": r.username, "nickname": r.nickname or "",
"phone": r.phone or "", "role": r.role or "",
"certification_status": r.certification_status or "uncertified",
"company": r.company or "", "gender": r.gender or "", "birthday": r.birthday or "",
"id_card": r.id_card or "", "ethnicity": r.ethnicity or "",
"grad_school_major": r.grad_school_major or "", "grad_time": r.grad_time or "",
"compute_quota": r.compute_quota or 0, "compute_used_quota": r.compute_used_quota or 0,
"created_at": r.created_at or "",
} for r in rows]
async def add_company_member(company_id: str, user_id: str) -> dict | None:
"""把用户归属到该企业(成员)。"""
"""把用户归属到该企业(成员)。
铁律:仅绑定企业成员关系(park_company_id),绝不改动用户所属园区(park_id)。
且仅允许把「已属于本园区」的用户加入本园区企业——跨园区用户须经转园/入驻申请。
"""
async with _get_session() as s:
u = await s.get(User, user_id)
c = await s.get(ParkCompany, company_id)
if u is None or c is None:
return None
if u.park_id != c.tenant_id:
return {"ok": False, "reason": "该用户不属于本园区,变动园区须经转园/入驻申请"}
u.park_company_id = company_id
u.updated_at = _now()
await s.commit()