========================================================================== zsystem.jp 作業記録 2026年6月 ========================================================================== -------------------------------------------------------------------------- 2026-06-01 個品別期間在庫 画面の Web 化(letip/uniqueperiodstock/) -------------------------------------------------------------------------- 目的・背景: Xojo製デスクトップアプリ「ZsystemDESKTOP」の業務システムリプレイスの一環。 デスクトップ画面「個品別期間在庫」(UniqueIOWnd) を letip(メルシーダイキ) 向けに Web 化した。指定期間における個品ごとの在庫/レンタル推移を一覧する画面。 移植元: ~/Library/CloudStorage/Dropbox/Document/Zsystem client/zsystemDESKTOP/ 400.個品管理/UniqueIOWnd.xojo_window の readLog(実行ボタンが呼ぶ最新版。 readLog1/3/4 は旧版で未使用のため移植対象外) 作成ファイル(新規): letip/uniqueperiodstock/index.php … UI(開始日/終了日/資産区分+実行+CSV保存 +ソート可能テーブル) letip/uniqueperiodstock/list.php … JSON API(readLog ロジック移植) 使用テーブル: uniquecodetable(個品マスタ。ownerid/ownername もここ。PDTには ownerid 無し) ProductDistributeTable(PDCode で結合。Standard/ProductName/Kind) pack_archive(divisioncode 日次スナップショット, packno)… 基準在庫 tasklog(timestamp/uniquecode/dstpackno/personid/asset/deleted)… 期間内移動 person(personid → name で作業者名解決) ロジック要点: 1. 開始日以前の最新 divisioncode を基準スナップショットとする 2. 個品マスタを ownerid で絞り込み(資産区分プルダウン) 3. 基準時点の packno 取得。先頭"8"以外 = 在庫中(繰越)、"8"始まり/空 = レンタル中 4. 期間内 tasklog を時系列に並べ、各移動を1行出力。先頭に繰越/レンタル中行、 連続イベント間の 日数・時間 を算出 出力列: No./資産区分/ATI個品番号/顧客個品番号/型式/商品名/品種/日時/P.No/ 日数/時間/備考 デスクトップ版からの調整点: - 性能: 個品ごと約1.1万回クエリ → tasklog 期間一括取得+PHP側グルーピングに 集約(ローカルはリモートMySQLへネットワーク接続のためタイムアウト回避) - 堅牢化: pack_archive.divisioncode が slash(500万)/dash(33万)/junk(320) 混在。 単純文字列比較だと '2024-03-05' < '2024/03/05' で基準日を誤判定し得るため、 DISTINCT(612件)を YYYY-MM-DD に正規化してから比較・選定 - tasklog.deleted=0 で削除ログを除外(デスクトップ版は未フィルタ。ユーザー承認済) - 追加機能: 列ソート、ATI個品番号クリックで packviewer(履歴ビュア)を別タブ表示、 CSV(UTF-8 BOM付)ダウンロード - PHP5.3互換で記述(?? / JSON_UNESCAPED_UNICODE 不使用) 備考: - 「日時」列はデスクトップ準拠で日付のみ表示(同日複数移動は日付同一) - 作業者は personid を name に解決して表示(デスクトップは生 personid) デプロイ: zadmin@zsystem.jp:/Users/zadmin/Sites/letip/uniqueperiodstock/ へ scp。 dir 755 / files 644。リモートPHP5.3 構文チェック・本番URL動作確認済。 公開URL: https://zsystem.jp/letip/uniqueperiodstock/ ========================================================================== -------------------------------------------------------------------------- 2026-06-03 個品別期間在庫 Web版 の機能拡張(備考の工程名化・作業者列分離 ほか) -------------------------------------------------------------------------- 目的・背景: 6/1 初版をブラウザで運用確認しながら、デスクトップ版の見え方に寄せて 備考・作業者・繰越表現を改善した。 index.php の変更: - 資産区分プルダウンの生成元を uniquecodetable.ownerid → AssetList (AssetCode/AssetName)に変更。デスクトップ版 ReadAssetsToMenu に準拠 - デフォルト期間を「先月1日〜先月末」(date Y-m-01 / Y-m-t の -1month)に変更 - 読み込み中スピナー(#status.loading::before)を追加 - 「作業者」列を新設し、備考から作業者を分離(COLS に worker 追加) list.php の変更: - mkrow に worker を追加し、備考(remark)と作業者(worker)を別列で返す - packno → 工程名 変換を追加(zgrouplist_expansion: groupcode → name)。 P.No列はコードのまま、備考側に工程名を表示 - 繰越/レンタル中(先頭)行の備考を精緻化: ・期間内に動きのある個品: 基準日より前の最終MOVログ(taskno='MOV')から 「工程名(日付)」+当該作業者を表示(prePeriodLog) ・期間内に動きの無い個品: pack テーブルに在れば現在packno+工程名+ createdate、無ければ tasklog 最終ログの packno+工程名+日付 - 全個品の最終 tasklog を JOIN(サブクエリ MAX(id))で一括取得し、 IN リスト肥大を回避(lastTasklog) - 基準日前の最終MOVは「期間内に動きのある個品のみ」を IN 句で遅延取得し 負荷を抑制(prePeriodLog) - tasklog 期間の下限を ">" → ">=" に変更(基準日当日のログを含める) - 作業者表示を「name(personid)」形式に変更 デプロイ状況(2026-06-03 md5 比較): - index.php: 本番反映済み(ローカル=リモート md5 一致) - list.php : ローカルに未反映の変更あり(md5 不一致)。要再デプロイ。 ※ index.php は worker 列を期待するため、list.php 未反映だと本番で 作業者列が空になる。list.php の再デプロイが必要。 ========================================================================== ========================================================================== 2026-06-04 ellio/arrival/ 画像パスのローカル/本番切替対応+photoreceive.php同期 【背景・目的】 ローカル開発時、ellio/arrival/ には invoiceimage/ の実画像が無いため 入荷伝票(現品票)画像が表示できなかった。localhost アクセス時のみ本番 (https://zsystem.jp/ellio/invoiceimage/) から画像を引くよう切替を導入。 本番アクセス時は従来どおり相対パス ../invoiceimage/ を使い挙動不変とする。 【作業前のローカル/サーバー md5 比較で判明した差分(3ファイル)】 - regist.php / regist.js : ローカルが新(今回の対応)。→ デプロイ対象 - photoreceive.php : サーバーの方が新しい改善版だった。 ローカルは古いデバッグ版(相対パス・echoデバッグ残存・ explode('[.]',…) バグ・エラー処理未導入)。 → サーバー版をローカルへ取り込み(逆方向同期)。 ローカル旧版は photoreceive.local-old-20260317.php.bak として退避。 【regist.php / regist.js の変更内容】 - regist.php: HTTP_HOST に localhost/127.0.0.1 を含むかで $_isLocal 判定し、 define('IMAGE_BASE_URL', 本番URL or '../invoiceimage/') を定義。 出力(GetPage / GetRegistTarget)を IMAGE_BASE_URL 経由に変更。 Form() のテンプレ置換に [IMAGEBASEURL] → IMAGE_BASE_URL を追加。 ※ opendir('../invoiceimage/') 等のサーバー側ディレクトリ読取りは ブラウザURLでないため従来どおり相対のまま(変更不要)。 - regist.js : 先頭に var imageBaseURL='[IMAGEBASEURL]'; を追加。 サムネ背景・拡大window.open・ナビ画像の3箇所を imageBaseURL 経由に。 regist.js は Form() 内で file_get_contents → str_replace で プレースホルダ置換されるため、JS内 [IMAGEBASEURL] も確実に置換される。 【デプロイ前検証】 - PHP構文チェック(php8.4) エラーなし/PHP5.3互換(strpos/define/三項のみ)OK - 本番は HTTP_HOST=zsystem.jp → IMAGE_BASE_URL='../invoiceimage/' となり 出力は従来とバイト単位で同一(現場挙動に変化なし)。 【デプロイ・本番検証(2026-06-04)】 - 現行 regist.php/js をサーバー上に *.bak-20260604 でバックアップ後デプロイ。 - chmod 644/md5 ローカル一致(regist.php=68b0a1a9… js=444a3405…)。 - curl 'regist.php?mode=openForm' で本番レンダリング検証: var imageBaseURL = '../invoiceimage/'; に正しく置換、 未置換[IMAGEBASEURL]なし、PHPエラー混入なし。→ 正常稼働確認。 【残務】 - サーバー: regist.php.bak-20260604 / regist.js.bak-20260604(問題なければ削除可) - ローカル: photoreceive.local-old-20260317.php.bak(不要なら削除可) ========================================================================== ========================================================================== 2026-06-04 ellio/arrival/ 入力フォーム フリーズ対策+PackNo赤丸表示 【背景・目的】 regist.php の入力フォームで、候補画像リストから登録フォームへ切替える際、 画面が白いまま(入力欄が出ない状態で)一定時間フリーズする問題があった。 ※フリーズは本番(現場端末)で発生。以前の画像width/height指定では未解決。 【原因の切り分け(計測込み)】 - サーバー側は潔白: invoiceimage全走査(42,255件)=0.07秒、 getActualList/getInvoiceInfo/getPage 応答も各0.03〜0.13秒と高速。 - 真因はクライアント側: naviarea に「縮小版でなく原寸1.5MBの入荷伝票(現品票)画像」を ページ数ぶん挿入し、viewpainにも原寸画像。これらをブラウザが メインスレッドで同期デコード→フォームのペイントがブロックされ白画面化。 width/height はレイアウト予約でデコードコストを下げないため効かなかった。 ※invoiceimageは約4.2万枚・77GB、1枚約1.5MB。 【対策(regist.js / regist.php)】 - viewpain大画像(GetPage, regist.php) と naviareaサムネ(regist.js) のに decoding='async' を付与→デコードを非同期化し、フォームを先に描画。 naviareaサムネには loading='lazy' も追加(画面外の同時読込抑制)。 - 未使用の axios / Vue のCDN同期ロード2行を regist.js から撤去 (regist画面では未使用。死んだ onSubmit/vm1 も削除)。 【併せて実装: PackNo赤丸表示(packdot)】 - フォーム編集中、「画面遷移でpackテーブルに書き込まれる状態」なら PackNo入力欄の近くに小さな赤丸を表示。判定は WriteInfo() の実条件を 厳密再現: packno非空 かつ NOT(変更なし かつ packテーブルに該当なし)。 変更なし時のみ checkPackInvoiceno でpack存在を確認。 - 更新タイミング: フォーム表示時(checksendfrom内) + PackNo編集時(packcheck)。 - 誤検知修正: 未登録(UNREGISTED)/対象外(NOTARGET)では packno が type=hidden のため、隠しフィールド時は赤丸を出さないガードを追加。 【ローカル開発の注意(今回判明)】 - imageBaseURL(本番フルURL化)は画像の「表示URL」だけを本番に向ける。 ページ数・ファイル存在の判定は getInvoiceInfo等が opendir で 「ローカルの」invoiceimageを走査して行うため、ローカルに当該画像が 無い入荷番号(例:6月分)は 0ページ表示になる。ローカル確認は ローカルに画像が存在する番号(2-3月分)で行うこと。 【デプロイ・本番検証(2026-06-04)】 - 現行を *.bak-20260604b でバックアップ後、regist.php/regist.js をデプロイ。 chmod 644/md5一致(regist.php=0a097e07… js=39f57104…)。 - 本番出力で検証: viewpain画像に decoding='async'、axios/Vueの