==========================================================================
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の