feat:更改页面
This commit is contained in:
1 parent
4e804a17cd
commit
8995bf89d6
174 files changed
+11342
-220
No files matched your search
@@ -0,0 +1,44 @@
|
||||
-- 订单识别证据图片表(迁移自 hq-platform 20260823_add_hard_order_evidence_image.sql)。
|
||||
-- 本表独立于 hard_order,退款、撤销和订单逻辑删除均不自动清理证据文件或证据记录。
|
||||
CREATE TABLE IF NOT EXISTS `pjcloudx_hardware`.`hard_order_evidence_image`
|
||||
(
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '证据记录自增主键',
|
||||
`order_id` bigint(20) NOT NULL COMMENT '订单主键,来源hard_order.id',
|
||||
`android_order_code` varchar(128) NOT NULL COMMENT '终端本地稳定订单号快照',
|
||||
`evidence_type` varchar(32) NOT NULL COMMENT '证据类型,FACE_RECOGNITION或MENU_RECOGNITION',
|
||||
`evidence_role` varchar(32) NOT NULL COMMENT '图片角色,FACE_REFERENCE、FACE_LIVE或MENU_LIVE',
|
||||
`sequence_no` int(11) NOT NULL DEFAULT 0 COMMENT '同类型同角色图片序号,从0开始',
|
||||
`user_id` bigint(20) DEFAULT NULL COMMENT '识别用户主键快照',
|
||||
`face_sample_id` varchar(64) DEFAULT NULL COMMENT '虹软人脸样本编号快照',
|
||||
`reference_image_url` varchar(512) DEFAULT NULL COMMENT '识别时后台参考人脸来源地址快照,不作为展示地址',
|
||||
`similarity` decimal(8, 6) DEFAULT NULL COMMENT '识别相似度快照,取值0至1',
|
||||
`similarity_threshold` decimal(8, 6) DEFAULT NULL COMMENT '终端生效的相似度阈值快照,取值0至1',
|
||||
`hard_id` bigint(20) NOT NULL COMMENT '产生证据的设备主键',
|
||||
`captured_at` datetime DEFAULT NULL COMMENT '终端实际采集时间',
|
||||
`sys_file_id` bigint(20) DEFAULT NULL COMMENT '文件中心sys_file记录主键',
|
||||
`storage_file_name` varchar(255) DEFAULT NULL COMMENT '文件中心对象名',
|
||||
`image_url` varchar(512) DEFAULT NULL COMMENT '订单证据图片访问地址',
|
||||
`image_hash` char(64) DEFAULT NULL COMMENT '实际文件SHA-256哈希',
|
||||
`image_size` bigint(20) DEFAULT NULL COMMENT '实际文件大小,单位字节',
|
||||
`image_width` int(11) DEFAULT NULL COMMENT '实际图片宽度,单位像素',
|
||||
`image_height` int(11) DEFAULT NULL COMMENT '实际图片高度,单位像素',
|
||||
`status` varchar(32) NOT NULL COMMENT '证据状态,PENDING、AVAILABLE或UNAVAILABLE',
|
||||
`failure_reason` varchar(500) DEFAULT NULL COMMENT '永久缺失或复制失败摘要,不保存终端完整路径',
|
||||
`app_version` varchar(64) DEFAULT NULL COMMENT '产生证据的终端应用版本',
|
||||
`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 '修改时间',
|
||||
`del_flag` char(1) DEFAULT '0' COMMENT '逻辑删除标记,0有效,1删除',
|
||||
`tenant_id` bigint(20) NOT NULL COMMENT '租户主键',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_hard_order_evidence_position`
|
||||
(`tenant_id`, `order_id`, `evidence_type`, `evidence_role`, `sequence_no`, `del_flag`),
|
||||
KEY `idx_hard_order_evidence_android_order`
|
||||
(`tenant_id`, `hard_id`, `android_order_code`, `del_flag`),
|
||||
KEY `idx_hard_order_evidence_status`
|
||||
(`tenant_id`, `status`, `update_time`, `del_flag`)
|
||||
) ENGINE = InnoDB
|
||||
DEFAULT CHARSET = utf8mb4
|
||||
COLLATE = utf8mb4_general_ci
|
||||
COMMENT = '硬件订单识别证据图片';
|
||||
@@ -0,0 +1,23 @@
|
||||
-- 硬件订单新增独立核销时间(迁移自 hq-platform 20260823_add_hard_order_verification_time.sql)。
|
||||
-- 历史二维码核销订单只能使用最后更新时间近似回填;外卖等非核销完成状态不参与回填。
|
||||
-- 新核销订单由业务事务写入准确时间,后续订单更新不再改变该值。
|
||||
|
||||
SET @verification_time_ddl = IF(
|
||||
(SELECT COUNT(*) FROM `information_schema`.`columns`
|
||||
WHERE `table_schema` = 'pjcloudx_hardware' AND `table_name` = 'hard_order'
|
||||
AND `column_name` = 'verification_time') = 0,
|
||||
'ALTER TABLE `pjcloudx_hardware`.`hard_order` ADD COLUMN `verification_time` datetime DEFAULT NULL COMMENT ''订单实际核销完成时间,后续订单更新不得覆盖'' AFTER `refund_status`, ADD KEY `idx_hard_order_verification_time` (`tenant_id`, `verification_time`, `del_flag`)',
|
||||
'SELECT 1'
|
||||
);
|
||||
PREPARE verification_time_stmt FROM @verification_time_ddl;
|
||||
EXECUTE verification_time_stmt;
|
||||
DEALLOCATE PREPARE verification_time_stmt;
|
||||
|
||||
UPDATE `pjcloudx_hardware`.`hard_order`
|
||||
SET `verification_time` = `update_time`
|
||||
WHERE ((`order_status` = '20' AND `order_type` IN ('1', '2', '3', '4'))
|
||||
OR `pay_type` IN ('5', '6', '50'))
|
||||
AND `verification_time` IS NULL
|
||||
AND `update_time` IS NOT NULL;
|
||||
|
||||
SET @verification_time_ddl = NULL;
|
||||
@@ -0,0 +1,206 @@
|
||||
-- 尔印独立打印终端、终端一对一绑定及持久化打印任务(迁移自 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;
|
||||
@@ -0,0 +1,38 @@
|
||||
-- 终端日志文件表(hq-platform 无独立建表脚本,本 DDL 依据 HardTerminalLogFileEntity 与查询场景编写)。
|
||||
-- 记录 Android 终端上传到文件中心的日志文件索引,同一文件重复上传时累加 upload_count 并更新地址。
|
||||
CREATE TABLE IF NOT EXISTS `pjcloudx_hardware`.`hard_terminal_log_file`
|
||||
(
|
||||
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
|
||||
`hard_id` bigint NOT NULL COMMENT '设备ID(hard_manager.id)',
|
||||
`hard_name` varchar(128) DEFAULT NULL COMMENT '上传时设备名称快照',
|
||||
`unique_code` varchar(128) DEFAULT NULL COMMENT '上传时设备唯一编号快照',
|
||||
`hard_type` char(10) DEFAULT NULL COMMENT '上传时设备类型快照',
|
||||
`merchant_id` bigint DEFAULT NULL COMMENT '上传时商户ID快照',
|
||||
`dept_id` bigint DEFAULT NULL COMMENT '上传时部门ID快照',
|
||||
`log_date` date NOT NULL COMMENT '日志所属日期',
|
||||
`relative_path` varchar(512) NOT NULL COMMENT '终端日志根目录下的相对路径',
|
||||
`original_name` varchar(255) DEFAULT NULL COMMENT '原日志文件名',
|
||||
`file_size` bigint DEFAULT NULL COMMENT '文件大小(字节)',
|
||||
`file_hash` char(32) DEFAULT NULL COMMENT '文件内容哈希(当前使用MD5)',
|
||||
`file_modified_time` datetime DEFAULT NULL COMMENT '终端本地文件最后修改时间',
|
||||
`sys_file_id` bigint DEFAULT NULL COMMENT '文件中心sys_file记录ID',
|
||||
`storage_file_name` varchar(255) DEFAULT NULL COMMENT 'OSS对象文件名',
|
||||
`storage_url` varchar(512) DEFAULT NULL COMMENT '文件访问相对地址',
|
||||
`app_version` varchar(64) DEFAULT NULL COMMENT '上传时应用版本',
|
||||
`sanitize_version` varchar(64) DEFAULT NULL COMMENT '日志脱敏规则版本',
|
||||
`upload_time` datetime DEFAULT NULL COMMENT '最近成功上传时间',
|
||||
`upload_count` int NOT NULL DEFAULT 1 COMMENT '成功上传次数',
|
||||
`remark` varchar(512) DEFAULT NULL COMMENT '备注',
|
||||
`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 '修改时间',
|
||||
`del_flag` char(1) DEFAULT '0' COMMENT '删除标记',
|
||||
`tenant_id` bigint NOT NULL COMMENT '租户ID',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_hard_terminal_log_position` (`tenant_id`, `hard_id`, `relative_path`, `del_flag`),
|
||||
KEY `idx_hard_terminal_log_date` (`tenant_id`, `hard_id`, `log_date`, `del_flag`),
|
||||
KEY `idx_hard_terminal_log_hash` (`tenant_id`, `file_hash`)
|
||||
) ENGINE = InnoDB
|
||||
DEFAULT CHARSET = utf8mb4
|
||||
COLLATE = utf8mb4_general_ci COMMENT ='终端日志文件';
|
||||
@@ -0,0 +1,25 @@
|
||||
-- 终端心跳状态表(迁移自 hq-platform 20260730_add_hard_terminal_status.sql)。
|
||||
-- 食堂、超市 Android 终端心跳状态。在线状态由服务端按最后心跳时间实时计算,不冗余落库。
|
||||
CREATE TABLE IF NOT EXISTS `pjcloudx_hardware`.`hard_terminal_status` (
|
||||
`hard_id` bigint NOT NULL COMMENT '设备ID,对应hard_manager.id',
|
||||
`last_online_time` datetime NOT NULL COMMENT '服务端最近收到心跳的时间',
|
||||
`heartbeat_scene` varchar(32) NOT NULL COMMENT '最近心跳场景(ONLINE,AUTO_UPDATE)',
|
||||
`disconnect_reason` varchar(128) DEFAULT NULL COMMENT '计划内断开原因,目前用于标记自动更新重启',
|
||||
`apk_version_name` varchar(64) DEFAULT NULL COMMENT '终端上报的APK展示版本号',
|
||||
`apk_version_code` bigint DEFAULT NULL COMMENT '终端上报的APK内部版本码',
|
||||
`system_uptime_seconds` bigint DEFAULT NULL COMMENT 'Android系统本次启动后运行秒数',
|
||||
`app_uptime_seconds` bigint DEFAULT NULL COMMENT '终端App本次进程运行秒数',
|
||||
`network_type` varchar(32) DEFAULT NULL COMMENT '最近心跳使用的网络类型',
|
||||
`available_storage_bytes` bigint DEFAULT NULL COMMENT '应用存储卷最近可用空间,单位字节',
|
||||
`root_status` varchar(16) DEFAULT NULL COMMENT 'Root状态(unknown,available,unavailable)',
|
||||
`device_owner` tinyint(1) DEFAULT NULL COMMENT '当前应用是否为Device Owner',
|
||||
`kiosk_active` tinyint(1) DEFAULT NULL COMMENT '最近心跳时是否处于Kiosk锁定任务模式',
|
||||
`device_status_json` json DEFAULT NULL COMMENT '打印机、电子秤、读卡器、副屏等可选硬件状态快照',
|
||||
`create_by` varchar(64) DEFAULT NULL COMMENT '创建人',
|
||||
`create_time` datetime NOT NULL COMMENT '创建时间',
|
||||
`update_by` varchar(64) DEFAULT NULL COMMENT '修改人',
|
||||
`update_time` datetime NOT NULL COMMENT '修改时间',
|
||||
`tenant_id` bigint NOT NULL COMMENT '租户ID',
|
||||
PRIMARY KEY (`hard_id`),
|
||||
KEY `idx_hard_terminal_status_tenant_online` (`tenant_id`, `last_online_time`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='食堂超市终端心跳状态';
|
||||
@@ -0,0 +1,30 @@
|
||||
-- 消费机日志表(迁移自 hq-platform 800pjcloudx_hardware.sql 末段)。
|
||||
-- 记录消费机终端 HTTP 调用日志(req/res/error/耗时),unique_code 唯一。
|
||||
CREATE TABLE IF NOT EXISTS `pjcloudx_hardware`.`hard_xfj_log`
|
||||
(
|
||||
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
|
||||
`unique_code` varchar(64) NOT NULL COMMENT '设备唯一编号',
|
||||
`hard_type` varchar(32) NOT NULL COMMENT '设备类型',
|
||||
`title` varchar(64) NOT NULL COMMENT '接口标题',
|
||||
`headers` varchar(2048) COMMENT 'headers',
|
||||
`res` varchar(2048) COMMENT 'res',
|
||||
`req` varchar(2048) COMMENT 'req',
|
||||
`error` varchar(2048) COMMENT 'error',
|
||||
`start_time` datetime DEFAULT NULL COMMENT '开始时间',
|
||||
`end_time` datetime DEFAULT NULL COMMENT '结束时间',
|
||||
`cost` int DEFAULT NULL COMMENT '耗时(毫秒)',
|
||||
`create_by` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人',
|
||||
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
|
||||
`update_by` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '修改人',
|
||||
`update_time` datetime DEFAULT NULL COMMENT '修改时间',
|
||||
`del_flag` char(1) COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记',
|
||||
`tenant_id` bigint DEFAULT NULL COMMENT '租户ID',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `idx_unique_code` (`unique_code`),
|
||||
KEY `idx_hard_type` (`hard_type`),
|
||||
KEY `idx_title` (`title`),
|
||||
KEY `idx_start_time` (`start_time`),
|
||||
KEY `idx_end_time` (`end_time`)
|
||||
) ENGINE = InnoDB
|
||||
DEFAULT CHARSET = utf8mb4
|
||||
COLLATE = utf8mb4_general_ci COMMENT ='消费机日志';
|
||||
@@ -0,0 +1,7 @@
|
||||
-- 为钱包流水补充财务统计标签和业务备注;历史数据保持为空。
|
||||
-- tags 保存 wallet_transaction_tag 字典值,多个值使用英文逗号分隔;remark 前后端统一限制为 256 个字符。
|
||||
ALTER TABLE wallet_transaction
|
||||
ADD COLUMN tags varchar(512) DEFAULT NULL COMMENT '财务统计标签,多个wallet_transaction_tag字典值使用英文逗号分隔' AFTER balance;
|
||||
|
||||
ALTER TABLE wallet_transaction
|
||||
ADD COLUMN remark varchar(256) DEFAULT NULL COMMENT '流水备注,最多256个字符' AFTER tags;
|
||||
@@ -0,0 +1,158 @@
|
||||
================================================================
|
||||
hard 模块迁移(2026-09-08)—— 权限/菜单/字典 手动添加清单
|
||||
================================================================
|
||||
说明:以下内容需要在 pjcloudx 主库(sys_menu / sys_dict / sys_dict_item)手动添加,
|
||||
可以直接在「系统管理-菜单管理 / 字典管理」界面配置,也可以执行文末附带的 SQL(幂等,可重复执行)。
|
||||
每项都标注了用途,若目标环境已存在同名项请跳过。
|
||||
|
||||
----------------------------------------------------------------
|
||||
一、按钮权限(sys_menu,menu_type='2')
|
||||
----------------------------------------------------------------
|
||||
挂载位置建议:挂在对应页面的父菜单下(与 hard_hardManager_view 同级)。
|
||||
|
||||
1. hard_hardTerminalLogFile_view 终端日志-查看 (终端日志页面 + 设备详情页日志区)
|
||||
2. hard_hardTerminalLogFile_preview 终端日志-预览
|
||||
3. hard_hardTerminalLogFile_down 终端日志-下载
|
||||
4. hard_hardTerminalLogFile_pull 终端日志-拉取
|
||||
5. hard_hardManager_printer_bind 设备管理-绑定打印机 (设备详情页打印配置区)
|
||||
6. hard_hardManager_export 设备管理-导出 (设备列表导出按钮,若已有则跳过)
|
||||
7. hard_hardInvoice_voucher_reprint 发票凭证-重打兑换券(打印任务弹窗重打,若不需要可不加)
|
||||
|
||||
----------------------------------------------------------------
|
||||
二、页面菜单(sys_menu,menu_type='1',动态路由)
|
||||
----------------------------------------------------------------
|
||||
1. 终端日志(机器日志)
|
||||
路径 path:/hard/hard-terminal-log-file/index
|
||||
权限标识:hard_hardTerminalLogFile_view
|
||||
2. 消费机日志
|
||||
路径 path:/hard/xfj/xfj-log/index
|
||||
权限标识:(查看权限可留空或自定 hard_xfjLog_view,页面本身无按钮权限)
|
||||
|
||||
说明:
|
||||
- 设备详情页 /hard/hard-manager/details 已由前端静态路由注册(isHide),无需配菜单。
|
||||
- 售后订单详情 order-refund 沿用目标库已有菜单,无需改动。
|
||||
|
||||
----------------------------------------------------------------
|
||||
三、字典(sys_dict + sys_dict_item)
|
||||
----------------------------------------------------------------
|
||||
1. hard_type(设备类型,已有字典,补充缺失项):
|
||||
- 9 云版消费机
|
||||
- 12 尔印打印机器
|
||||
(若已有 10/11 云音响等项则不动)
|
||||
2. 新增 hard_print_type(打印凭证类型):
|
||||
- 1 发票
|
||||
- 2 兑换券
|
||||
3. 新增 hard_print_status(打印任务状态):
|
||||
- 0 待生成
|
||||
- 1 待打印
|
||||
- 2 已打印
|
||||
- 3 打印失败
|
||||
- 4 已取消
|
||||
4. 可选:hard_appt_reserve_mode(预约模式,售后详情页预约信息列显示用;
|
||||
目标库若无此字典该列显示空,不影响其他功能)
|
||||
|
||||
----------------------------------------------------------------
|
||||
四、附:可直接执行的幂等 SQL(按需使用,执行前请备份)
|
||||
----------------------------------------------------------------
|
||||
-- 1. hard_type 补类型 9/12(每个已配置 hard_type 的租户幂等插入)
|
||||
SET @dict_item_id_base = (SELECT GREATEST(COALESCE(MAX(`id`), 0), 2026090800000000000) FROM `pjcloudx`.`sys_dict_item`);
|
||||
INSERT INTO `pjcloudx`.`sys_dict_item`
|
||||
(`id`, `dict_id`, `item_value`, `label`, `dict_type`, `description`, `sort_order`, `create_by`, `create_time`, `remarks`, `del_flag`, `tenant_id`)
|
||||
SELECT @dict_item_id_base + ROW_NUMBER() OVER (ORDER BY d.`tenant_id`, item.`item_value`),
|
||||
d.`id`, item.`item_value`, item.`label`, 'hard_type', item.`label`, CAST(item.`item_value` AS SIGNED),
|
||||
'system', NOW(), item.`label`, '0', d.`tenant_id`
|
||||
FROM `pjcloudx`.`sys_dict` d
|
||||
JOIN (
|
||||
SELECT '9' AS `item_value`, '云版消费机' AS `label`
|
||||
UNION ALL SELECT '12', '尔印打印机器'
|
||||
) item
|
||||
WHERE d.`dict_type` = 'hard_type' AND d.`del_flag` = '0'
|
||||
AND NOT EXISTS (
|
||||
SELECT 1 FROM `pjcloudx`.`sys_dict_item` i
|
||||
WHERE i.`tenant_id` = d.`tenant_id` AND i.`dict_type` = 'hard_type'
|
||||
AND i.`item_value` = item.`item_value` AND i.`del_flag` = '0'
|
||||
);
|
||||
SET @dict_item_id_base = NULL;
|
||||
|
||||
-- 2. hard_print_type / hard_print_status 字典(按租户幂等创建)
|
||||
SET @dict_id_base = (SELECT GREATEST(COALESCE(MAX(`id`), 0), 2026090800000000000) FROM `pjcloudx`.`sys_dict`);
|
||||
INSERT INTO `pjcloudx`.`sys_dict`
|
||||
(`id`, `dict_type`, `description`, `create_by`, `create_time`, `remarks`, `system_flag`, `del_flag`, `tenant_id`)
|
||||
SELECT @dict_id_base + ROW_NUMBER() OVER (ORDER BY tenant.`tenant_id`, t.`dict_type`),
|
||||
t.`dict_type`, t.`description`, 'system', NOW(), t.`description`, '1', '0', tenant.`tenant_id`
|
||||
FROM (SELECT DISTINCT `tenant_id` FROM `pjcloudx`.`sys_dict` WHERE `del_flag` = '0') tenant
|
||||
CROSS JOIN (
|
||||
SELECT 'hard_print_type' AS `dict_type`, '打印凭证类型' AS `description`
|
||||
UNION ALL SELECT 'hard_print_status', '打印任务状态'
|
||||
) t
|
||||
WHERE NOT EXISTS (
|
||||
SELECT 1 FROM `pjcloudx`.`sys_dict` d
|
||||
WHERE d.`tenant_id` = tenant.`tenant_id` AND d.`dict_type` = t.`dict_type` AND d.`del_flag` = '0'
|
||||
);
|
||||
SET @dict_id_base = NULL;
|
||||
|
||||
SET @dict_item_id_base = (SELECT GREATEST(COALESCE(MAX(`id`), 0), 2026090800000000000) FROM `pjcloudx`.`sys_dict_item`);
|
||||
INSERT INTO `pjcloudx`.`sys_dict_item`
|
||||
(`id`, `dict_id`, `item_value`, `label`, `dict_type`, `description`, `sort_order`, `create_by`, `create_time`, `del_flag`, `tenant_id`)
|
||||
SELECT @dict_item_id_base + ROW_NUMBER() OVER (ORDER BY d.`tenant_id`, d.`dict_type`, item.`sort_order`, item.`item_value`),
|
||||
d.`id`, item.`item_value`, item.`label`, d.`dict_type`, item.`label`, item.`sort_order`,
|
||||
'system', NOW(), '0', d.`tenant_id`
|
||||
FROM `pjcloudx`.`sys_dict` d
|
||||
JOIN (
|
||||
SELECT 'hard_print_type' AS `dict_type`, '1' AS `item_value`, '发票' AS `label`, 1 AS `sort_order`
|
||||
UNION ALL SELECT 'hard_print_type', '2', '兑换券', 2
|
||||
UNION ALL SELECT 'hard_print_status', '0', '待生成', 0
|
||||
UNION ALL SELECT 'hard_print_status', '1', '待打印', 1
|
||||
UNION ALL SELECT 'hard_print_status', '2', '已打印', 2
|
||||
UNION ALL SELECT 'hard_print_status', '3', '打印失败', 3
|
||||
UNION ALL SELECT 'hard_print_status', '4', '已取消', 4
|
||||
) item ON item.`dict_type` = d.`dict_type`
|
||||
WHERE d.`del_flag` = '0'
|
||||
AND NOT EXISTS (
|
||||
SELECT 1 FROM `pjcloudx`.`sys_dict_item` i
|
||||
WHERE i.`tenant_id` = d.`tenant_id` AND i.`dict_type` = d.`dict_type`
|
||||
AND i.`item_value` = item.`item_value` AND i.`del_flag` = '0'
|
||||
);
|
||||
SET @dict_item_id_base = NULL;
|
||||
|
||||
-- 3. 按钮权限(挂到已有父权限所在菜单下,menu_type='2')
|
||||
-- 先在界面确认父菜单,或使用下面按 permission 定位父菜单的幂等插入:
|
||||
SET @menu_id_base = (SELECT GREATEST(COALESCE(MAX(`menu_id`), 0), 2026090800000000000) FROM `pjcloudx`.`sys_menu`);
|
||||
INSERT INTO `pjcloudx`.`sys_menu`
|
||||
(`menu_id`, `name`, `permission`, `parent_id`, `visible`, `sort_order`, `keep_alive`, `embedded`, `menu_type`, `create_by`, `create_time`, `del_flag`, `tenant_id`)
|
||||
SELECT @menu_id_base + ROW_NUMBER() OVER (ORDER BY p.`tenant_id`, p.`menu_id`, item.`permission`),
|
||||
item.`name`, item.`permission`, p.`menu_id`, '1', 20, '0', '0', '2', 'system', NOW(), '0', p.`tenant_id`
|
||||
FROM `pjcloudx`.`sys_menu` p
|
||||
JOIN (
|
||||
SELECT 'hard_hardTerminalLogFile_view' AS `permission`, '终端日志查看' AS `name`, 'hard_hardManager_view' AS `parent_permission`
|
||||
UNION ALL SELECT 'hard_hardTerminalLogFile_preview', '终端日志预览', 'hard_hardManager_view'
|
||||
UNION ALL SELECT 'hard_hardTerminalLogFile_down', '终端日志下载', 'hard_hardManager_view'
|
||||
UNION ALL SELECT 'hard_hardTerminalLogFile_pull', '终端日志拉取', 'hard_hardManager_view'
|
||||
UNION ALL SELECT 'hard_hardManager_printer_bind', '绑定打印机', 'hard_hardManager_view'
|
||||
UNION ALL SELECT 'hard_hardManager_export', '导出设备', 'hard_hardManager_view'
|
||||
UNION ALL SELECT 'hard_hardInvoice_voucher_reprint', '重打兑换券', 'hard_hardInvoice_view'
|
||||
) item ON item.`parent_permission` = p.`permission`
|
||||
WHERE p.`del_flag` = '0'
|
||||
AND NOT EXISTS (
|
||||
SELECT 1 FROM `pjcloudx`.`sys_menu` e
|
||||
WHERE e.`tenant_id` = p.`tenant_id` AND e.`permission` = item.`permission` AND e.`del_flag` = '0'
|
||||
);
|
||||
SET @menu_id_base = NULL;
|
||||
|
||||
-- 4. 页面菜单(终端日志 / 消费机日志)—— parent_id 请替换为实际的「设备管理/硬件」目录菜单ID
|
||||
-- (建议直接在菜单管理界面添加,下面仅作字段参考)
|
||||
-- INSERT INTO `pjcloudx`.`sys_menu`
|
||||
-- (`menu_id`,`name`,`permission`,`path`,`parent_id`,`icon`,`visible`,`sort_order`,`keep_alive`,`embedded`,`menu_type`,`create_by`,`create_time`,`del_flag`,`tenant_id`)
|
||||
-- VALUES
|
||||
-- (自定义ID, '终端日志', 'hard_hardTerminalLogFile_view', '/hard/hard-terminal-log-file/index', <父菜单ID>, NULL, '1', 100, '0', NULL, '1', 'admin', NOW(), '0', 1),
|
||||
-- (自定义ID, '消费机日志', NULL, '/hard/xfj/xfj-log/index', <父菜单ID>, NULL, '1', 101, '0', NULL, '1', 'admin', NOW(), '0', 1);
|
||||
|
||||
----------------------------------------------------------------
|
||||
五、数据库迁移 SQL 执行顺序(pj_service_cloud/db/ 下本次新增)
|
||||
----------------------------------------------------------------
|
||||
1. 20260908_add_hard_terminal_status.sql
|
||||
2. 20260908_add_hard_terminal_log_file.sql
|
||||
3. 20260908_add_hard_order_evidence_image.sql
|
||||
4. 20260908_add_hard_printer.sql (含 hard_invoice 打印任务化,注意先备份)
|
||||
5. 20260908_add_hard_xfj_log.sql
|
||||
6. 20260908_add_hard_order_verification_time.sql
|
||||
+151
-15
@@ -177,22 +177,83 @@ CREATE TABLE hard_group
|
||||
DROP TABLE IF EXISTS `hard_invoice`;
|
||||
CREATE TABLE hard_invoice
|
||||
(
|
||||
id bigint NOT NULL COMMENT '编号',
|
||||
dept_id bigint NOT NULL COMMENT '部门id',
|
||||
hard_id bigint NOT NULL COMMENT '设备id',
|
||||
order_id bigint NOT NULL COMMENT '硬件订单id',
|
||||
status char(10) NOT NULL COMMENT '状态',
|
||||
pic varchar(256) NOT NULL COMMENT '发票图片',
|
||||
create_by varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人',
|
||||
create_time datetime DEFAULT NULL COMMENT '创建时间',
|
||||
update_by varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '修改人',
|
||||
update_time datetime DEFAULT NULL COMMENT '修改时间',
|
||||
del_flag char(1) COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记',
|
||||
tenant_id bigint DEFAULT NULL COMMENT '租户ID',
|
||||
PRIMARY KEY (id)
|
||||
id bigint NOT NULL COMMENT '编号',
|
||||
dept_id bigint NOT NULL COMMENT '部门id',
|
||||
hard_id bigint DEFAULT NULL COMMENT '来源业务或核销终端id',
|
||||
printer_hard_id bigint DEFAULT NULL COMMENT '目标尔印打印终端id',
|
||||
order_id bigint NOT NULL COMMENT '硬件订单id',
|
||||
print_type char(2) NOT NULL DEFAULT '1' COMMENT '打印类型,1发票、2兑换券',
|
||||
print_no int NOT NULL DEFAULT 1 COMMENT '同订单同类型打印序号',
|
||||
retry_version int NOT NULL DEFAULT 0 COMMENT '人工失败重试版本',
|
||||
attempt_count int NOT NULL DEFAULT 0 COMMENT '终端USB累计尝试次数',
|
||||
status char(10) NOT NULL DEFAULT '0' COMMENT '状态,0待生成、1待打印、2已打印、3打印失败、4已取消',
|
||||
failure_stage varchar(32) DEFAULT NULL COMMENT '失败阶段',
|
||||
last_error varchar(2000) DEFAULT NULL COMMENT '最近失败摘要',
|
||||
printed_at datetime DEFAULT NULL COMMENT '终端确认写入成功时间',
|
||||
reprint_reason varchar(500) DEFAULT NULL COMMENT '人工重打或再次核销原因',
|
||||
pic varchar(512) DEFAULT NULL COMMENT '后端生成的打印PNG地址',
|
||||
create_by varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人',
|
||||
create_time datetime DEFAULT NULL COMMENT '创建时间',
|
||||
update_by varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '修改人',
|
||||
update_time datetime DEFAULT NULL COMMENT '修改时间',
|
||||
del_flag char(1) COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记',
|
||||
tenant_id bigint DEFAULT NULL COMMENT '租户ID',
|
||||
PRIMARY KEY (id),
|
||||
UNIQUE KEY uk_hard_invoice_order_type_no (tenant_id, order_id, print_type, print_no),
|
||||
KEY idx_hard_invoice_printer_status (tenant_id, printer_hard_id, status, update_time, del_flag),
|
||||
KEY idx_hard_invoice_source_status (tenant_id, hard_id, status, del_flag)
|
||||
) ENGINE = InnoDB
|
||||
DEFAULT CHARSET = utf8mb4
|
||||
COLLATE = utf8mb4_general_ci COMMENT ='发票记录';
|
||||
COLLATE = utf8mb4_general_ci COMMENT ='打印任务与凭证记录';
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for hard_printer_binding
|
||||
-- ----------------------------
|
||||
DROP TABLE IF EXISTS `hard_printer_binding`;
|
||||
CREATE TABLE hard_printer_binding
|
||||
(
|
||||
id bigint NOT NULL COMMENT '绑定关系主键',
|
||||
source_hard_id bigint NOT NULL COMMENT 'SUPERMARKET或CANTEEN来源业务终端id',
|
||||
printer_hard_id bigint NOT NULL COMMENT 'EY_PRINT目标打印终端id',
|
||||
merchant_id bigint NOT NULL COMMENT '双方共同所属商户id快照',
|
||||
dept_id bigint NOT NULL COMMENT '双方共同所属商户部门id快照',
|
||||
create_by varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人',
|
||||
create_time datetime DEFAULT NULL COMMENT '创建时间',
|
||||
update_by varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '修改人',
|
||||
update_time datetime DEFAULT NULL COMMENT '修改时间',
|
||||
tenant_id bigint 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 ='业务终端与尔印打印终端一对一绑定';
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for hard_printer_config
|
||||
-- ----------------------------
|
||||
DROP TABLE IF EXISTS `hard_printer_config`;
|
||||
CREATE TABLE hard_printer_config
|
||||
(
|
||||
id bigint NOT NULL COMMENT '配置主键',
|
||||
printer_hard_id bigint NOT NULL COMMENT 'EY_PRINT打印终端id',
|
||||
printer_model varchar(128) DEFAULT NULL COMMENT '打印机型号',
|
||||
usb_vendor_id int DEFAULT NULL COMMENT 'USB Vendor ID十进制值',
|
||||
usb_product_id int DEFAULT NULL COMMENT 'USB Product ID十进制值',
|
||||
paper_width int 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) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人',
|
||||
create_time datetime DEFAULT NULL COMMENT '创建时间',
|
||||
update_by varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '修改人',
|
||||
update_time datetime DEFAULT NULL COMMENT '修改时间',
|
||||
tenant_id bigint 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配置';
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for hard_car
|
||||
@@ -311,6 +372,50 @@ CREATE TABLE hard_order
|
||||
PRIMARY KEY (id)
|
||||
) ENGINE = InnoDB COMMENT ='订单表';
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for hard_order_evidence_image
|
||||
-- ----------------------------
|
||||
DROP TABLE IF EXISTS `hard_order_evidence_image`;
|
||||
CREATE TABLE hard_order_evidence_image
|
||||
(
|
||||
id bigint NOT NULL AUTO_INCREMENT COMMENT '证据记录自增主键',
|
||||
order_id bigint NOT NULL COMMENT '订单主键,来源hard_order.id',
|
||||
android_order_code varchar(128) NOT NULL COMMENT '终端本地稳定订单号快照',
|
||||
evidence_type varchar(32) NOT NULL COMMENT '证据类型,FACE_RECOGNITION或MENU_RECOGNITION',
|
||||
evidence_role varchar(32) NOT NULL COMMENT '图片角色,FACE_REFERENCE、FACE_LIVE或MENU_LIVE',
|
||||
sequence_no int NOT NULL DEFAULT 0 COMMENT '同类型同角色图片序号,从0开始',
|
||||
user_id bigint DEFAULT NULL COMMENT '识别用户主键快照',
|
||||
face_sample_id varchar(64) DEFAULT NULL COMMENT '虹软人脸样本编号快照',
|
||||
reference_image_url varchar(512) DEFAULT NULL COMMENT '识别时后台参考人脸来源地址快照,不作为展示地址',
|
||||
similarity decimal(8, 6) DEFAULT NULL COMMENT '识别相似度快照,取值0至1',
|
||||
similarity_threshold decimal(8, 6) DEFAULT NULL COMMENT '终端生效的相似度阈值快照,取值0至1',
|
||||
hard_id bigint NOT NULL COMMENT '产生证据的设备主键',
|
||||
captured_at datetime DEFAULT NULL COMMENT '终端实际采集时间',
|
||||
sys_file_id bigint DEFAULT NULL COMMENT '文件中心sys_file记录主键',
|
||||
storage_file_name varchar(255) DEFAULT NULL COMMENT '文件中心对象名',
|
||||
image_url varchar(512) DEFAULT NULL COMMENT '订单证据图片访问地址',
|
||||
image_hash char(64) DEFAULT NULL COMMENT '实际文件SHA-256哈希',
|
||||
image_size bigint DEFAULT NULL COMMENT '实际文件大小,单位字节',
|
||||
image_width int DEFAULT NULL COMMENT '实际图片宽度,单位像素',
|
||||
image_height int DEFAULT NULL COMMENT '实际图片高度,单位像素',
|
||||
status varchar(32) NOT NULL COMMENT '证据状态,PENDING、AVAILABLE或UNAVAILABLE',
|
||||
failure_reason varchar(500) DEFAULT NULL COMMENT '永久缺失或复制失败摘要,不保存终端完整路径',
|
||||
app_version varchar(64) DEFAULT NULL COMMENT '产生证据的终端应用版本',
|
||||
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 '修改时间',
|
||||
del_flag char(1) DEFAULT '0' COMMENT '逻辑删除标记,0有效,1删除',
|
||||
tenant_id bigint NOT NULL COMMENT '租户主键',
|
||||
PRIMARY KEY (id),
|
||||
UNIQUE KEY uk_hard_order_evidence_position
|
||||
(tenant_id, order_id, evidence_type, evidence_role, sequence_no, del_flag),
|
||||
KEY idx_hard_order_evidence_android_order
|
||||
(tenant_id, hard_id, android_order_code, del_flag),
|
||||
KEY idx_hard_order_evidence_status
|
||||
(tenant_id, status, update_time, del_flag)
|
||||
) ENGINE = InnoDB COMMENT ='硬件订单识别证据图片';
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for hard_after_sale
|
||||
-- ----------------------------
|
||||
@@ -599,4 +704,35 @@ CREATE TABLE hard_third_mi_order
|
||||
del_flag char(1) COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记',
|
||||
tenant_id bigint DEFAULT NULL COMMENT '租户ID',
|
||||
PRIMARY KEY (id)
|
||||
) ENGINE = InnoDB COMMENT ='硬件商品免密订单';
|
||||
) ENGINE = InnoDB COMMENT ='硬件商品免密订单';
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for hard_xfj_log
|
||||
-- ----------------------------
|
||||
DROP TABLE IF EXISTS `hard_xfj_log`;
|
||||
CREATE TABLE hard_xfj_log
|
||||
(
|
||||
id bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
|
||||
unique_code varchar(64) NOT NULL COMMENT '设备唯一编号',
|
||||
hard_type varchar(32) NOT NULL COMMENT '设备类型',
|
||||
title varchar(64) NOT NULL COMMENT '接口标题',
|
||||
headers varchar(2048) COMMENT 'headers',
|
||||
res varchar(2048) COMMENT 'res',
|
||||
req varchar(2048) COMMENT 'req',
|
||||
error varchar(2048) COMMENT 'error',
|
||||
start_time datetime DEFAULT NULL COMMENT '开始时间',
|
||||
end_time datetime DEFAULT NULL COMMENT '结束时间',
|
||||
cost int DEFAULT NULL COMMENT '耗时(毫秒)',
|
||||
create_by varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人',
|
||||
create_time datetime DEFAULT NULL COMMENT '创建时间',
|
||||
update_by varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '修改人',
|
||||
update_time datetime DEFAULT NULL COMMENT '修改时间',
|
||||
del_flag char(1) COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记',
|
||||
tenant_id bigint DEFAULT NULL COMMENT '租户ID',
|
||||
PRIMARY KEY (id),
|
||||
UNIQUE KEY idx_unique_code (unique_code),
|
||||
KEY idx_hard_type (hard_type),
|
||||
KEY idx_title (title),
|
||||
KEY idx_start_time (start_time),
|
||||
KEY idx_end_time (end_time)
|
||||
) ENGINE = InnoDB COMMENT ='消费机日志';
|
||||
@@ -374,6 +374,8 @@ CREATE TABLE wallet_transaction
|
||||
title varchar(128) NOT NULL COMMENT '流水标题',
|
||||
price int NOT NULL COMMENT '交易金额, 单位分',
|
||||
balance int NOT NULL COMMENT '余额, 单位分',
|
||||
tags varchar(512) DEFAULT NULL COMMENT '财务统计标签,多个wallet_transaction_tag字典值使用英文逗号分隔',
|
||||
remark varchar(256) DEFAULT NULL COMMENT '流水备注,最多256个字符',
|
||||
create_by varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人',
|
||||
create_time datetime DEFAULT NULL COMMENT '创建时间',
|
||||
update_by varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '修改人',
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
-- 线上慢 SQL 索引优化(OceanBase MySQL 模式)
|
||||
-- 执行前请确认同名索引不存在;建议低峰期逐条执行并观察建索引耗时。
|
||||
-- 本文件只包含索引 DDL,不包含任何数据修改。
|
||||
|
||||
-- P0:订单列表按租户、删除标记、创建时间倒序分页。
|
||||
CREATE INDEX idx_hard_order_tenant_del_ct_uid
|
||||
ON pjcloudx_hardware.hard_order (tenant_id, del_flag, create_time, user_id);
|
||||
|
||||
-- P0:订单号 + 订单类型 + 状态精确计数。
|
||||
CREATE INDEX idx_hard_order_tenant_del_order_lookup
|
||||
ON pjcloudx_hardware.hard_order (tenant_id, del_flag, order_no, order_type, order_status);
|
||||
|
||||
-- P0:设备侧订单号精确查询。
|
||||
CREATE INDEX idx_hard_order_tenant_del_android_code
|
||||
ON pjcloudx_hardware.hard_order (tenant_id, del_flag, android_order_code);
|
||||
|
||||
-- P0:每个订单取最新售后记录(GROUP BY order_id + MAX(id))。
|
||||
CREATE INDEX idx_hard_after_sale_tenant_order_id
|
||||
ON pjcloudx_hardware.hard_after_sale (tenant_id, order_id, id);
|
||||
|
||||
-- P0:钱包流水按业务类型、时间倒序分页;biz_type 为 TINYTEXT,使用前缀索引。
|
||||
CREATE INDEX idx_wallet_tx_tenant_del_ct_uid
|
||||
ON pjcloudx_wallet.wallet_transaction (tenant_id, del_flag, create_time, user_id);
|
||||
|
||||
-- P0:钱包流水按业务类型、时间倒序分页;biz_type 为 TINYTEXT,使用前缀索引。
|
||||
CREATE INDEX idx_wallet_tx_tenant_del_biz_ct_uid
|
||||
ON pjcloudx_wallet.wallet_transaction (tenant_id, del_flag, biz_type(8), create_time, user_id);
|
||||
|
||||
-- P0:流程历史按办理人查询并按结束时间倒序。
|
||||
CREATE INDEX idx_act_hi_actinst_assignee_end
|
||||
ON pjcloudx_flow.act_hi_actinst (ASSIGNEE_, END_TIME_);
|
||||
|
||||
-- P1:支付状态 + 支付时间统计。先观察 P0 上线后的实际收益,再决定是否执行。
|
||||
-- CREATE INDEX idx_hard_order_tenant_del_status_ptime_mch
|
||||
-- ON pjcloudx_hardware.hard_order (tenant_id, del_flag, order_status, pay_time, merchant_id);
|
||||
|
||||
-- P1:指定商户部门的支付统计。索引较宽,按接口频率决定是否执行。
|
||||
-- CREATE INDEX idx_hard_order_tenant_del_mdept_status_mt_ptime
|
||||
-- ON pjcloudx_hardware.hard_order
|
||||
-- (tenant_id, del_flag, merchant_dept_id, order_status, merchant_type, pay_time);
|
||||
|
||||
-- P1:按钱包所属部门定位钱包 ID;维表较小时收益有限。
|
||||
-- CREATE INDEX idx_wallet_manage_tenant_dept_id
|
||||
-- ON pjcloudx_wallet.wallet_manage (tenant_id, dept_id, id);
|
||||
@@ -0,0 +1,54 @@
|
||||
# 线上慢 SQL 索引优化分析(2026-08-26)
|
||||
|
||||
## 数据范围
|
||||
|
||||
- 来源:`/Users/dengzhangchen/Downloads/rm-1fyg92tzhbt23g9hw_slowlog_*.csv`
|
||||
- 原始记录:638 条;按完整请求字段去重后 608 条;63 个 SQL Hash。
|
||||
- 数据库分布:`pjcloudx_hardware` 451 条、`pjcloudx_wallet` 153 条、`pjcloudx_flow` 4 条。
|
||||
- 主要扫描表:`hard_order`、`hard_after_sale`、`wallet_transaction`、`act_hi_actinst`。
|
||||
- 测试连接:OceanBase CE 4.3.5.5,MySQL 兼容模式;读取 `SHOW CREATE TABLE`、`SHOW INDEX`、`EXPLAIN`,并在测试库临时创建/回滚候选索引;未在生产库执行 DDL。
|
||||
|
||||
## 结论
|
||||
|
||||
### 强推荐,先上线
|
||||
|
||||
| 优先级 | 数据库/表 | 建议索引 | 主要覆盖日志 | 依据 |
|
||||
|---|---|---|---|---|
|
||||
| P0 | `pjcloudx_hardware.hard_order` | `(tenant_id, del_flag, create_time, user_id)` | 订单列表、分页 COUNT,Hash `270048891%7C1391`、`528608244%7C616` 等 | 现有索引的第三列是 `merchant_id` 或 `user_id`,无法同时支撑租户+删除标记后的时间倒序;临时索引验证后由扫描+TOP-N 变为反向范围扫描。 |
|
||||
| P0 | `pjcloudx_hardware.hard_order` | `(tenant_id, del_flag, order_no, order_type, order_status)` | 订单号精确 COUNT,Hash `_1019382644%7C138` | 原执行计划只能在统计索引上按 `order_status` 扫描,再回表过滤订单号/类型;临时索引验证为三列等值范围扫描。 |
|
||||
| P0 | `pjcloudx_hardware.hard_order` | `(tenant_id, del_flag, android_order_code)` | 设备订单号查询,Hash `_986870313%7C628` | 原计划扫描约 98 万行后回表过滤 `android_order_code`;临时索引验证为等值范围扫描。 |
|
||||
| P0 | `pjcloudx_hardware.hard_after_sale` | `(tenant_id, order_id, id)` | 订单列表中的“每单最新售后”子查询,覆盖 233 条相关记录 | 原表只有主键,`GROUP BY order_id + MAX(id)` 为全表扫描;临时索引验证后为有序范围扫描并使用 Merge Group By。 |
|
||||
| P0 | `pjcloudx_wallet.wallet_transaction` | `(tenant_id, del_flag, create_time, user_id)` | 无业务类型条件的钱包流水首页,Hash `698590166%7C408` | 原计划全表扫描并排序;临时索引验证后为反向范围扫描,直接取前 10 行。 |
|
||||
| P0 | `pjcloudx_wallet.wallet_transaction` | `(tenant_id, del_flag, biz_type(8), create_time, user_id)` | 钱包流水按业务类型筛选列表/COUNT,Hash `2036241023%7C466`、`255738862%7C620` 等 | `biz_type` 是 `TINYTEXT`,必须使用前缀索引;临时索引验证后可按租户、删除标记、业务类型及时间范围扫描。 |
|
||||
| P0 | `pjcloudx_flow.act_hi_actinst` | `(ASSIGNEE_, END_TIME_)` | 流程历史待办查询,Hash `_2096433074%7C126` | 原计划全表扫描并排序;临时索引验证后为反向范围扫描,直接满足 `ORDER BY END_TIME_ DESC LIMIT 10`。 |
|
||||
|
||||
### 条件推荐,先观察资源与收益
|
||||
|
||||
| 优先级 | 建议索引 | 适用场景 | 说明 |
|
||||
|---|---|---|---|
|
||||
| P1 | `pjcloudx_hardware.hard_order (tenant_id, del_flag, order_status, pay_time, merchant_id)` | 按支付状态+支付时间汇总,Hash `_1655261703%7C470` 等 | 临时索引可将范围缩小到状态/时间,但仍需要回表和聚合;建议 P0 上线后按 `EXPLAIN` 和实际耗时决定。 |
|
||||
| P1 | `pjcloudx_hardware.hard_order (tenant_id, del_flag, merchant_dept_id, order_status, merchant_type, pay_time)` | 指定商户部门的支付统计,Hash `1634334540%7C358` 等 | 对指定部门过滤收益明显;宽索引写放大较大,先对高频租户/接口评估。 |
|
||||
| P1 | `pjcloudx_wallet.wallet_manage (tenant_id, dept_id, id)` | 钱包按部门聚合 | 仅用于小维表定位钱包 ID;表规模较小时收益有限,适合与钱包统计接口一起验证。 |
|
||||
|
||||
## 暂不建议只靠加索引解决
|
||||
|
||||
- 统计类 SQL 使用派生表、外层权限过滤和 `ORDER BY CASE`,索引只能减少底层扫描,不能消除派生表物化/聚合成本;建议后续改为先过滤再聚合,并移除 COUNT 查询中的无意义排序。
|
||||
- `hard_order` 订单详情列表反复 `LEFT JOIN` 最新售后子查询;P0 索引后仍建议将“最新售后 ID”改为窗口/预聚合或单独维护字段。
|
||||
- `UPDATE hard_door_cabinet ... WHERE id = ? AND del_flag = ? AND tenant_id = ?` 已命中主键 `id`,慢点更可能是锁等待、事务或网络;加索引不能解决,需结合 `SHOW PROCESSLIST`、锁等待和事务耗时排查。
|
||||
|
||||
## 上线步骤
|
||||
|
||||
1. 低峰期逐条执行 `01_add_indexes.sql`,每条 DDL 单独观察完成时间和租户延迟。
|
||||
2. 执行前确认同名索引不存在;OceanBase 建索引可能持续几十秒到数分钟,不要重复提交。
|
||||
3. DDL 完成后对代表性 SQL 执行 `EXPLAIN`,确认使用新索引且不出现 `TABLE FULL SCAN`。
|
||||
4. 观察 15–30 分钟慢 SQL、CPU、IO、事务提交延迟;若写入延迟明显,再评估 P1 索引。
|
||||
5. 统计接口仍慢时,优先改写 SQL,再考虑继续增加宽复合索引。
|
||||
|
||||
## 验证记录
|
||||
|
||||
临时索引均已在测试库创建并回滚,最终检查无 `tmp_%` 索引残留。验证结果:
|
||||
|
||||
- 订单时间分页:`TABLE RANGE SCAN ... Reverse`,不再全表扫描/大范围 TOP-N。
|
||||
- 钱包业务流水:`TABLE RANGE SCAN ... Reverse`,`biz_type(8)` 前缀索引可用。
|
||||
- 最新售后:`MERGE GROUP BY` + `TABLE RANGE SCAN`,不再全表扫描。
|
||||
- 流程历史:`TABLE RANGE SCAN ... Reverse`,不再全表扫描。
|
||||
Reference in new issue
Block a user