バグ #111
未完了配布済と取得者一覧の不一致について
0%
説明
本日の配布済の枚数と、取得者一覧の枚数が一致しない原因事態はわかりました
チケットログテーブルに、同じチケットIDのログが2つ作成されていたことが原因となっておりました
問題のログは、8651,8652のログになります
このチケットIDのログが
おそらくは、チケット受取、と、チケット送付で、作成されたように見受けられます
しかしながら、チケット送付バッチテーブルには、8651,8652がありませんでした。
取得者一覧は、
1.ticketsテーブルから、チケットボックスIDのレコードを取得
2.ticket_logsテーブルから、取得したチケットIDのデータを取得
3.accountsテーブル、agreementsテーブルから取得者を取得
といった流れで表示しています
チケットログテーブルには、同じチケットIDのログが複数ありました
select id, action_type, loggable_id, loggable_type, ticket_id, actionable_id, actionable_type, buy_history_id, ticket_boxes_id, ticket_pickup_date, created_at, updated_at from ticket_logs where ticket_id in (8651, 8652, 8653, 8654, 8655, 8656, 8657, 8658, 8659, 8660, 8661, 8662, 8663, 8664, 8665, 8666, 8667, 8668, 8669, 8670)
上記のログのうち、受け取り時のログは、IDが2625,2626のログなのですが、同じチケットIDのログである2627,2653のログも取得してしまい、不一致を起こしておりました
そこでなのですが、今回チケットログに、loggable_typeがAccount、actionable_typeもAccountのデータが作成された経緯が分かっておりません
チケット送付を行うと、確かに、そうようなログになるのですが、送付バッチのテーブルであるticket_send_reservationsには、チケットID、8651,8652のデータはありませんでした
もし、チケットログに、_Account、Accountで作成する処理がお分かりになれば、ご教授下さい
よろしくお願い致します
なお、チケット送付の予約(バッチ処理テーブルに登録、チケットテーブルのステータスは99にして置き、他で使用されないようにガード)後に、
同じチケットボックスからの受け取では、ちゃんと、予約したチケットをさけて、受け取りをしていることは確認しております
しかしながら、チケットログテーブルから見ると、
同じチケットを、受け取りもし、送付もしたように見えており、発生した事象の解析には至っておりません
こちらで、試験した所、
チケット受取 -> チケット送付
チケット送付 -> チケット受取
どちらの順番で行っても、同じチケットを使用ようなことはなく、同じ事象発生が出来ておりません
ファイル
安治 博之 さんが3ヶ月前に更新
- ステータス を 新規 から 解決 に変更
チケット受取処理のチケット選択処理に不具合があったためと判明しましたので、クローズさせて頂きます
-- 間違ったあったSQL
-- 問題の部分が、AND NOT (tickets.ticketable_type = 'Account' AND tickets.ticketable_id = 2)
-- tickets.ticketable_idは、チケットボックスから複数枚受け取れるようにした際、既に受け取ったチケットを除外する為に追記した部分でしたが
-- ここがあるが為に、他の人が受け取ったチケットを対象にしてしまった、
-- tickets.ticketable_type = 'Account'を含めた条件をNOTだった為
-- ローカル環境だと、偽装ログインが1つだけだった、また、AWS環境の場合、実端末(スマフォ)を1台で試験したいたから、気づかなった
-- 複数端末でも試験が出来ていなかった
SELECT
tickets.*
FROM
tickets
WHERE
tickets.ticket_boxes_id = 226
AND tickets.status = 0
AND (expire >= '2025-03-04 15:00:00')
AND NOT (tickets.ticketable_type = 'Account' AND tickets.ticketable_id = 2)
LIMIT
1
-- 修正するSQL
-- 新規発行したチケットは、Companyなので、Not= の条件よりも、=で検索し、一致する条件を限定にする
SELECT
`tickets`.*
FROM
`tickets`
WHERE
`tickets`.`ticket_boxes_id` = 226
AND `tickets`.`status` = 0
AND (expire >= '2025-03-04 15:00:00')
AND (`tickets`.`ticketable_type` = 'Company')
LIMIT
1