增加了手机操作端

This commit is contained in:
wushumin
2026-05-15 14:01:36 +08:00
parent 9aac78b8da
commit dd56e0861b
107 changed files with 23547 additions and 346 deletions

View File

@@ -32,6 +32,20 @@ function hasTable(PDO $pdo, string $table): bool
return (int)$stmt->fetchColumn() > 0;
}
function hasColumn(PDO $pdo, string $table, string $column): bool
{
$stmt = $pdo->prepare('SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND COLUMN_NAME = ?');
$stmt->execute([$table, $column]);
return (int)$stmt->fetchColumn() > 0;
}
function hasIndex(PDO $pdo, string $table, string $index): bool
{
$stmt = $pdo->prepare('SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND INDEX_NAME = ?');
$stmt->execute([$table, $index]);
return (int)$stmt->fetchColumn() > 0;
}
function hasPermission(PDO $pdo, string $code): bool
{
$stmt = $pdo->prepare('SELECT COUNT(*) FROM admin_permissions WHERE code = ?');
@@ -45,6 +59,18 @@ CREATE TABLE material_batches (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
batch_no VARCHAR(64) NOT NULL,
total_count INT NOT NULL DEFAULT 0,
status VARCHAR(32) NOT NULL DEFAULT 'active',
invalidated_at DATETIME NULL DEFAULT NULL,
invalidated_by BIGINT UNSIGNED NULL DEFAULT NULL,
invalidated_by_name VARCHAR(64) NOT NULL DEFAULT '',
invalid_reason VARCHAR(500) NOT NULL DEFAULT '',
package_status VARCHAR(32) NOT NULL DEFAULT 'pending',
package_path VARCHAR(255) NOT NULL DEFAULT '',
package_url VARCHAR(500) NOT NULL DEFAULT '',
package_error VARCHAR(500) NOT NULL DEFAULT '',
package_requested_at DATETIME NULL DEFAULT NULL,
package_generated_at DATETIME NULL DEFAULT NULL,
package_purged_at DATETIME NULL DEFAULT NULL,
remark VARCHAR(500) NOT NULL DEFAULT '',
download_count INT NOT NULL DEFAULT 0,
last_downloaded_at DATETIME NULL DEFAULT NULL,
@@ -54,12 +80,55 @@ CREATE TABLE material_batches (
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id),
UNIQUE KEY uk_material_batches_batch_no (batch_no),
KEY idx_material_batches_status (status),
KEY idx_material_batches_package_status (package_status),
KEY idx_material_batches_package_generated_at (package_generated_at),
KEY idx_material_batches_created_at (created_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='物料二维码批次'
SQL);
echo "CREATE_TABLE material_batches\n";
}
if (hasTable($pdo, 'material_batches')) {
$columns = [
'status' => "ALTER TABLE material_batches ADD COLUMN status VARCHAR(32) NOT NULL DEFAULT 'active' AFTER total_count",
'invalidated_at' => "ALTER TABLE material_batches ADD COLUMN invalidated_at DATETIME NULL DEFAULT NULL AFTER status",
'invalidated_by' => "ALTER TABLE material_batches ADD COLUMN invalidated_by BIGINT UNSIGNED NULL DEFAULT NULL AFTER invalidated_at",
'invalidated_by_name' => "ALTER TABLE material_batches ADD COLUMN invalidated_by_name VARCHAR(64) NOT NULL DEFAULT '' AFTER invalidated_by",
'invalid_reason' => "ALTER TABLE material_batches ADD COLUMN invalid_reason VARCHAR(500) NOT NULL DEFAULT '' AFTER invalidated_by_name",
'package_status' => "ALTER TABLE material_batches ADD COLUMN package_status VARCHAR(32) NOT NULL DEFAULT 'pending' AFTER invalid_reason",
'package_path' => "ALTER TABLE material_batches ADD COLUMN package_path VARCHAR(255) NOT NULL DEFAULT '' AFTER package_status",
'package_url' => "ALTER TABLE material_batches ADD COLUMN package_url VARCHAR(500) NOT NULL DEFAULT '' AFTER package_path",
'package_error' => "ALTER TABLE material_batches ADD COLUMN package_error VARCHAR(500) NOT NULL DEFAULT '' AFTER package_url",
'package_requested_at' => "ALTER TABLE material_batches ADD COLUMN package_requested_at DATETIME NULL DEFAULT NULL AFTER package_error",
'package_generated_at' => "ALTER TABLE material_batches ADD COLUMN package_generated_at DATETIME NULL DEFAULT NULL AFTER package_requested_at",
'package_purged_at' => "ALTER TABLE material_batches ADD COLUMN package_purged_at DATETIME NULL DEFAULT NULL AFTER package_generated_at",
];
foreach ($columns as $column => $sql) {
if (!hasColumn($pdo, 'material_batches', $column)) {
$pdo->exec($sql);
echo "ADD_COLUMN material_batches.{$column}\n";
}
}
if (!hasIndex($pdo, 'material_batches', 'idx_material_batches_status')) {
$pdo->exec('ALTER TABLE material_batches ADD KEY idx_material_batches_status (status)');
echo "ADD_INDEX material_batches.idx_material_batches_status\n";
}
if (!hasIndex($pdo, 'material_batches', 'idx_material_batches_package_status')) {
$pdo->exec('ALTER TABLE material_batches ADD KEY idx_material_batches_package_status (package_status)');
echo "ADD_INDEX material_batches.idx_material_batches_package_status\n";
}
if (!hasIndex($pdo, 'material_batches', 'idx_material_batches_package_generated_at')) {
$pdo->exec('ALTER TABLE material_batches ADD KEY idx_material_batches_package_generated_at (package_generated_at)');
echo "ADD_INDEX material_batches.idx_material_batches_package_generated_at\n";
}
$pdo->exec("UPDATE material_batches SET status = 'active' WHERE status = ''");
$pdo->exec("UPDATE material_batches SET package_status = 'pending' WHERE package_status = ''");
}
if (!hasTable($pdo, 'material_tag_codes')) {
$pdo->exec(<<<'SQL'
CREATE TABLE material_tag_codes (
@@ -67,7 +136,17 @@ CREATE TABLE material_tag_codes (
batch_id BIGINT UNSIGNED NOT NULL,
qr_token VARCHAR(80) NOT NULL,
qr_url VARCHAR(500) NOT NULL,
qr_image_url VARCHAR(500) NOT NULL DEFAULT '',
qr_image_path VARCHAR(255) NOT NULL DEFAULT '',
qr_image_status VARCHAR(32) NOT NULL DEFAULT 'pending',
qr_image_error VARCHAR(500) NOT NULL DEFAULT '',
qr_image_generated_at DATETIME NULL DEFAULT NULL,
verify_code VARCHAR(16) NOT NULL,
status VARCHAR(32) NOT NULL DEFAULT 'active',
invalidated_at DATETIME NULL DEFAULT NULL,
invalidated_by BIGINT UNSIGNED NULL DEFAULT NULL,
invalidated_by_name VARCHAR(64) NOT NULL DEFAULT '',
invalid_reason VARCHAR(500) NOT NULL DEFAULT '',
bind_status VARCHAR(32) NOT NULL DEFAULT 'unbound',
report_id BIGINT UNSIGNED NULL DEFAULT NULL,
report_no VARCHAR(64) NOT NULL DEFAULT '',
@@ -89,12 +168,53 @@ CREATE TABLE material_tag_codes (
KEY idx_material_tag_codes_batch_id (batch_id),
KEY idx_material_tag_codes_verify_code (verify_code),
KEY idx_material_tag_codes_report_no (report_no),
KEY idx_material_tag_codes_bind_status (bind_status)
KEY idx_material_tag_codes_bind_status (bind_status),
KEY idx_material_tag_codes_status (status),
KEY idx_material_tag_codes_qr_image_status (qr_image_status),
KEY idx_material_tag_codes_qr_image_generated_at (qr_image_generated_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='物料吊牌二维码'
SQL);
echo "CREATE_TABLE material_tag_codes\n";
}
if (hasTable($pdo, 'material_tag_codes')) {
$columns = [
'qr_image_url' => "ALTER TABLE material_tag_codes ADD COLUMN qr_image_url VARCHAR(500) NOT NULL DEFAULT '' AFTER qr_url",
'qr_image_path' => "ALTER TABLE material_tag_codes ADD COLUMN qr_image_path VARCHAR(255) NOT NULL DEFAULT '' AFTER qr_image_url",
'qr_image_status' => "ALTER TABLE material_tag_codes ADD COLUMN qr_image_status VARCHAR(32) NOT NULL DEFAULT 'pending' AFTER qr_image_path",
'qr_image_error' => "ALTER TABLE material_tag_codes ADD COLUMN qr_image_error VARCHAR(500) NOT NULL DEFAULT '' AFTER qr_image_status",
'qr_image_generated_at' => "ALTER TABLE material_tag_codes ADD COLUMN qr_image_generated_at DATETIME NULL DEFAULT NULL AFTER qr_image_error",
'status' => "ALTER TABLE material_tag_codes ADD COLUMN status VARCHAR(32) NOT NULL DEFAULT 'active' AFTER verify_code",
'invalidated_at' => "ALTER TABLE material_tag_codes ADD COLUMN invalidated_at DATETIME NULL DEFAULT NULL AFTER status",
'invalidated_by' => "ALTER TABLE material_tag_codes ADD COLUMN invalidated_by BIGINT UNSIGNED NULL DEFAULT NULL AFTER invalidated_at",
'invalidated_by_name' => "ALTER TABLE material_tag_codes ADD COLUMN invalidated_by_name VARCHAR(64) NOT NULL DEFAULT '' AFTER invalidated_by",
'invalid_reason' => "ALTER TABLE material_tag_codes ADD COLUMN invalid_reason VARCHAR(500) NOT NULL DEFAULT '' AFTER invalidated_by_name",
];
foreach ($columns as $column => $sql) {
if (!hasColumn($pdo, 'material_tag_codes', $column)) {
$pdo->exec($sql);
echo "ADD_COLUMN material_tag_codes.{$column}\n";
}
}
$indexes = [
'idx_material_tag_codes_status' => 'ALTER TABLE material_tag_codes ADD KEY idx_material_tag_codes_status (status)',
'idx_material_tag_codes_qr_image_status' => 'ALTER TABLE material_tag_codes ADD KEY idx_material_tag_codes_qr_image_status (qr_image_status)',
'idx_material_tag_codes_qr_image_generated_at' => 'ALTER TABLE material_tag_codes ADD KEY idx_material_tag_codes_qr_image_generated_at (qr_image_generated_at)',
];
foreach ($indexes as $index => $sql) {
if (!hasIndex($pdo, 'material_tag_codes', $index)) {
$pdo->exec($sql);
echo "ADD_INDEX material_tag_codes.{$index}\n";
}
}
$pdo->exec("UPDATE material_tag_codes SET qr_image_status = 'pending' WHERE qr_image_status = ''");
$pdo->exec("UPDATE material_tag_codes SET status = 'active' WHERE status = ''");
}
if (!hasTable($pdo, 'material_batch_download_logs')) {
$pdo->exec(<<<'SQL'
CREATE TABLE material_batch_download_logs (