Fix GpsCheckin

This commit is contained in:
2025-08-29 18:39:20 +09:00
parent 5fff127faf
commit 7593885bbc
3 changed files with 46 additions and 176 deletions

View File

@ -913,182 +913,27 @@ class Checkpoint(models.Model):
return f"CP{self.cp_number} - {self.cp_name} ({self.event.event_code if self.event.event_code else self.event.event_name})"
class GpsCheckin(models.Model):
id = models.AutoField(primary_key=True) # 明示的にidフィールドを追加
zekken = models.CharField(
max_length=20,
null=True,
blank=True,
help_text="ゼッケン番号(実テーブルフィールド名に合わせて修正)"
)
zekken_number = models.TextField(
null=False,
default='',
help_text="ゼッケン番号(後方互換性のため残す)"
)
event_id = models.IntegerField(
null=True,
blank=True,
help_text="イベントID"
)
event_code = models.TextField(
null=False,
default='',
help_text="イベントコード"
)
cp_number = models.IntegerField(
null=True,
blank=True,
help_text="チェックポイント番号"
)
lattitude = models.FloatField(
null=True,
blank=True,
help_text="緯度:写真から取得"
)
longitude = models.FloatField(
null=True,
blank=True,
help_text="経度:写真から取得"
)
image_address = models.TextField(
null=True,
blank=True,
help_text="チェックイン画像のパス"
)
image_receipt = models.TextField(
null=True,
blank=True,
default=False,
help_text="レシート画像のパス"
)
image_qr = models.BooleanField(
default=False,
help_text="QRコードスキャンフラグ"
)
validate_location = models.BooleanField(
default=False,
help_text="位置情報検証フラグ:画像認識で検証した結果"
)
goal_time = models.TextField(
null=True,
blank=True,
help_text="ゴール時刻=ゴール時のみ使用される。画像から時刻を読み取り設定する。"
)
late_point = models.IntegerField(
null=True,
blank=True,
help_text="遅刻ポイント:ゴールの時刻が制限時間を超えた場合、1分につき-50点が加算。"
)
create_at = models.DateTimeField(
null=True,
blank=True,
help_text="作成日時:データの作成日時"
)
create_user = models.TextField(
null=True,
blank=True,
help_text="作成ユーザー"
)
update_at = models.DateTimeField(
null=True,
blank=True,
help_text="更新日時"
)
update_user = models.TextField(
null=True,
blank=True,
help_text="更新ユーザー"
)
buy_flag = models.BooleanField(
default=False,
help_text="購入フラグ協賛店で購入した場合、無条件でTRUEにする。"
)
colabo_company_memo = models.TextField(
null=False,
default='',
help_text="グループコード:複数のイベントで合算する場合に使用する"
)
points = models.IntegerField(
null=True,
blank=True,
help_text="ポイント:このチェックインによる獲得ポイント。通常ポイントと買い物ポイントは分離される。ゴールの場合には減点なども含む。"
)
# MobServer統合フィールド
serial_number = models.IntegerField(
null=True,
blank=True,
help_text="MobServer gps_information.serial_number"
)
team = models.ForeignKey(
'Team',
on_delete=models.CASCADE,
null=True,
blank=True,
help_text="統合チームリレーション"
)
team_name = models.CharField(
max_length=255,
null=True,
blank=True,
help_text="チーム名(実テーブルフィールド)"
)
checkin_time = models.DateTimeField(
null=True,
blank=True,
help_text="チェックイン時刻(実テーブルフィールド)"
)
checkpoint = models.ForeignKey(
'Checkpoint',
on_delete=models.CASCADE,
null=True,
blank=True,
help_text="統合チェックポイントリレーション"
)
minus_photo_flag = models.BooleanField(
default=False,
help_text="MobServer gps_information.minus_photo_flag"
)
# 通過審査管理フィールド
validation_status = models.CharField(
max_length=20,
choices=[
('PENDING', '審査待ち'),
('APPROVED', '承認'),
('REJECTED', '却下'),
('AUTO_APPROVED', '自動承認')
],
default='PENDING',
help_text="通過審査ステータス"
)
validation_comment = models.TextField(
null=True,
blank=True,
help_text="審査コメント・理由"
)
validated_by = models.CharField(
max_length=255,
null=True,
blank=True,
help_text="審査者"
)
validated_at = models.DateTimeField(
null=True,
blank=True,
help_text="審査日時"
)
id = models.AutoField(primary_key=True)
event_code = models.CharField(max_length=255, null=False, default='')
zekken = models.CharField(max_length=20, null=True, blank=True)
serial_number = models.CharField(max_length=20, null=True, blank=True)
cp_number = models.CharField(max_length=20, null=True, blank=True)
lat = models.FloatField(null=True, blank=True)
lng = models.FloatField(null=True, blank=True)
checkin_time = models.DateTimeField(null=True, blank=True)
record_time = models.DateTimeField(null=True, blank=True)
location = models.PointField(srid=4326, null=True, blank=True)
mobserver_id = models.IntegerField(null=True, blank=True)
event_id = models.BigIntegerField(null=True, blank=True)
team_id = models.BigIntegerField(null=True, blank=True)
checkpoint_id = models.BigIntegerField(null=True, blank=True)
class Meta:
db_table = 'rog_gpscheckin' # 実際のテーブル名に合わせて修正
indexes = [
models.Index(fields=['zekken', 'event_code', 'serial_number'], name='idx_zekken_event'),
models.Index(fields=['create_at'], name='idx_create_at'),
]
db_table = 'rog_gpscheckin'
managed = True
def __str__(self):
return f"{self.event_code}-{self.zekken_number}-{self.serial_number}-buy:{self.buy_flag}-valid:{self.validate_location}-point:{self.points}"
return f"GPS Checkin {self.id} - {self.zekken}"
def save(self, *args, **kwargs):
# 作成時・更新時のタイムスタンプを自動設定