[FIX] 修正與標準化 B005 廣告下載 API 以相容既有 Android App
All checks were successful
star-cloud-deploy-demo / deploy-demo (push) Successful in 1m7s
All checks were successful
star-cloud-deploy-demo / deploy-demo (push) Successful in 1m7s
1. 修改 MachineController@getAdvertisements 回傳欄位,將 t070v02 改為播放秒數,t070v03 改為位置代碼 (Flag)。 2. 根據 Android App 原始碼分析結果,調整位置對應:3 為待機廣告 (HomeActivity),1 為販賣頁廣告 (FontendActivity)。 3. 在 AdvertisementController@getMachineAds 增加 sort_order 排序,確保後台管理介面視圖與 API 輸出順序一致。 4. 更新廣告下載 API 的技術文件 (SKILL.md),明確標記欄位用途與位置代碼。 5. 在 routes/api.php 補上 B005 與 B009 的路由定義。
This commit is contained in:
@@ -194,4 +194,95 @@ class MachineController extends Controller
|
||||
]
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* B005: Download Machine Advertisements (Synchronous)
|
||||
*/
|
||||
public function getAdvertisements(Request $request)
|
||||
{
|
||||
$machine = $request->get('machine');
|
||||
|
||||
$advertisements = \App\Models\Machine\MachineAdvertisement::where('machine_id', $machine->id)
|
||||
->with(['advertisement' => function ($query) {
|
||||
$query->active();
|
||||
}])
|
||||
->get()
|
||||
->filter(fn($ma) => $ma->advertisement !== null)
|
||||
->map(function ($ma) {
|
||||
// 定義顯示順序權重 (待機 > 購物 > 成功禮)
|
||||
$posWeight = [
|
||||
'standby' => 1,
|
||||
'vending' => 2,
|
||||
'visit_gift' => 3
|
||||
];
|
||||
|
||||
// 為了相容現有機台 App 邏輯:
|
||||
// App 讀取 t070v03 作為位置標籤 (flag):
|
||||
// 1. HomeActivity (待機) 讀取 "3"
|
||||
// 2. FontendActivity (販賣頁) 讀取 "1"
|
||||
$posIdMap = [
|
||||
'standby' => '3',
|
||||
'vending' => '1',
|
||||
'visit_gift' => '2'
|
||||
];
|
||||
|
||||
return [
|
||||
't070v01' => $ma->advertisement->name,
|
||||
't070v02' => (string) ($ma->advertisement->duration ?? 15), // 秒數改放這裡
|
||||
't070v03' => (string) ($posIdMap[$ma->position] ?? '1'), // 位置數字改放這裡 (App 會讀這欄當 Flag)
|
||||
't070v04' => $ma->advertisement->url,
|
||||
't070v05' => (string) $ma->sort_order,
|
||||
'raw_pos_weight' => $posWeight[$ma->position] ?? 99,
|
||||
'raw_sort' => (int) $ma->sort_order
|
||||
];
|
||||
})
|
||||
->sortBy([
|
||||
['raw_pos_weight', 'asc'],
|
||||
['raw_sort', 'asc']
|
||||
])
|
||||
->values()
|
||||
->map(function($item) {
|
||||
unset($item['raw_pos_weight'], $item['raw_sort']);
|
||||
return $item;
|
||||
});
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'code' => 200,
|
||||
'data' => $advertisements->values()
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* B009: Report Machine Slot List / Supplementary (Synchronous)
|
||||
*/
|
||||
public function reportSlotList(Request $request, \App\Services\Machine\MachineService $machineService)
|
||||
{
|
||||
$machine = $request->get('machine');
|
||||
$payload = $request->all();
|
||||
|
||||
// 映射舊版機台回傳格式 (Map legacy machine format)
|
||||
// t060v00 -> product_id, num -> stock, tid -> slot_no
|
||||
$legacyData = $payload['data'] ?? [];
|
||||
$mappedSlots = array_map(function ($item) {
|
||||
return [
|
||||
'slot_no' => $item['tid'] ?? null,
|
||||
'product_id' => $item['t060v00'] ?? null,
|
||||
'stock' => $item['num'] ?? 0,
|
||||
];
|
||||
}, $legacyData);
|
||||
|
||||
// 過濾無效資料 (Filter invalid entries)
|
||||
$mappedSlots = array_filter($mappedSlots, fn($s) => $s['slot_no'] !== null);
|
||||
|
||||
// 同步處理更新庫存 (直接更新不進隊列)
|
||||
$machineService->syncSlots($machine, $mappedSlots);
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'code' => 200,
|
||||
'message' => 'Slot report synchronized success',
|
||||
'status' => '49'
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user