| 293 | |
| 294 | |
| 295 | class RoverSign(BaseIDModel, table=True): |
| 296 | __table_args__: Dict[str, Any] = {"extend_existing": True} |
| 297 | uid: str = Field(title="鸣潮UID") |
| 298 | pgr_uid: Optional[str] = Field(default=None, title="战双UID") |
| 299 | game_sign: int = Field(default=0, title="游戏签到(鸣潮)") |
| 300 | pgr_game_sign: int = Field(default=0, title="游戏签到(战双)") |
| 301 | bbs_sign: int = Field(default=0, title="社区签到") |
| 302 | bbs_detail: int = Field(default=0, title="社区浏览") |
| 303 | bbs_like: int = Field(default=0, title="社区点赞") |
| 304 | bbs_share: int = Field(default=0, title="社区分享") |
| 305 | date: str = Field(default=get_today_date(), title="签到日期") |
| 306 | |
| 307 | @classmethod |
| 308 | async def _find_sign_record( |
| 309 | cls: Type[T_RoverSign], |
| 310 | session: AsyncSession, |
| 311 | uid: str, |
| 312 | date: str, |
| 313 | ) -> Optional[T_RoverSign]: |
| 314 | """查找指定UID和日期的签到记录(内部方法)""" |
| 315 | query = select(cls).where(cls.uid == uid).where(cls.date == date) |
| 316 | result = await session.execute(query) |
| 317 | return result.scalars().first() |
| 318 | |
| 319 | @classmethod |
| 320 | @with_lock |
| 321 | @with_session |
| 322 | async def upsert_rover_sign( |
| 323 | cls: Type[T_RoverSign], |
| 324 | session: AsyncSession, |
| 325 | rover_sign_data: RoverSignData, |
| 326 | ) -> Optional[T_RoverSign]: |
| 327 | """ |
| 328 | 插入或更新签到数据 |
| 329 | 返回更新后的记录或新插入的记录 |
| 330 | """ |
| 331 | if not rover_sign_data.uid: |
| 332 | return None |
| 333 | |
| 334 | # 确保日期有值 |
| 335 | rover_sign_data.date = rover_sign_data.date or get_today_date() |
| 336 | |
| 337 | # 查询是否存在记录 |
| 338 | record = await cls._find_sign_record( |
| 339 | session, rover_sign_data.uid, rover_sign_data.date |
| 340 | ) |
| 341 | |
| 342 | if record: |
| 343 | # 更新已有记录 |
| 344 | for field in [ |
| 345 | "game_sign", |
| 346 | "pgr_game_sign", |
| 347 | "bbs_sign", |
| 348 | "bbs_detail", |
| 349 | "bbs_like", |
| 350 | "bbs_share", |
| 351 | ]: |
| 352 | value = getattr(rover_sign_data, field) |
nothing calls this directly
no test coverage detected