diff --git a/src/.vuepress/sidebar.ts b/src/.vuepress/sidebar.ts
index dae7dbb..292e527 100644
--- a/src/.vuepress/sidebar.ts
+++ b/src/.vuepress/sidebar.ts
@@ -209,15 +209,22 @@ export default sidebar({
},
{
text: "待办事项",
- icon: "mdi:checklist",
+ icon: "fa6-solid:list-check",
collapsible: true,
children: [
{
text: "待办首页",
+ icon: "mdi:home-outline",
link: "/work/todo/",
},
+ {
+ text: "4月待办",
+ icon: "mdi:calendar-month",
+ link: "/work/todo/2026-04.md",
+ },
{
text: "3月待办",
+ icon: "mdi:calendar-month",
link: "/work/todo/2026-03.md",
},
],
@@ -249,79 +256,88 @@ export default sidebar({
"/ai/": [
{
text: "OpenCode",
- icon: "mdi:application-braces-outline",
+ icon: "fa6-solid:code",
collapsible: true,
children: [
{
text: "opencode-cli",
+ icon: "fa6-solid:terminal",
link: "opencode.md",
},
{
text: "opencode-tui",
+ icon: "fa6-solid:desktop",
link: "opencode-tui.md",
},
],
},
{
text: "Superpowers",
- icon: "mdi:rocket-launch-outline",
+ icon: "fa6-solid:rocket",
collapsible: true,
prefix: "superpowers/",
children: [
{
text: "superpowers-总览",
+ icon: "fa6-solid:eye",
link: "opencode-superpowers-overview.md",
},
{
text: "superpowers",
+ icon: "fa6-solid:bolt",
link: "opencode-superpowers.md",
},
{
text: "skills-使用方案汇总",
+ icon: "fa6-solid:book",
link: "opencode-skills-playbook.md",
},
],
},
{
text: "Claude Code",
- icon: "mdi:source-branch",
+ icon: "fa6-solid:code-branch",
collapsible: true,
children: [
{
text: "多分支工作流实战总结(2026)",
+ icon: "fa6-solid:code-merge",
link: "claude-code-branch-workflow-2026.md",
},
],
},
{
text: "ChatGPT",
- icon: "mdi:chat-processing-outline",
+ icon: "fa6-solid:comments",
collapsible: true,
children: [
{
text: "chatgpt-使用记录与实践",
+ icon: "fa6-solid:message",
link: "chatgpt.md",
},
],
},
{
text: "OpenClaw",
- icon: "mdi:robot-outline",
+ icon: "fa6-solid:robot",
collapsible: true,
children: [
{
text: "openclaw-24h在线部署实战",
+ icon: "fa6-solid:server",
link: "openclaw.md",
},
],
},
{
text: "iFlow",
- icon: "mdi:sitemap-outline",
+ icon: "fa6-solid:diagram-project",
collapsible: true,
children: [
{
text: "iflow-流程编排实践记录",
+ icon: "fa6-solid:flow-chart",
link: "iflow.md",
},
],
diff --git a/src/programming/linux/Linux_Mint/xfce终端常用快捷指令.md b/src/programming/linux/Linux_Mint/xfce终端常用快捷指令.md
index 9b8a6ec..29ac891 100644
--- a/src/programming/linux/Linux_Mint/xfce终端常用快捷指令.md
+++ b/src/programming/linux/Linux_Mint/xfce终端常用快捷指令.md
@@ -49,7 +49,38 @@ XFCE 终端是 Linux Mint XFCE 桌面环境默认的命令行工具,熟练掌
## 二、编辑操作类快捷键
-### 2.1 文本选择与操作
+### 2.1 基础移动快捷键
+
+| 快捷键 | 功能描述 | 使用场景 |
+|--------|----------|----------|
+| `Ctrl + A` | 回到行首 | 快速定位到命令开头修改 |
+| `Ctrl + E` | 回到行尾 | 快速定位到命令结尾补充参数 |
+| `Ctrl + B` / 左箭头 | 向左移动一个字符 | 字符级微调光标位置 |
+| `Ctrl + F` / 右箭头 | 向右移动一个字符 | 字符级微调光标位置 |
+| `Alt + B` | 向左移动一个单词 | 快速按单词跳转编辑长命令 |
+| `Alt + F` | 向右移动一个单词 | 快速按单词跳转编辑长命令 |
+| `Esc + B` | 向左移动一个单词 | Alt+B被终端菜单抢占时的替代方案 |
+| `Esc + F` | 向右移动一个单词 | Alt+F被终端菜单抢占时的替代方案 |
+
+### 2.2 删除快捷键
+
+| 快捷键 | 功能描述 | 使用场景 |
+|--------|----------|----------|
+| `Ctrl + U` | 删除到行首 | 快速清空当前输入的命令 |
+| `Ctrl + K` | 删除到行尾 | 删除光标后面不需要的内容 |
+| `Ctrl + W` | 删除前一个单词 | 快速删除最近输入的错误单词 |
+| `Ctrl + D` | 删除当前字符 | 删除光标下的字符 |
+| `Backspace` | 删除前一个字符 | 常规删除操作 |
+
+### 2.3 历史命令操作
+
+| 快捷键 | 功能描述 | 使用场景 |
+|--------|----------|----------|
+| `上/下箭头` | 浏览命令历史 | 重复执行之前的命令 |
+| `Ctrl + R` | 反向搜索历史命令 | 快速查找之前执行过的命令 |
+| `Ctrl + G` | 退出历史搜索模式 | 取消历史搜索返回正常输入 |
+
+### 2.4 文本选择与操作
| 快捷键 | 功能描述 | 使用场景 |
|--------|----------|----------|
@@ -58,15 +89,7 @@ XFCE 终端是 Linux Mint XFCE 桌面环境默认的命令行工具,熟练掌
| `Ctrl+Shift+A` | 全选当前行 | 快速复制整行内容 |
| `Ctrl+Shift+左/右箭头` | 按单词移动光标 | 快速编辑长命令 |
-### 2.2 历史命令操作
-
-| 快捷键 | 功能描述 | 使用场景 |
-|--------|----------|----------|
-| `上/下箭头` | 浏览命令历史 | 重复执行之前的命令 |
-| `Ctrl+R` | 反向搜索历史命令 | 快速查找之前执行过的命令 |
-| `Ctrl+G` | 退出历史搜索模式 | 取消历史搜索返回正常输入 |
-
-### 2.3 查找与替换
+### 2.5 查找与替换
| 快捷键 | 功能描述 | 使用场景 |
|--------|----------|----------|
@@ -137,6 +160,28 @@ nano ~/.config/xfce4/terminal/accels.scm
重启终端或按 `Ctrl+Shift+R` 重载配置使更改生效。
+### 5.2 解决Alt快捷键被抢占问题
+
+XFCE 终端默认会将 `Alt + 字母` 组合键作为菜单访问快捷键,会导致 Bash 的 `Alt + F`、`Alt + B` 等行编辑快捷键失效,可通过以下设置解决:
+
+**推荐方案(禁用所有菜单访问键):**
+1. 打开终端 → **编辑** → **首选项**(Preferences)
+2. 切换到 **高级**(Advanced)标签
+3. **勾选**:**禁用所有菜单访问键**(Disable all menu access keys)
+
+**效果:**
+- `Alt + F`、`Alt + B` 等 Bash 行编辑快捷键恢复正常
+- 同时会禁用 `Alt + F`(文件菜单)、`Alt + E`(编辑菜单)等菜单访问快捷键
+
+**替代方案(不关闭菜单快捷键):**
+- 使用 `Esc + F` 代替 `Alt + F` 向右跳一个单词
+- 使用 `Esc + B` 代替 `Alt + B` 向左跳一个单词
+
+> 💡 **记忆技巧**:
+> - `Ctrl` 系列快捷键:多用于**字符**级别操作(A=开头, E=结尾, B=后退, F=前进)
+> - `Alt` 系列快捷键:多用于**单词**级别操作(B=back, F=forward)
+> - `Esc` 可以代替 Alt(当 Alt 被系统/应用抢占时)
+
## 六、总结与推荐
### 6.1 最常用快捷键(强烈建议掌握)
diff --git a/src/programming/linux/基础/03-应用安装与快捷方式.md b/src/programming/linux/基础/03-应用安装与快捷方式.md
index 2c8ea40..e766b5a 100644
--- a/src/programming/linux/基础/03-应用安装与快捷方式.md
+++ b/src/programming/linux/基础/03-应用安装与快捷方式.md
@@ -1,6 +1,6 @@
---
title: Linux 应用安装与快捷方式
-icon: mdi:application-box
+icon: fa6-solid:box-open
date: 2025-12-22
category:
- Linux 基础
diff --git a/src/work/todo/2026-03.md b/src/work/todo/2026-03.md
index c7a72f9..fbe427c 100644
--- a/src/work/todo/2026-03.md
+++ b/src/work/todo/2026-03.md
@@ -14,14 +14,14 @@ title: 3月待办(2026-03)
# 待办清单(2026-03)
-> 最后更新: 2026-03-30
-> 统计: 已完成 12 项、已提交 0 项、待测试 1 项、部分完成 0 项、待确认 1 项、未开始 7 项、已取消 1 项
+> 最后更新: 2026-04-01
+> 统计: 已完成 13 项、已提交 0 项、待测试 1 项、部分完成 0 项、待确认 1 项、未开始 6 项、已取消 1 项
## 清单总览
- 当前优先: 8(待测试)、13(待确认)、14(未开始)
-- 本周建议推进: 7、9、14、16、19、21、22(未开始)
-- 已归档完成: 1、2、3、4、5、10、11、12、15、17、18、20
+- 本周建议推进: 7、9、14、16、21、22(未开始)
+- 已归档完成: 1、2、3、4、5、10、11、12、15、17、18、19、20
## 状态说明
@@ -69,14 +69,7 @@ title: 3月待办(2026-03)
- **描述**: 超期任务和终止任务都需要增加任务结束时间,且3个版本均需同步
- **下一步**: 分析现有超期和终止任务的数据结构,设计结束时间字段方案,确保3个版本数据库表结构和业务逻辑同步
-### 19. [智慧场站-7050] 删除点位时同步清理关联阈值告警
-- **创建日期**: 2026-03-27
-- **描述**: 删除点位时排查是否存在关联的阈值告警,如存在则需要同步删除
-- **下一步**: 梳理点位与阈值告警的关联关系,确认删除链路、影响范围与回归测试点
-- **需求截图**:
-
-
### 21. [智慧场站-7050] 反向联动菜单放出与联动开关灯实现
@@ -106,6 +99,30 @@ title: 3月待办(2026-03)
at com.sunri.client.ClientManager.getClient(ClientManager.java:130)
at com.sunri.client.mapper.BusClientInterceptor.sendData(BusClientInterceptor.java:151)
```
+ ```
+ 2026-04-01 10:32:10.591 [巡视任务-任务下发线程0] ERROR com.sunri.model.patrol.task.PatrolTaskControl - 文件复制失败
+ java.nio.file.NoSuchFileException: /home/ftp/1013804/2026/4/1/Patrol/J8lesNsDEwofyEk1LelIHbXnx1L8Gtcg/Video/0001_e55110ed-494f-4b2d-a10c-b705030ee176_20260401103147.mp4
+ at sun.nio.fs.UnixException.translateToIOException(UnixException.java:86)
+ at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102)
+ at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107)
+ at sun.nio.fs.UnixCopyFile.copy(UnixCopyFile.java:526)
+ at sun.nio.fs.UnixFileSystemProvider.copy(UnixFileSystemProvider.java:253)
+ at java.nio.file.Files.copy(Files.java:1274)
+ at com.sunri.model.patrol.task.PatrolTaskControl.copyWithSuffix(PatrolTaskControl.java:2974)
+ at com.sunri.model.patrol.task.PatrolTaskControl.handVideoAcquisition(PatrolTaskControl.java:3108)
+ at com.sunri.model.patrol.task.PatrolTaskControl.videoFileAcquisition(PatrolTaskControl.java:2724)
+ at com.sunri.model.patrol.task.PatrolTaskControl$$FastClassBySpringCGLIB$$db2c8ca8.invoke()
+ at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
+ at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:687)
+ at com.sunri.model.patrol.task.PatrolTaskControl$$EnhancerBySpringCGLIB$$de3e84a9.videoFileAcquisition()
+ at com.sunri.model.patrol.task.issued.pool.MessageUpdatePool.sendMessage(MessageUpdatePool.java:186)
+ at com.sunri.model.patrol.schedule.job.PatrolTaskJob.executeCapture(PatrolTaskJob.java:454)
+ at com.sunri.model.patrol.schedule.job.PatrolTaskJob.processPositionQueue(PatrolTaskJob.java:365)
+ at com.sunri.model.patrol.schedule.job.PatrolTaskJob.lambda$executePositionPatrol$434(PatrolTaskJob.java:279)
+ at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
+ at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
+ at java.lang.Thread.run(Thread.java:750)
+ ```
- **下一步**:
1. 梳理所有服务调用异常处理点
2. 设计统一的异常信息格式(包含服务名、方法名、参数、错误原因)
@@ -172,6 +189,15 @@ title: 3月待办(2026-03)
- **必填项**: 设备名称、设备编码、投运时间、设备IP、通信协议、通信端口
- **完成情况**: 已完成
+### 19. [智慧场站-7050] 删除点位时同步清理关联阈值告警
+
+- **创建日期**: 2026-03-27
+- **描述**: 删除点位时排查是否存在关联的阈值告警,如存在则需要同步删除
+- **完成情况**: 已完成,已梳理点位与阈值告警关联关系,实现删除点位时同步清理关联阈值告警功能
+- **需求截图**:
+
+
+
### 20. [智慧场站-7050] 录像回放权限问题修复
- **创建日期**: 2026-03-27
diff --git a/src/work/todo/2026-04.md b/src/work/todo/2026-04.md
new file mode 100644
index 0000000..71e6281
--- /dev/null
+++ b/src/work/todo/2026-04.md
@@ -0,0 +1,116 @@
+---
+icon: fa6-solid:list-check
+date: 2026-04-01
+pageClass: todo-page
+category:
+ - 待办
+tag:
+ - 任务清单
+title: 4月待办(2026-04)
+---
+
+4月待办事项记录
+
+
+# 待办清单(2026-04)
+
+> 最后更新: 2026-04-02
+> 统计: 未开始 2 项
+
+## 清单总览
+
+- 当前优先: 2(未开始)
+
+## 状态说明
+
+
+
+---
+
+## 当前优先
+
+### 1. 巡视报告配置异常需要修复
+
+- **描述**: 巡视报告配置异常,在这里设置筛选搜索修改设置之后,同一主设备下其它点的设置就变成空的了
+- **错误日志**:
+ ```
+ 2026-03-31 19:16:52.944 [TThreadPoolServer WorkerProcess-6] ERROR com.sunri.model.pipeline.DictatePipeline - DictatePipeline start, 处理异常 {}
+ java.lang.IllegalStateException: Duplicate key PatrolReportDevicePointRecord(id=37327, mainDeviceId=2198, devicePointId=104250, reportSn=1, standardValue=正常)
+ at java.util.stream.Collectors.lambda$throwingMerger$0(Collectors.java:133)
+ at java.util.HashMap.merge(HashMap.java:1254)
+ at java.util.stream.Collectors.lambda$toMap$58(Collectors.java:1320)
+ at java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169)
+ at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1384)
+ at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
+ at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)
+ at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
+ at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
+ at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:566)
+ at com.sunri.model.supersysmodel.pipeline.PatrolReportDevicePointRecordPipeLine.handle(PatrolReportDevicePointRecordPipeLine.java:44)
+ at com.sunri.model.supersysmodel.pipeline.ObjectVerifyPipeline.proceed(ObjectVerifyPipeline.java:35)
+ at com.sunri.model.supersysmodel.pipeline.PatrolReportDevicePointRecordPipeLine.proceed(PatrolReportDevicePointRecordPipeLine.java:19)
+ at com.sunri.model.pipeline.DictatePipeline.start(DictatePipeline.java:23)
+ at com.sunri.model.pipeline.DictatePipeline.skip(DictatePipeline.java:43)
+ at com.sunri.model.pipeline.DictatePipeline.start(DictatePipeline.java:32)
+ at com.sunri.model.pipeline.DictatePipeline.skip(DictatePipeline.java:43)
+ at com.sunri.model.pipeline.DictatePipeline.start(DictatePipeline.java:32)
+ at com.sunri.model.pipeline.DictatePipeline.skip(DictatePipeline.java:43)
+ at com.sunri.model.pipeline.DictatePipeline.start(DictatePipeline.java:32)
+ at com.sunri.model.pipeline.DictatePipeline.skip(DictatePipeline.java:43)
+ at com.sunri.model.pipeline.DictatePipeline.start(DictatePipeline.java:32)
+ at com.sunri.model.pipeline.DictatePipeline.skip(DictatePipeline.java:43)
+ at com.sunri.model.pipeline.DictatePipeline.start(DictatePipeline.java:32)
+ at com.sunri.model.pipeline.DictatePipeline.skip(DictatePipeline.java:43)
+ at com.sunri.model.pipeline.DictatePipeline.start(DictatePipeline.java:32)
+ at com.sunri.model.pipeline.DictatePipeline.skip(DictatePipeline.java:43)
+ at com.sunri.model.pipeline.DictatePipeline.start(DictatePipeline.java:32)
+ at com.sunri.model.pipeline.DictatePipeline.skip(DictatePipeline.java:43)
+ at com.sunri.model.pipeline.DictatePipeline.start(DictatePipeline.java:32)
+ at com.sunri.model.pipeline.DictatePipeline.skip(DictatePipeline.java:43)
+ at com.sunri.model.pipeline.DictatePipeline.start(DictatePipeline.java:32)
+ at com.sunri.model.pipeline.DictatePipeline.skip(DictatePipeline.java:43)
+ at com.sunri.model.pipeline.DictatePipeline.start(DictatePipeline.java:32)
+ at com.sunri.model.pipeline.DictatePipeline.skip(DictatePipeline.java:43)
+ at com.sunri.model.pipeline.DictatePipeline.start(DictatePipeline.java:32)
+ at com.sunri.model.supersysmodel.pipeline.DevicePointManager.pointImport(DevicePointManager.java:62)
+ at com.sunri.model.supersysmodel.SuperSysModelConfiguration.readExcelBytes(SuperSysModelConfiguration.java:2419)
+ at com.sunri.model.supersysmodel.SuperSysModelConfiguration.devicePointImport(SuperSysModelConfiguration.java:2495)
+ at com.sunri.service.impl.supersysmodel.SuperSysModelServiceImpl.devicePointImport(SuperSysModelServiceImpl.java:172)
+ at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+ at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
+ at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+ at java.lang.reflect.Method.invoke(Method.java:498)
+ at com.sunri.server.mapper.handler.ByteArrayMethodHandler.proceed(ByteArrayMethodHandler.java:108)
+ at com.sunri.pipeline.Pipeline.start(Pipeline.java:26)
+ at com.sunri.pipeline.Pipeline.skip(Pipeline.java:43)
+ at com.sunri.pipeline.Pipeline.start(Pipeline.java:32)
+ at com.sunri.server.dispatch.Func.proceed(Func.java:152)
+ at com.sunri.server.service.impl.RequestServiceImpl.doExec(RequestServiceImpl.java:43)
+ at com.sunri.server.message.handler.RequestHandler.proceed(RequestHandler.java:30)
+ at com.sunri.pipeline.Pipeline.start(Pipeline.java:26)
+ at com.sunri.pipeline.Pipeline.skip(Pipeline.java:43)
+ at com.sunri.pipeline.Pipeline.start(Pipeline.java:32)
+ at com.sunri.server.processor.ServerProcessor.doExec(ServerProcessor.java:36)
+ at com.sunri.server.service.RequestService$Processor$doExec.getResult(RequestService.java:155)
+ at com.sunri.server.service.RequestService$Processor$doExec.getResult(RequestService.java:135)
+ at org.apache.thrift.ProcessFunction.process(ProcessFunction.java:38)
+ at org.apache.thrift.TBaseProcessor.process(TBaseProcessor.java:38)
+ at com.sunri.server.processor.ServerProcessorFactory$RequestServiceProcessor.process(ServerProcessorFactory.java:74)
+ at org.apache.thrift.TMultiplexedProcessor.process(TMultiplexedProcessor.java:138)
+ at org.apache.thrift.server.TThreadPoolServer$WorkerProcess.run(TThreadPoolServer.java:250)
+ at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
+ at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
+ at java.lang.Thread.run(Thread.java:748)
+ 2026-03-31 19:16:52.945 [TThreadPoolServer WorkerProcess-6] INFO com.sunri.model.pipeline.DictatePipeline - [流水线完成] PatrolReportDevicePointRecordPipeLine 处理耗时: 34ms
+ ```
+- **下一步**:
+ 1. 定位 PatrolReportDevicePointRecordPipeLine.java:44 代码逻辑
+ 2. 修复 toMap 重复 key 问题
+ 3. 验证修改后同一主设备下多点位配置保存正常
+
+### 2. 与姬工讨论上海导出五通报表的问题
+
+- **描述**: 姬工安排讨论上海项目导出五通报表相关需求与问题
+- **下一步**:
+ 1. 提前梳理现有报表导出功能逻辑
+ 2. 预约时间与姬工同步讨论细节
diff --git a/src/work/todo/README.md b/src/work/todo/README.md
index e8668dd..dd984e5 100644
--- a/src/work/todo/README.md
+++ b/src/work/todo/README.md
@@ -11,4 +11,5 @@ title: 待办事项
## 月度清单
+- [4月待办(2026-04)](./2026-04.md)
- [3月待办(2026-03)](./2026-03.md)