diff --git a/dev/RuoYi-Vue2-master/src/views/apt/jcxx/index.vue b/dev/RuoYi-Vue2-master/src/views/apt/jcxx/index.vue
index 1deed67..84795c0 100644
--- a/dev/RuoYi-Vue2-master/src/views/apt/jcxx/index.vue
+++ b/dev/RuoYi-Vue2-master/src/views/apt/jcxx/index.vue
@@ -140,7 +140,7 @@
-
+
详情
+ 复叫
{
+ this.recallingId = row.id
+ return submitJcxxCommand(row.id, {
+ commandId: 'UIR-' + Date.now() + '-' + Math.random().toString(36).slice(2, 8),
+ command: 'RE_CALL',
+ reason: '管理端手动复叫'
+ })
+ })
+ .then(response => {
+ const result = (response && response.data) || {}
+ this.$modal.msgSuccess(
+ result.duplicated ? '命令重复,已按幂等处理(未再次复叫)' : '复叫已提交:' + (result.stateAfter || '')
+ )
+ this.getList()
+ })
+ .catch(error => {
+ // 取消确认框时不提示业务错误
+ if (error === 'cancel' || error === 'close') {
+ return
+ }
+ const picked = pickAptError(error)
+ this.$modal.msgError(formatAptError(picked.code, picked.reason))
+ })
+ .finally(() => {
+ this.recallingId = null
+ })
+ },
openCommand(row) {
this.currentRow = row
this.commandForm = { command: 'STOP', leaveType: 'MANUAL', reason: '' }
diff --git a/dev/sql/apt_rev01/36_it7_jcxx_times.sql b/dev/sql/apt_rev01/36_it7_jcxx_times.sql
new file mode 100644
index 0000000..30c1f96
--- /dev/null
+++ b/dev/sql/apt_rev01/36_it7_jcxx_times.sql
@@ -0,0 +1,63 @@
+-- =============================================================================
+-- IT-7 叫乘记录三时间字段(可重放)
+-- 依据:叫乘任务要求「每条记录包含 叫乘时间 / 复叫时间 / 应离寓时间」,
+-- 到点分别触发:首轮呼叫、自动复叫、离寓报警。
+-- 口径:
+-- 1) jcsj 已存在(叫乘时间,权威);本次只补 fjsj(复叫时间,计划)与
+-- ylysj(应离寓时间);
+-- 2) fjsj 与既有 fjsj_s 分工:fjsj=计划复叫时间(到点判定),
+-- fjsj_s=实际复叫时刻(执行留痕,防重复触发);
+-- 3) ryzt / finish_jc / finish_ly / stoped 仍只有 apt.duty.state 一个写入口,
+-- 本脚本不写任何业务数据;
+-- 4) 幂等:补列走 apt_add_column_if_missing,索引先查 information_schema。
+-- =============================================================================
+SET NAMES utf8mb4;
+
+-- -----------------------------------------------------------------------------
+-- 1. gy_jcxx 三时间字段补齐
+-- -----------------------------------------------------------------------------
+CALL apt_add_column_if_missing('gy_jcxx', 'fjsj',
+ "fjsj DATETIME(3) NULL COMMENT '复叫时间(计划;到点自动复叫)'");
+
+CALL apt_add_column_if_missing('gy_jcxx', 'ylysj',
+ "ylysj DATETIME(3) NULL COMMENT '应离寓时间(到点未离寓转离寓报警)'");
+
+-- -----------------------------------------------------------------------------
+-- 2. 到点扫描索引(复叫到点 + 应离寓超时)
+-- -----------------------------------------------------------------------------
+SET @apt_idx_fjsj = (SELECT COUNT(*) FROM information_schema.STATISTICS
+ WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'gy_jcxx'
+ AND INDEX_NAME = 'idx_jcxx_fjsj');
+SET @apt_sql_fjsj = IF(@apt_idx_fjsj = 0,
+ 'ALTER TABLE gy_jcxx ADD KEY idx_jcxx_fjsj (gyid, fjsj)',
+ 'SELECT 1');
+PREPARE apt_stmt_fjsj FROM @apt_sql_fjsj;
+EXECUTE apt_stmt_fjsj;
+DEALLOCATE PREPARE apt_stmt_fjsj;
+
+SET @apt_idx_ylysj = (SELECT COUNT(*) FROM information_schema.STATISTICS
+ WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'gy_jcxx'
+ AND INDEX_NAME = 'idx_jcxx_ylysj');
+SET @apt_sql_ylysj = IF(@apt_idx_ylysj = 0,
+ 'ALTER TABLE gy_jcxx ADD KEY idx_jcxx_ylysj (gyid, ylysj)',
+ 'SELECT 1');
+PREPARE apt_stmt_ylysj FROM @apt_sql_ylysj;
+EXECUTE apt_stmt_ylysj;
+DEALLOCATE PREPARE apt_stmt_ylysj;
+
+-- -----------------------------------------------------------------------------
+-- 3. 校验
+-- -----------------------------------------------------------------------------
+SELECT '=== IT-7 gy_jcxx 三时间字段(应 3:jcsj / fjsj / ylysj)===' AS section;
+SELECT COLUMN_NAME, COLUMN_TYPE, IS_NULLABLE, COLUMN_COMMENT
+FROM information_schema.COLUMNS
+WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'gy_jcxx'
+ AND COLUMN_NAME IN ('jcsj','fjsj','ylysj')
+ORDER BY COLUMN_NAME;
+
+SELECT '=== IT-7 到点扫描索引(应 2)===' AS section;
+SELECT TABLE_NAME, INDEX_NAME, GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX) AS cols
+FROM information_schema.STATISTICS
+WHERE TABLE_SCHEMA = DATABASE()
+ AND INDEX_NAME IN ('idx_jcxx_fjsj','idx_jcxx_ylysj')
+GROUP BY TABLE_NAME, INDEX_NAME;