sky121113
2736c382a2
[FIX] 合併取貨碼 status fillable 修復
2026-06-24 16:03:14 +08:00
sky121113
de2f098309
[FIX] 取貨碼無法刪除:status 未列入 fillable 導致取消無效
...
1. PickupCode $fillable 補上 status,原本 destroyPickupCode 的 update(['status'=>'cancelled']) 因 mass-assignment 保護被靜默忽略,導致取貨碼按刪除(取消)後狀態不變、永遠刪不掉(超級管理員亦然)
2. PassCode/WelcomeGift 的 fillable 本就含 status 不受影響,故僅取貨碼有此問題
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-24 16:03:01 +08:00
sky121113
7044d4cefd
[FIX] 合併取貨碼/通行碼/來店禮租戶機台授權修復
2026-06-24 15:40:33 +08:00
sky121113
a65f4cd45c
[FIX] 合併取貨碼/通行碼/來店禮租戶機台授權修復
2026-06-24 15:40:26 +08:00
sky121113
4e9d21d1d6
[FIX] 合併取貨碼/通行碼/來店禮租戶機台授權修復
2026-06-24 15:40:05 +08:00
sky121113
38f5071975
[FIX] 取貨碼/通行碼/來店禮:客戶帳號跨未授權機台導致頁面崩潰與越權
...
1. 列表與操作紀錄查詢加上 whereHas('machine'),依 machine_user 授權過濾,客戶帳號只看得到可存取機台的資料(系統管理員不受影響)
2. pickup_code_logs.machine_id 可為 null,該紀錄查詢改為「machine_id 為 null 或機台可存取」以保留非機台紀錄
3. destroyPickupCode/destroyPassCode/destroyWelcomeGift 加上機台授權守衛,非系統管理員越權刪除回傳 403
4. tab-list blade 將 $x->machine->name 等改為 null-safe,作為縱深防禦
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-24 15:39:41 +08:00
sky121113
6e5307933f
[RELEASE] feat/slot-lock-expiry-bidirectional-sync → main:貨道效期+鎖定 App↔後台雙向同步上線
...
1. 貨道效期/鎖定 App↔後台雙向同步(LWW)
2. 鎖定操作紀錄顯示與多語系補齊
3. 庫存清單與機台概覽顯示貨道鎖定狀態
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-24 14:57:42 +08:00
sky121113
61825e706a
[PROMOTE] feat/slot-lock-expiry-bidirectional-sync → demo:庫存清單與機台概覽顯示貨道鎖定狀態
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-24 14:50:10 +08:00
sky121113
1bd8971310
[FEAT] 庫存清單與機台概覽顯示貨道鎖定狀態
...
1. 庫存與效期管理頁(列表/矩陣/手機卡片)商品旁顯示鎖定徽章,使用者可在清單直接辨識暫停販售貨道
2. 機台庫存概覽頁(格狀/表格/手機卡片)同步顯示鎖定徽章
3. 新增 Sale Paused 語系 key 三語系對齊(暫停販售 / Sale Paused / 販売停止)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-24 14:49:59 +08:00
sky121113
7f4e67129f
[PROMOTE] feat/slot-lock-expiry-bidirectional-sync → demo:貨道鎖定操作紀錄與多語系修正
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-24 14:36:27 +08:00
sky121113
6ce4c2c8ed
[FIX] 貨道鎖定操作紀錄顯示與多語系補齊
...
1. 操作紀錄徽章補上鎖定/解鎖切換顯示,修正僅 is_locked 變動時出現空白「貨道 N:」
2. 補齊鎖定彈窗 4 個語系 key(Sale Status / On Sale / Locked (Sale Paused) / Lock (Pause Sale))三語系對齊
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-24 14:36:20 +08:00
sky121113
3007bfb254
Merge branch 'feat/slot-lock-expiry-bidirectional-sync' into demo
2026-06-24 14:25:51 +08:00
sky121113
af78c48d8e
[FEAT] 貨道效期+鎖定 App↔後台雙向同步(LWW)
...
1. machine_slots 新增 is_locked / last_app_lock_rev / last_app_expiry_rev(migration);MachineSlot model fillable+casts。
2. syncSlots(B009):新增 per-field 常態 LWW(App rev 較大才採用);換商品(product_id 變更)時清空舊 expiry/batch 安全網;空值一律歸一化為 null。
3. updateSlot:下行 update_inventory 一律帶 is_locked + lock_rev + expiry_rev,後台編輯只更新「帶上的欄位」(鎖定切換不會清效期),對應 rev +1 成為權威值。
4. 新增 admin slots/lock endpoint(toggleSlotLock)+ route;remote/stock.blade.php 貨道編輯彈窗加「販售狀態/鎖定·解鎖」toggle。
5. 不含 app_uuid/重灌/B017 概念(精簡版);既有現場鎖定靠 App 端升級遷移(lock_rev=1)走常態 LWW 上雲。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-24 14:25:33 +08:00
twsystem1004
aecb2f17d1
[PROMOTE] dev → demo:領藥單核銷與批價單號掃碼修正晉升驗收
...
1. 領藥單核銷流程:改由出貨 finalize 處理,B660 回傳批價單號(pricing_slip_no)。
2. 領藥單建立頁批價單號欄位攔截 Enter,避免掃碼器掃完 QR 自動送出誤觸建立。
2026-06-24 03:13:24 +00:00
twsystem1004
f8c6da3acc
[FIX] 領藥單建立頁批價單號欄位攔截 Enter
...
1. 批價單號 input 加上 @keydown.enter.prevent,避免掃碼器掃完批價單 QR 後自動送出的 Enter 誤觸「建立並產生 QR」、跳出「請至少勾選一項藥品並填寫數量」提示。
2. 單號仍正常自動帶入,攔截僅作用於此欄位,不影響其他欄位與按鈕送出。
2026-06-24 03:11:19 +00:00
twsystem1004
9a6036d184
[FIX] 領藥單:核銷改由出貨finalize、B660回傳批價單號
...
- handlePickupVerify:移除掃碼驗證當下核銷領藥碼(usage_count++/used),
改由實際出貨 MQTT finalize 核銷;未取貨(逾時/取消)時領藥碼維持 active 可再掃,
修正「掃了未確定取貨、再掃顯示已領」問題。
- B660 回應新增 pricing_slip_no(批價單號),供機台確認領藥畫面備註欄顯示。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-24 03:11:19 +00:00
sky121113
1a1518c611
[FIX] 合併 feat/inventory-mqtt-resend:庫存效期 MQTT 逾時自動解鎖 + timeout 多語系
2026-06-24 09:06:32 +08:00
sky121113
47073f0a96
[RELEASE] feat/inventory-mqtt-resend → main:庫存效期管理 MQTT 下發逾時自動解鎖上線
...
1. slotsAjax 的 is_pending 僅計入 1 分鐘內的 pending reload_stock,逾時自動解鎖,避免機台未回 ACK 時介面永久卡住
2. updateSlot 重新下發時逾時舊指令標記 timeout、否則 superseded,與 dispense 邏輯一致
3. stock.blade.php 遠端指令紀錄補上 timeout 狀態多語系與徽章樣式
2026-06-24 09:06:19 +08:00
sky121113
bec02ac546
[FIX] 合併 timeout 狀態多語系修正至 demo
2026-06-24 09:03:33 +08:00
sky121113
a2faace4bd
[FIX] 遠端指令庫存效期紀錄補上 timeout 狀態多語系與徽章樣式
...
1. stock.blade.php getCommandStatus 補 timeout 對照,避免直接顯示原字串 TIMEOUT
2. getCommandBadgeClass 補 timeout 徽章樣式 (rose,與 failed 一致)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-24 09:03:27 +08:00
sky121113
fcff9a0fc6
[FIX] 合併 feat/inventory-mqtt-resend:庫存效期管理 MQTT 下發逾時自動解鎖
...
1. slotsAjax 的 is_pending 僅計入 1 分鐘內的 pending reload_stock,逾時自動解鎖
2. updateSlot 重新下發時逾時舊指令標記 timeout、否則 superseded
2026-06-24 08:58:20 +08:00
sky121113
3293a76c91
[FIX] 庫存效期管理補上 MQTT 下發逾時自動解鎖
...
1. slotsAjax 的 is_pending 僅計入 1 分鐘內的 pending reload_stock 指令,超過視為逾時自動解鎖,避免機台未回 ACK 時介面永久卡住
2. updateSlot 重新下發時,逾時舊指令標記為 timeout、未逾時標記為 superseded,與 dispense 逾時邏輯一致
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-24 08:57:56 +08:00
sky121113
d1c7940db9
[PROMOTE] feat/expiry-clear-on-sellout → demo:售完清效期測試驗收
...
1. recordDispense 售完(stock=0)即清空貨道 expiry_date 與 batch_no,避免舊批效期殘留誤鎖新批貨
2. 新增 ExpiryClearOnSelloutMysqlTest 驗收測試
3. 同步併入 main 既有提交:每機台商品定價 + 補貨單/機台列表 RWD 修正(fcd0588、c5a3f99)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
# Conflicts:
# app/Services/Transaction/TransactionService.php
2026-06-23 17:24:12 +08:00
sky121113
e0532a539f
[FEAT] 售完即清空貨道效期與批號
...
1. recordDispense 扣庫存後,若 stock 歸 0 則一併清空 expiry_date 與 batch_no,避免舊批效期殘留:日後僅補 stock 未改效期時,update_inventory 不會把過期日下發、誤將新批貨鎖成「暫不販售」,與機台端「賣完清效期」對稱
2. 新增 ExpiryClearOnSelloutMysqlTest 驗證售完清效期行為
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 17:23:02 +08:00
sky121113
94a941e100
[FIX] backport 至 dev:每機台商品定價 + 機台列表 RWD + 多語系對齊
2026-06-23 16:43:46 +08:00
sky121113
fcd0588686
[RELEASE] feat/per-machine-product-pricing → main:每機台商品定價 + 補貨單/機台列表 RWD 修正上線
2026-06-23 16:36:31 +08:00
sky121113
c5a3f99113
[FIX] 每機台定價多語系三語對齊
...
1. en.json、ja.json 補齊定價功能 15 個新 key(原本只有 zh_TW 有)
2. zh_TW.json 依 ksort 重排,三語系 key 集合 100% 對齊(各 2620)
3. 斜線不逸出,JSON_UNESCAPED_SLASHES/UNICODE 格式
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 16:23:29 +08:00
sky121113
f37f41c5c3
[PROMOTE] feat/per-machine-product-pricing → demo:機台列表行動版補上硬體狀態
2026-06-23 16:15:32 +08:00
sky121113
8d951a64e6
[FIX] 機台列表行動版補上硬體狀態,與桌機資料對齊
...
1. 行動/平板卡片 Info Grid 新增「硬體狀態」欄位(原本僅桌機表格有,RWD 漏顯示)
2. 沿用桌機相同邏輯:下位機 hardware_status,啟用刷卡機時顯示 card_terminal_status,燈號配色一致
3. 欄位排於 Status 旁填滿兩欄列,標籤樣式遵循 Mobile Card Info Grid 規範
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 16:15:24 +08:00
sky121113
cfbe16c519
[PROMOTE] feat/per-machine-product-pricing → demo:定價頁麵包屑標籤
2026-06-23 16:07:48 +08:00
sky121113
3c1d5b73ed
[FEAT] 定價頁新增麵包屑標籤
...
1. breadcrumbs.blade.php 機台子頁對照新增 pricing => Machine Pricing,定價頁麵包屑正確顯示
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 16:07:42 +08:00
sky121113
5621cad1bf
[PROMOTE] feat/per-machine-product-pricing → demo:每機台商品定價 (WIP) 上 demo 測試
2026-06-23 15:55:14 +08:00
sky121113
3a793978b4
[REFACTOR] 每機台定價改置於機台主模組(自基本設定移出)
...
1. 路由 /{machine}/pricing、/{machine}/pricing (POST) 由 BasicSettings\MachineSettingController 移至 MachineController
2. pricing / updatePricing 方法搬遷至 Admin\MachineController
3. 視圖由 basic-settings/machines/pricing.blade.php 移至 machines/pricing.blade.php
4. 機台列表頁 index.blade.php 新增定價入口;移除基本設定 tab-machines.blade.php 內的舊入口
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 15:54:16 +08:00
sky121113
1685b858f9
[FEAT] 每機台商品定價 WIP 暫存
...
1. 新增 MachineProductPrice 模型與 machine_product_prices 資料表 migration
2. 機台設定頁新增定價分頁 pricing.blade.php
3. 調整 ProductCatalogService、MachineController、Machine 模型支援每機台價格
4. 補貨單修正前的進度暫存,待後續完成
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 15:38:14 +08:00
sky121113
0da3887aa6
[FIX] backport 至 dev:補貨單歸屬改以機台所綁公司為準
2026-06-23 15:34:22 +08:00
sky121113
8e0a30eb98
[PROMOTE] fix/replenishment-company-by-machine → demo:補貨單歸屬改以機台所綁公司為準
2026-06-23 15:34:14 +08:00
sky121113
db9769b209
[RELEASE] fix/replenishment-company-by-machine → main:補貨單歸屬改以機台所綁公司為準上線
2026-06-23 15:27:50 +08:00
sky121113
62d3242db5
[FIX] 補貨單歸屬改以機台所綁公司為準
...
1. storeReplenishment / autoReplenishment 建單時 company_id 由「建立者」改為「機台的 company_id」
2. 修正系統管理員為他公司機台建單時 company_id 被寫成 null,導致篩選列選公司及租戶帳號登入皆看不到補貨單
3. 新增 migration 依機台回填既有舊單據的 company_id
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 15:27:31 +08:00
sky121113
5a501eb199
[FIX] backport 至 dev:遠端強制重啟 APP 指令
2026-06-23 14:13:56 +08:00
sky121113
9e9ed4bc9e
[RELEASE] fix/remote-dispense → main:遠端強制重啟 APP 指令正式上線
2026-06-23 14:13:20 +08:00
sky121113
ecfbc904a7
[PROMOTE] fix/remote-dispense → demo:遠端強制重啟 APP 指令上 demo 測試
2026-06-23 14:06:07 +08:00
sky121113
871b223440
[FEAT] 遠端控制新增「強制重啟 APP」(reboot_force) 指令
...
1. RemoteController storeCommand 驗證白名單新增 reboot_force
2. ProcessCommandAck 將 reboot_force 納入維護類指令日誌記錄
3. 遠端控制頁新增強制重啟按鈕(琥珀色,提示卡死時使用,無視忙碌狀態)
4. 指令歷史篩選與庫存頁指令名稱對應補上 reboot_force
5. 三語系新增 Machine Force Reboot / command.reboot_force / 忙碌狀態提示,並 ksort 對齊
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 14:05:52 +08:00
sky121113
9856a68d84
[PROMOTE] dev → demo:領藥單 UI 改版、機台報表手機支付標籤、員工卡 hotfix
...
1. [FEAT] 領藥單頁面改套極簡奢華風 UI(對齊取貨碼):x-page-header、Alpine 建立彈窗、x-searchable-select 機台下拉、+/- 數量計數器、桌面表格+手機卡片、取消確認彈窗、luxury 分頁;新增 productsAjax 端點與路由;修正麵包屑顯示「領藥單」層級。
2. [FEAT] 機台報表付款類型對照表新增代碼 10「手機支付」(NFC 手機感應)標籤。
3. [FIX] 員工卡編輯彈窗回填所屬公司並防止 company_id 被洗為 null(backport hotfix 至 dev)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 13:36:13 +08:00
sky121113
f5cb9a8f7d
[FEAT] 領藥單頁面改套極簡奢華風 UI(對齊取貨碼)並修正麵包屑
...
1. 重寫 pharmacy-pickup/index.blade.php:改用 x-page-header、Alpine 建立彈窗、x-searchable-select 機台下拉、每項藥品 +/- 數量計數器、桌面表格+手機卡片、x-confirm-modal 取消確認、luxury 分頁,全面對齊取貨碼 UI。
2. PharmacyPickupController 新增 productsAjax():依機台 AJAX 回傳可領藥品清單(對齊取貨碼 slots-ajax 模式),並維持取物單模式+領藥開關雙閘驗證。
3. routes/web.php 新增 pharmacy-pickup/{machine}/products-ajax 路由(受 menu.sales.pharmacy-pickup 權限控管)。
4. breadcrumbs.blade.php 補上 pharmacy-pickup 對照,修正麵包屑斷層,正確顯示「領藥單」層級。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 13:33:44 +08:00
sky121113
eb5b75cf78
[FEAT] 機台報表付款類型新增「手機支付」標籤
...
1. AnalysisController::machineReports 付款類型對照表新增代碼 10 = Mobile Pay(NFC 手機感應)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 13:33:31 +08:00
sky121113
6b430bdd88
[FIX] backport hotfix 至 dev:修正員工卡編輯彈窗公司未回填 (Preline getInstance)
2026-06-23 11:40:30 +08:00
sky121113
a5291545a5
[FIX] backport hotfix 至 demo:修正員工卡編輯彈窗公司未回填 (Preline getInstance)
2026-06-23 11:40:26 +08:00
sky121113
7b6dc3cb8e
[FIX] 合併 hotfix:修正員工卡編輯彈窗 Preline getInstance 取錯物件導致公司未回填
2026-06-23 11:40:09 +08:00
sky121113
76409c5f21
[FIX] 員工卡編輯彈窗所屬公司仍未回填:修正 Preline getInstance 取錯物件
...
1. 接續前一個 hotfix:員工卡編輯彈窗的「所屬公司」下拉雖已部署字串轉型,仍顯示空白「選擇公司」。根因為 Preline v3 的 HSSelect.getInstance(target, true) 回傳的是 collection 包裝物件({id, element})而非元件實例,其上沒有 setValue,呼叫即丟 TypeError 並讓 $nextTick 回填中斷。
2. 移除錯誤的第二個參數 true,改以 window.HSSelect.getInstance(el) 取得真正實例(對齊全站 ads / welcome-gifts / pickup-codes 既有可運作寫法)。
3. 一併沿用 welcome-gifts 的穩健流程:先設原生 <select>.value 再呼叫 setValue,並保留數字轉字串、空值以 ' ' 對應 placeholder 的處理。
4. 影響範圍:僅 resources/views/admin/data-config/staff-cards/index.blade.php 之 openStaffModal 回填邏輯,無後端與資料異動。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 11:39:56 +08:00
sky121113
f415e138da
[FIX] backport hotfix 至 dev:員工卡編輯回填公司 + company_id 寫入保護
2026-06-23 11:27:01 +08:00