Files
pj_service_cloud/db/20260908_add_hard_printer.sql
2026-09-08 15:25:23 +08:00

207 lines
9.9 KiB
SQL

-- 尔印独立打印终端、终端一对一绑定及持久化打印任务(迁移自 hq-platform 20260904_add_er_yin_printer.sql,仅保留 DDL)。
-- 字典(hard_type 类型12、hard_print_type、hard_print_status)与按钮权限请按 db/20260908_权限菜单字典待添加.txt 手动添加。
-- 每个结构变更独立判断,可在兼容数据库自动提交部分DDL后安全重跑整个脚本。
ALTER TABLE `pjcloudx_hardware`.`hard_invoice`
MODIFY COLUMN `hard_id` bigint(20) NULL COMMENT '来源业务或核销终端id',
MODIFY COLUMN `pic` varchar(512) NULL COMMENT '后端生成的打印PNG地址';
SET @er_yin_ddl = IF(
(SELECT COUNT(*) FROM `information_schema`.`columns`
WHERE `table_schema` = 'pjcloudx_hardware' AND `table_name` = 'hard_invoice'
AND `column_name` = 'printer_hard_id') = 0,
'ALTER TABLE `pjcloudx_hardware`.`hard_invoice` ADD COLUMN `printer_hard_id` bigint(20) NULL COMMENT ''目标尔印打印终端id'' AFTER `hard_id`',
'SELECT 1'
);
PREPARE er_yin_stmt FROM @er_yin_ddl;
EXECUTE er_yin_stmt;
DEALLOCATE PREPARE er_yin_stmt;
SET @er_yin_ddl = IF(
(SELECT COUNT(*) FROM `information_schema`.`columns`
WHERE `table_schema` = 'pjcloudx_hardware' AND `table_name` = 'hard_invoice'
AND `column_name` = 'print_type') = 0,
'ALTER TABLE `pjcloudx_hardware`.`hard_invoice` ADD COLUMN `print_type` char(2) NOT NULL DEFAULT ''1'' COMMENT ''打印类型,1发票、2兑换券'' AFTER `order_id`',
'SELECT 1'
);
PREPARE er_yin_stmt FROM @er_yin_ddl;
EXECUTE er_yin_stmt;
DEALLOCATE PREPARE er_yin_stmt;
SET @er_yin_ddl = IF(
(SELECT COUNT(*) FROM `information_schema`.`columns`
WHERE `table_schema` = 'pjcloudx_hardware' AND `table_name` = 'hard_invoice'
AND `column_name` = 'print_no') = 0,
'ALTER TABLE `pjcloudx_hardware`.`hard_invoice` ADD COLUMN `print_no` int(11) NOT NULL DEFAULT 1 COMMENT ''同订单同类型打印序号'' AFTER `print_type`',
'SELECT 1'
);
PREPARE er_yin_stmt FROM @er_yin_ddl;
EXECUTE er_yin_stmt;
DEALLOCATE PREPARE er_yin_stmt;
SET @er_yin_ddl = IF(
(SELECT COUNT(*) FROM `information_schema`.`columns`
WHERE `table_schema` = 'pjcloudx_hardware' AND `table_name` = 'hard_invoice'
AND `column_name` = 'retry_version') = 0,
'ALTER TABLE `pjcloudx_hardware`.`hard_invoice` ADD COLUMN `retry_version` int(11) NOT NULL DEFAULT 0 COMMENT ''人工失败重试版本'' AFTER `print_no`',
'SELECT 1'
);
PREPARE er_yin_stmt FROM @er_yin_ddl;
EXECUTE er_yin_stmt;
DEALLOCATE PREPARE er_yin_stmt;
SET @er_yin_ddl = IF(
(SELECT COUNT(*) FROM `information_schema`.`columns`
WHERE `table_schema` = 'pjcloudx_hardware' AND `table_name` = 'hard_invoice'
AND `column_name` = 'attempt_count') = 0,
'ALTER TABLE `pjcloudx_hardware`.`hard_invoice` ADD COLUMN `attempt_count` int(11) NOT NULL DEFAULT 0 COMMENT ''终端USB累计尝试次数'' AFTER `retry_version`',
'SELECT 1'
);
PREPARE er_yin_stmt FROM @er_yin_ddl;
EXECUTE er_yin_stmt;
DEALLOCATE PREPARE er_yin_stmt;
SET @er_yin_ddl = IF(
(SELECT COUNT(*) FROM `information_schema`.`columns`
WHERE `table_schema` = 'pjcloudx_hardware' AND `table_name` = 'hard_invoice'
AND `column_name` = 'failure_stage') = 0,
'ALTER TABLE `pjcloudx_hardware`.`hard_invoice` ADD COLUMN `failure_stage` varchar(32) NULL COMMENT ''BINDING、IMAGE_GENERATION、MQTT_DISPATCH或TERMINAL_PRINT'' AFTER `status`',
'SELECT 1'
);
PREPARE er_yin_stmt FROM @er_yin_ddl;
EXECUTE er_yin_stmt;
DEALLOCATE PREPARE er_yin_stmt;
SET @er_yin_ddl = IF(
(SELECT COUNT(*) FROM `information_schema`.`columns`
WHERE `table_schema` = 'pjcloudx_hardware' AND `table_name` = 'hard_invoice'
AND `column_name` = 'last_error') = 0,
'ALTER TABLE `pjcloudx_hardware`.`hard_invoice` ADD COLUMN `last_error` varchar(2000) NULL COMMENT ''最近失败摘要'' AFTER `failure_stage`',
'SELECT 1'
);
PREPARE er_yin_stmt FROM @er_yin_ddl;
EXECUTE er_yin_stmt;
DEALLOCATE PREPARE er_yin_stmt;
SET @er_yin_ddl = IF(
(SELECT COUNT(*) FROM `information_schema`.`columns`
WHERE `table_schema` = 'pjcloudx_hardware' AND `table_name` = 'hard_invoice'
AND `column_name` = 'printed_at') = 0,
'ALTER TABLE `pjcloudx_hardware`.`hard_invoice` ADD COLUMN `printed_at` datetime NULL COMMENT ''终端确认完整USB数据和切纸命令写入成功时间'' AFTER `last_error`',
'SELECT 1'
);
PREPARE er_yin_stmt FROM @er_yin_ddl;
EXECUTE er_yin_stmt;
DEALLOCATE PREPARE er_yin_stmt;
SET @er_yin_ddl = IF(
(SELECT COUNT(*) FROM `information_schema`.`columns`
WHERE `table_schema` = 'pjcloudx_hardware' AND `table_name` = 'hard_invoice'
AND `column_name` = 'reprint_reason') = 0,
'ALTER TABLE `pjcloudx_hardware`.`hard_invoice` ADD COLUMN `reprint_reason` varchar(500) NULL COMMENT ''人工重打或再次核销原因'' AFTER `printed_at`',
'SELECT 1'
);
PREPARE er_yin_stmt FROM @er_yin_ddl;
EXECUTE er_yin_stmt;
DEALLOCATE PREPARE er_yin_stmt;
-- 唯一索引尚未建立才回填历史发票,避免迁移完成后重跑时覆盖新产生的兑换券任务。
SET @er_yin_ddl = IF(
(SELECT COUNT(*) FROM `information_schema`.`statistics`
WHERE `table_schema` = 'pjcloudx_hardware' AND `table_name` = 'hard_invoice'
AND `index_name` = 'uk_hard_invoice_order_type_no') = 0,
'UPDATE `pjcloudx_hardware`.`hard_invoice` invoice
JOIN (
SELECT ranked.`id`, ranked.`print_no`
FROM (
SELECT `id`, ROW_NUMBER() OVER (
PARTITION BY `tenant_id`, `order_id`
ORDER BY `create_time`, `id`
) AS `print_no`
FROM `pjcloudx_hardware`.`hard_invoice`
) ranked
) ranked_rows ON ranked_rows.`id` = invoice.`id`
SET invoice.`print_type` = ''1'',
invoice.`print_no` = ranked_rows.`print_no`,
invoice.`retry_version` = 0,
invoice.`attempt_count` = 0',
'SELECT 1'
);
PREPARE er_yin_stmt FROM @er_yin_ddl;
EXECUTE er_yin_stmt;
DEALLOCATE PREPARE er_yin_stmt;
SET @er_yin_ddl = IF(
(SELECT COUNT(*) FROM `information_schema`.`statistics`
WHERE `table_schema` = 'pjcloudx_hardware' AND `table_name` = 'hard_invoice'
AND `index_name` = 'uk_hard_invoice_order_type_no') = 0,
'ALTER TABLE `pjcloudx_hardware`.`hard_invoice` ADD UNIQUE KEY `uk_hard_invoice_order_type_no` (`tenant_id`, `order_id`, `print_type`, `print_no`)',
'SELECT 1'
);
PREPARE er_yin_stmt FROM @er_yin_ddl;
EXECUTE er_yin_stmt;
DEALLOCATE PREPARE er_yin_stmt;
SET @er_yin_ddl = IF(
(SELECT COUNT(*) FROM `information_schema`.`statistics`
WHERE `table_schema` = 'pjcloudx_hardware' AND `table_name` = 'hard_invoice'
AND `index_name` = 'idx_hard_invoice_printer_status') = 0,
'ALTER TABLE `pjcloudx_hardware`.`hard_invoice` ADD KEY `idx_hard_invoice_printer_status` (`tenant_id`, `printer_hard_id`, `status`, `update_time`, `del_flag`)',
'SELECT 1'
);
PREPARE er_yin_stmt FROM @er_yin_ddl;
EXECUTE er_yin_stmt;
DEALLOCATE PREPARE er_yin_stmt;
SET @er_yin_ddl = IF(
(SELECT COUNT(*) FROM `information_schema`.`statistics`
WHERE `table_schema` = 'pjcloudx_hardware' AND `table_name` = 'hard_invoice'
AND `index_name` = 'idx_hard_invoice_source_status') = 0,
'ALTER TABLE `pjcloudx_hardware`.`hard_invoice` ADD KEY `idx_hard_invoice_source_status` (`tenant_id`, `hard_id`, `status`, `del_flag`)',
'SELECT 1'
);
PREPARE er_yin_stmt FROM @er_yin_ddl;
EXECUTE er_yin_stmt;
DEALLOCATE PREPARE er_yin_stmt;
CREATE TABLE IF NOT EXISTS `pjcloudx_hardware`.`hard_printer_binding`
(
`id` bigint(20) NOT NULL COMMENT '绑定关系主键',
`source_hard_id` bigint(20) NOT NULL COMMENT 'SUPERMARKET或CANTEEN来源业务终端id',
`printer_hard_id` bigint(20) NOT NULL COMMENT 'EY_PRINT目标打印终端id',
`merchant_id` bigint(20) NOT NULL COMMENT '双方共同所属商户id快照',
`dept_id` bigint(20) NOT NULL COMMENT '双方共同所属商户部门id快照',
`create_by` varchar(64) DEFAULT NULL COMMENT '创建人',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_by` varchar(64) DEFAULT NULL COMMENT '修改人',
`update_time` datetime DEFAULT NULL COMMENT '修改时间',
`tenant_id` bigint(20) NOT NULL COMMENT '租户ID',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_hard_printer_binding_source` (`tenant_id`, `source_hard_id`),
UNIQUE KEY `uk_hard_printer_binding_printer` (`tenant_id`, `printer_hard_id`),
KEY `idx_hard_printer_binding_merchant` (`tenant_id`, `merchant_id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci
COMMENT = '业务终端与尔印打印终端一对一绑定';
CREATE TABLE IF NOT EXISTS `pjcloudx_hardware`.`hard_printer_config`
(
`id` bigint(20) NOT NULL COMMENT '配置主键',
`printer_hard_id` bigint(20) NOT NULL COMMENT 'EY_PRINT打印终端id',
`printer_model` varchar(128) DEFAULT NULL COMMENT '打印机型号',
`usb_vendor_id` int(11) DEFAULT NULL COMMENT 'USB Vendor ID十进制值',
`usb_product_id` int(11) DEFAULT NULL COMMENT 'USB Product ID十进制值',
`paper_width` int(11) NOT NULL DEFAULT 80 COMMENT '纸宽,单位mm,首期固定80',
`auto_cut` char(1) NOT NULL DEFAULT '1' COMMENT '自动切刀开关,1开启、0关闭',
`image_mode` varchar(16) NOT NULL DEFAULT 'GS_V0' COMMENT '图片指令模式,GS_V0或ESC_STAR',
`create_by` varchar(64) DEFAULT NULL COMMENT '创建人',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_by` varchar(64) DEFAULT NULL COMMENT '修改人',
`update_time` datetime DEFAULT NULL COMMENT '修改时间',
`tenant_id` bigint(20) NOT NULL COMMENT '租户ID',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_hard_printer_config_printer` (`tenant_id`, `printer_hard_id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci
COMMENT = '尔印打印终端USB与ESC/POS配置';
SET @er_yin_ddl = NULL;