停止跟踪本地工具和日志并完善生产迁移交付
This commit is contained in:
+19
@@ -1 +1,20 @@
|
|||||||
/.env
|
/.env
|
||||||
|
|
||||||
|
# 本机工具、工作记录和运行日志:保留本地文件,不进入版本库。
|
||||||
|
/.idea/
|
||||||
|
/.pnpm-store/
|
||||||
|
/.superpowers/
|
||||||
|
/docs/
|
||||||
|
/logs/
|
||||||
|
/shierfeng-fastapi-backend/logs/
|
||||||
|
|
||||||
|
# Python 运行及检查缓存。
|
||||||
|
__pycache__/
|
||||||
|
*.py[cod]
|
||||||
|
.pytest_cache/
|
||||||
|
.ruff_cache/
|
||||||
|
|
||||||
|
# 本地依赖;前端和 APP 构建产物继续由各自 .gitignore 管理。
|
||||||
|
node_modules/
|
||||||
|
/.venv/
|
||||||
|
/venv/
|
||||||
|
|||||||
Generated
-10
@@ -1,10 +0,0 @@
|
|||||||
# Default ignored files
|
|
||||||
/shelf/
|
|
||||||
/workspace.xml
|
|
||||||
# Ignored default folder with query files
|
|
||||||
/queries/
|
|
||||||
# Datasource local storage ignored files
|
|
||||||
/dataSources/
|
|
||||||
/dataSources.local.xml
|
|
||||||
# Editor-based HTTP Client requests
|
|
||||||
/httpRequests/
|
|
||||||
Generated
-10
@@ -1,10 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<module type="PYTHON_MODULE" version="4">
|
|
||||||
<component name="NewModuleRootManager">
|
|
||||||
<content url="file://$MODULE_DIR$">
|
|
||||||
<excludeFolder url="file://$MODULE_DIR$/venv" />
|
|
||||||
</content>
|
|
||||||
<orderEntry type="jdk" jdkName="Python 3.10 (ShiErFeng)" jdkType="Python SDK" />
|
|
||||||
<orderEntry type="sourceFolder" forTests="false" />
|
|
||||||
</component>
|
|
||||||
</module>
|
|
||||||
Generated
-15
@@ -1,15 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="GitToolBoxProjectSettings">
|
|
||||||
<option name="commitMessageIssueKeyValidationOverride">
|
|
||||||
<BoolValueOverride>
|
|
||||||
<option name="enabled" value="true" />
|
|
||||||
</BoolValueOverride>
|
|
||||||
</option>
|
|
||||||
<option name="commitMessageValidationEnabledOverride">
|
|
||||||
<BoolValueOverride>
|
|
||||||
<option name="enabled" value="true" />
|
|
||||||
</BoolValueOverride>
|
|
||||||
</option>
|
|
||||||
</component>
|
|
||||||
</project>
|
|
||||||
-25
@@ -1,25 +0,0 @@
|
|||||||
<component name="InspectionProjectProfileManager">
|
|
||||||
<profile version="1.0">
|
|
||||||
<option name="myName" value="Project Default" />
|
|
||||||
<inspection_tool class="PyPep8NamingInspection" enabled="true" level="WEAK WARNING" enabled_by_default="true">
|
|
||||||
<option name="ignoredErrors">
|
|
||||||
<list>
|
|
||||||
<option value="N806" />
|
|
||||||
<option value="N803" />
|
|
||||||
<option value="N802" />
|
|
||||||
<option value="N801" />
|
|
||||||
</list>
|
|
||||||
</option>
|
|
||||||
</inspection_tool>
|
|
||||||
<inspection_tool class="PyUnresolvedReferencesInspection" enabled="true" level="WARNING" enabled_by_default="true">
|
|
||||||
<option name="ignoredIdentifiers">
|
|
||||||
<list>
|
|
||||||
<option value="list.to_numpy" />
|
|
||||||
<option value="str.__or__" />
|
|
||||||
<option value="str.like" />
|
|
||||||
<option value="nacos.client" />
|
|
||||||
</list>
|
|
||||||
</option>
|
|
||||||
</inspection_tool>
|
|
||||||
</profile>
|
|
||||||
</component>
|
|
||||||
-6
@@ -1,6 +0,0 @@
|
|||||||
<component name="InspectionProjectProfileManager">
|
|
||||||
<settings>
|
|
||||||
<option name="USE_PROJECT_PROFILE" value="false" />
|
|
||||||
<version value="1.0" />
|
|
||||||
</settings>
|
|
||||||
</component>
|
|
||||||
Generated
-7
@@ -1,7 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="Black">
|
|
||||||
<option name="sdkName" value="Python 3.11 (TavernProgram)" />
|
|
||||||
</component>
|
|
||||||
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.10 (ShiErFeng)" project-jdk-type="Python SDK" />
|
|
||||||
</project>
|
|
||||||
Generated
-8
@@ -1,8 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="ProjectModuleManager">
|
|
||||||
<modules>
|
|
||||||
<module fileurl="file://$PROJECT_DIR$/.idea/ShiErFeng.iml" filepath="$PROJECT_DIR$/.idea/ShiErFeng.iml" />
|
|
||||||
</modules>
|
|
||||||
</component>
|
|
||||||
</project>
|
|
||||||
Generated
-6
@@ -1,6 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="VcsDirectoryMappings">
|
|
||||||
<mapping directory="" vcs="Git" />
|
|
||||||
</component>
|
|
||||||
</project>
|
|
||||||
Binary file not shown.
@@ -1 +0,0 @@
|
|||||||
../../../shierfeng-fastapi-app
|
|
||||||
@@ -1,152 +0,0 @@
|
|||||||
# Task 5 交接报告
|
|
||||||
|
|
||||||
## Status
|
|
||||||
|
|
||||||
INCOMPLETE。当前尝试未完成 Task 5,未提交 commit。
|
|
||||||
|
|
||||||
## 已修改文件
|
|
||||||
|
|
||||||
本次 Task 5 尝试涉及 brief 白名单中的 18 个文件:
|
|
||||||
|
|
||||||
- `shierfeng-fastapi-backend/module_business/controller/inbound_controller.py`
|
|
||||||
- `shierfeng-fastapi-backend/module_business/controller/filling_controller.py`
|
|
||||||
- `shierfeng-fastapi-backend/module_business/controller/shipment_controller.py`
|
|
||||||
- `shierfeng-fastapi-backend/module_business/controller/usage_controller.py`
|
|
||||||
- `shierfeng-fastapi-backend/module_business/controller/return_controller.py`
|
|
||||||
- `shierfeng-fastapi-backend/module_business/dao/operation_dao.py`
|
|
||||||
- `shierfeng-fastapi-backend/module_business/dao/inventory_dao.py`
|
|
||||||
- `shierfeng-fastapi-backend/module_business/service/inbound_service.py`
|
|
||||||
- `shierfeng-fastapi-backend/module_business/service/filling_service.py`
|
|
||||||
- `shierfeng-fastapi-backend/module_business/service/shipment_service.py`
|
|
||||||
- `shierfeng-fastapi-backend/module_business/service/usage_service.py`
|
|
||||||
- `shierfeng-fastapi-backend/module_business/service/return_service.py`
|
|
||||||
- `shierfeng-fastapi-backend/tests/module_business/test_inbound_service.py`
|
|
||||||
- `shierfeng-fastapi-backend/tests/module_business/test_filling_service.py`
|
|
||||||
- `shierfeng-fastapi-backend/tests/module_business/test_shipment_service.py`
|
|
||||||
- `shierfeng-fastapi-backend/tests/module_business/test_usage_service.py`
|
|
||||||
- `shierfeng-fastapi-backend/tests/module_business/test_return_service.py`
|
|
||||||
- `shierfeng-fastapi-backend/tests/module_business/test_inventory_dao.py`
|
|
||||||
|
|
||||||
## RED 证据
|
|
||||||
|
|
||||||
初始聚焦命令运行五类业务 service 与 inventory DAO 测试,共 282 个测试,结果为 `38 failures`。该 RED 结果用于确认显式 scope 契约、批次锁首语句、派生记录继承和 DAO scope 隔离的缺口。
|
|
||||||
|
|
||||||
## 阶段性结果
|
|
||||||
|
|
||||||
随后按单文件继续迁移测试调用和断言,当前结果为:
|
|
||||||
|
|
||||||
- `test_inbound_service`:55 tests,`24 failures / 9 errors`
|
|
||||||
- `test_return_service`:46 tests,`16 failures / 9 errors`
|
|
||||||
- `test_inventory_dao`:42 tests,`16 failures / 17 errors`
|
|
||||||
|
|
||||||
失败根因主要是既有测试中的旧 service/DAO 调用、旧参数顺序和旧 `assert_awaited_*` 断言尚未完成显式 scope 迁移;同时仍存在真实的跨 scope 校验、测试写入批次锁顺序、既有库存 ownership 保持和相关回滚行为需要继续实现与验证。生产接口当前保持 scope 必填,没有增加默认 formal scope。
|
|
||||||
|
|
||||||
## 未完成项
|
|
||||||
|
|
||||||
- 尚未使六个目标测试文件逐组 GREEN。
|
|
||||||
- 尚未完成五条业务链路的完整跨 scope、批次锁首语句、派生 `test_batch_id` 和既有库存 ownership 验证。
|
|
||||||
- 尚未运行 brief 要求的完整 282+ 回归测试。
|
|
||||||
- 尚未运行最终 Ruff format/check 和 diff check。
|
|
||||||
- 尚未执行精确白名单 `git commit --only`,当前没有可提交 SHA。
|
|
||||||
|
|
||||||
## 交接结论
|
|
||||||
|
|
||||||
这是 INCOMPLETE 交接,不代表 Task 5 完成。后续应从测试调用/断言迁移继续,修复每个单文件的真实 scope 与锁顺序失败,完成全套验证后再生成正式提交和最终报告。
|
|
||||||
|
|
||||||
## Task 5 最终结果(2026-09-23)
|
|
||||||
|
|
||||||
### Status
|
|
||||||
|
|
||||||
DONE。18 个白名单文件的 Task 5 实现、测试 scope 迁移和格式修复已完成;未提交 commit。生产代码保留显式 scope 必填,没有添加 formal 默认值;测试/生产数据中 `test_batch_id=NULL` 仍表示正式数据。
|
|
||||||
|
|
||||||
### 本轮完成
|
|
||||||
|
|
||||||
- 完成 `test_return_service.py` 的旧 DAO 调用、内部 helper 调用和 mock 断言迁移,补齐显式 `TestBatchScope`。
|
|
||||||
- 完成 `test_inventory_dao.py` 的 DAO 签名期望、列表参数顺序、幂等查询、详情/锁查询和写入调用迁移。
|
|
||||||
- 对 5 个控制器和 6 个业务测试文件执行白名单范围内的 Ruff 导入/格式修复;未修改白名单之外的源码、测试、日志或 pycache。
|
|
||||||
- 复核生产实现:DAO 根查询及明细查询应用 `batch_scope_condition`;测试写入口首条数据库语句锁定 active batch;派生订单、明细和事件显式继承 `test_batch_id`;已有库存未被改写 ownership;入库/发货旧 DELETE 在访问 DAO 前固定抛出批次清理提示;授权、状态机、幂等、锁顺序和回滚回归通过。
|
|
||||||
|
|
||||||
### 验证命令与真实结果
|
|
||||||
|
|
||||||
1. `PYTHONDONTWRITEBYTECODE=1 conda run -n ShiErFeng python -m unittest tests.module_business.test_inbound_service`:`Ran 55 tests ... OK`。
|
|
||||||
2. `PYTHONDONTWRITEBYTECODE=1 conda run -n ShiErFeng python -m unittest tests.module_business.test_filling_service`:`Ran 42 tests ... OK`。
|
|
||||||
3. `PYTHONDONTWRITEBYTECODE=1 conda run -n ShiErFeng python -m unittest tests.module_business.test_shipment_service`:`Ran 46 tests ... OK`。
|
|
||||||
4. `PYTHONDONTWRITEBYTECODE=1 conda run -n ShiErFeng python -m unittest tests.module_business.test_usage_service`:`Ran 51 tests ... OK`。
|
|
||||||
5. `PYTHONDONTWRITEBYTECODE=1 conda run -n ShiErFeng python -m unittest tests.module_business.test_return_service`:`Ran 46 tests ... OK`。
|
|
||||||
6. `PYTHONDONTWRITEBYTECODE=1 conda run -n ShiErFeng python -m unittest tests.module_business.test_inventory_dao`:`Ran 42 tests ... OK`。
|
|
||||||
7. 六文件合并命令:`PYTHONDONTWRITEBYTECODE=1 conda run -n ShiErFeng python -m unittest tests.module_business.test_inbound_service tests.module_business.test_filling_service tests.module_business.test_shipment_service tests.module_business.test_usage_service tests.module_business.test_return_service tests.module_business.test_inventory_dao -v`:`Ran 282 tests ... OK`。
|
|
||||||
8. 白名单 `ruff format --check`:`18 files already formatted`,exit 0。
|
|
||||||
9. 白名单 `ruff check`:`All checks passed!`,exit 0。
|
|
||||||
10. 目录级 `ruff check module_business/controller module_business/dao module_business/service tests/module_business`:`All checks passed!`,exit 0。
|
|
||||||
11. 白名单范围 `git diff --check -- <18 files>`:无输出,exit 0。
|
|
||||||
12. 全仓 `git diff --check`:exit 2;首个实际根因为用户已有 `shierfeng-fastapi-backend/logs/2026/09/20/info.log` 的 trailing whitespace,未修改日志。
|
|
||||||
|
|
||||||
### Concerns
|
|
||||||
|
|
||||||
- 目录级 `ruff format --check module_business/controller module_business/dao module_business/service tests/module_business` 仍 exit 1,精确列出 4 个非白名单文件:`module_business/dao/test_batch_dao.py`、`module_business/service/test_batch_service.py`、`tests/module_business/test_sql_contract.py`、`tests/module_business/test_test_batch_service.py`。受本任务 18 文件白名单约束,未修改。
|
|
||||||
- 全仓 `git diff --check` 仍被用户已有日志 trailing whitespace 阻断;Task 5 白名单范围检查已通过。
|
|
||||||
|
|
||||||
## 停止长任务交接(2026-09-23)
|
|
||||||
|
|
||||||
本次停止请求已立即停止后续工作;当前没有仍在运行的测试或命令,没有回滚工作区改动,也未提交 commit。
|
|
||||||
|
|
||||||
本次停止请求本身未启动新命令,因此没有新增命令输出。停止前最近一次真实验证结果保持不变:六个单文件测试分别为 `55/55`、`42/42`、`46/46`、`51/51`、`46/46`、`42/42`,合并回归为 `Ran 282 tests ... OK`;白名单 Ruff format/check 和白名单 `git diff --check` 均 exit 0。
|
|
||||||
|
|
||||||
剩余阻塞/concerns:
|
|
||||||
|
|
||||||
- 目录级 Ruff format 仍因 4 个非白名单文件未格式化而 exit 1:`module_business/dao/test_batch_dao.py`、`module_business/service/test_batch_service.py`、`tests/module_business/test_sql_contract.py`、`tests/module_business/test_test_batch_service.py`。
|
|
||||||
- 全仓 `git diff --check` 仍因用户已有 `shierfeng-fastapi-backend/logs/2026/09/20/info.log` trailing whitespace 而 exit 2;未修改该日志。
|
|
||||||
|
|
||||||
## Task 5 Fix Round 1(2026-09-23)
|
|
||||||
|
|
||||||
### Status
|
|
||||||
|
|
||||||
DONE_WITH_CONCERNS。review 指出的生产缺陷已修复,并创建了退回申请 `IntegrityError` 入口回归和事件历史指针 scope SQL 回归;未执行真实数据库写入或迁移。
|
|
||||||
|
|
||||||
### 修复内容
|
|
||||||
|
|
||||||
- `ReturnService.request_return_services` 现在向 `_recover_request_integrity_error` 传入 `test_scope`;入口回归通过真实恢复分支验证同一 TEST batch 的幂等赢家稳定返回。
|
|
||||||
- 六个 `IntegrityError` recovery helper 在任何授权或业务查询前调用 `lock_active_batch`;退回申请的 site 重授权 helper 不再在 site 行锁后锁 batch。退回申请、确认及使用在预读 rollback 后开始的新事务也先重锁 batch。
|
|
||||||
- `InventoryDao.add_event` 现在强制接收 `scope`,历史 `last_event_id` 查询加入 `batch_scope_condition(BizPalletEvent.test_batch_id, scope)`;五个服务的全部事件写入调用均传递当前 scope。
|
|
||||||
- 入库和发货 DELETE OpenAPI summary/description 更新为固定拒绝消息:`不支持单条物理删除,请通过测试数据批次清理`。
|
|
||||||
- 业务测试中的事件 DAO 替身更新为四参 API。
|
|
||||||
|
|
||||||
### TDD 与验证命令(真实输出摘要)
|
|
||||||
|
|
||||||
1. RED:`cd shierfeng-fastapi-backend && PYTHONDONTWRITEBYTECODE=1 conda run -n ShiErFeng python -m unittest tests.module_business.test_return_service.ReturnRequestTransactionRedTest.test_request_integrity_error_recovers_same_test_batch_idempotently -v`:exit 1,`TypeError: ReturnService._recover_request_integrity_error() missing 1 required positional argument: 'test_scope'`。
|
|
||||||
2. RED:`cd shierfeng-fastapi-backend && PYTHONDONTWRITEBYTECODE=1 conda run -n ShiErFeng python -m unittest tests.module_business.test_inventory_dao.TestDaoPublicContract.test_inventory_dao_critical_parameter_names_are_stable tests.module_business.test_inventory_dao.TestInventoryDao.test_add_event_reads_exact_previous_pointer_and_updates_inventory -v`:exit 1,`add_event` 缺少 `scope` 参数,调用报 `takes 4 positional arguments but 5 were given`。
|
|
||||||
3. GREEN:上述退回入口单测:`Ran 1 test in 0.023s`,`OK`。
|
|
||||||
4. GREEN:`TestDaoPublicContract.test_inventory_dao_critical_parameter_names_are_stable` 及三个 `add_event` DAO 单测:`Ran 4 tests in 0.021s`,`OK`。
|
|
||||||
5. 单文件:`PYTHONDONTWRITEBYTECODE=1 conda run -n ShiErFeng python -m unittest tests.module_business.test_inbound_service -v`:`Ran 55 tests ... OK`。
|
|
||||||
6. 单文件:`PYTHONDONTWRITEBYTECODE=1 conda run -n ShiErFeng python -m unittest tests.module_business.test_filling_service -v`:`Ran 42 tests ... OK`。
|
|
||||||
7. 单文件:`PYTHONDONTWRITEBYTECODE=1 conda run -n ShiErFeng python -m unittest tests.module_business.test_shipment_service -v`:`Ran 46 tests ... OK`。
|
|
||||||
8. 单文件:`PYTHONDONTWRITEBYTECODE=1 conda run -n ShiErFeng python -m unittest tests.module_business.test_usage_service -v`:`Ran 51 tests ... OK`。
|
|
||||||
9. 单文件:`PYTHONDONTWRITEBYTECODE=1 conda run -n ShiErFeng python -m unittest tests.module_business.test_return_service -v`:`Ran 47 tests ... OK`。
|
|
||||||
10. 单文件:`PYTHONDONTWRITEBYTECODE=1 conda run -n ShiErFeng python -m unittest tests.module_business.test_inventory_dao -v`:`Ran 42 tests ... OK`。
|
|
||||||
11. 合并:`PYTHONDONTWRITEBYTECODE=1 conda run -n ShiErFeng python -m unittest tests.module_business.test_inbound_service tests.module_business.test_filling_service tests.module_business.test_shipment_service tests.module_business.test_usage_service tests.module_business.test_return_service tests.module_business.test_inventory_dao -v`:`Ran 283 tests in 1.761s`,`OK`。计数为 283 是本轮新增退回恢复回归的结果。
|
|
||||||
12. `PYTHONDONTWRITEBYTECODE=1 conda run -n ShiErFeng python -m ruff format --check <18 个白名单文件>`:`18 files already formatted`,exit 0。
|
|
||||||
13. `PYTHONDONTWRITEBYTECODE=1 conda run -n ShiErFeng python -m ruff check <18 个白名单文件>`:`All checks passed!`,exit 0。
|
|
||||||
14. `git diff --check -- <18 个白名单文件及本报告>`:无输出,exit 0(在追加本段前执行;追加后会在提交前重新执行)。
|
|
||||||
|
|
||||||
### Concerns
|
|
||||||
|
|
||||||
- 本轮新增的 TEST scope 入口成功回归目前集中于退回申请;入库、装填、发货和使用的既有业务成功回归仍以 `TestBatchScope.formal()` 为主。生产路径、DAO SQL scope 条件和六文件回归均已验证,但尚未为这四条链路分别补齐 TEST batch 成功、跨批次拒绝、CLOSED 拒绝、派生字段和 rollback 的专门用例。
|
|
||||||
- 目录级 Ruff format 和全仓 `git diff --check` 的既有非白名单阻塞仍按上文保留,未修改用户文件。
|
|
||||||
|
|
||||||
## Task 5 接管后补充(2026-09-23)
|
|
||||||
|
|
||||||
### 本轮修复
|
|
||||||
|
|
||||||
- 为正式模式 `SimpleNamespace` 仓库替身补齐 `test_batch_id=None`,保留服务层对已加载对象的强制 scope 校验。
|
|
||||||
- 入库、装填、发货扫码路径对仓库/现场、托盘、库存和活动装填记录增加显式 `assert_record_in_scope` 防御校验;不放宽 DAO 过滤。
|
|
||||||
- 装填与发货各增加 TEST scope 跨批次写入回滚回归;装填与发货扫码各增加跨批次对象拒绝回归。
|
|
||||||
|
|
||||||
### 最新验证
|
|
||||||
|
|
||||||
1. 红测:装填与发货跨批次扫码用例在新增服务校验前分别以 `ServiceException not raised` 失败;两条写入用例同时确认回滚路径可用。
|
|
||||||
2. 绿测:四条新增回归:`Ran 4 tests ... OK`。
|
|
||||||
3. 六文件合并:`PYTHONDONTWRITEBYTECODE=1 OPENBLAS_NUM_THREADS=1 OMP_NUM_THREADS=1 /Users/jiaolongyan/miniconda3/envs/ShiErFeng/bin/python -u -m unittest tests.module_business.test_inbound_service tests.module_business.test_filling_service tests.module_business.test_shipment_service tests.module_business.test_usage_service tests.module_business.test_return_service tests.module_business.test_inventory_dao -v`:`Ran 290 tests ... OK`。
|
|
||||||
4. 18 文件 `ruff format --check`:`18 files already formatted`;`ruff check`:`All checks passed!`。
|
|
||||||
5. 18 文件范围 `git diff --check`:无输出,exit 0。
|
|
||||||
|
|
||||||
当前 Task 5 代码已具备提交条件;本报告仍只保留为本地审查材料,不应纳入业务提交。
|
|
||||||
@@ -45,9 +45,17 @@
|
|||||||
* 只读报表:托盘库存、装填记录、发货出库、产线消耗、退回仓库、托盘追溯。
|
* 只读报表:托盘库存、装填记录、发货出库、产线消耗、退回仓库、托盘追溯。
|
||||||
* Android PDA 可通过基于 uni-app 的 H5 页面使用,并支持 HID 扫码枪扫码后回车提交。
|
* Android PDA 可通过基于 uni-app 的 H5 页面使用,并支持 HID 扫码枪扫码后回车提交。
|
||||||
|
|
||||||
本轮交付包含 PDA H5 页面,但暂不打包 APK 或其他原生安装包,也未调用设备摄像头。上线前请阅读[托盘流转业务部署说明](./docs/pallet-workflow-deployment.md)。
|
本轮交付包含 PDA H5 页面,但暂不打包 APK 或其他原生安装包,也未调用设备摄像头。上线前请阅读[托盘流转业务部署说明](./shierfeng-fastapi-backend/sql/pallet-workflow-deployment.md)。
|
||||||
|
|
||||||
测试数据批次的创建、授权、历史数据纳入和清理流程请阅读[测试数据批次操作说明](./docs/test-data-batch-operations.md)。
|
测试数据批次的创建、授权、历史数据纳入和清理流程请阅读[测试数据批次操作说明](./shierfeng-fastapi-backend/sql/test-data-batch-operations.md)。
|
||||||
|
|
||||||
|
数据库初始化与升级入口请阅读 [SQL 使用说明](./shierfeng-fastapi-backend/sql/README.md)。新空库直接使用已包含隧道、物料日期、收货和 FIFO 结构的初始化 SQL;已有生产库不得运行全量初始化,请按[生产 Compose 增量迁移说明](./shierfeng-fastapi-backend/sql/production-compose-material-flow-migration-20261008.md)核对适用条件后执行。
|
||||||
|
|
||||||
|
### Git 跟踪范围
|
||||||
|
|
||||||
|
根目录 `.idea/`、`.pnpm-store/`、`.superpowers/`、`docs/`、`logs/` 及后端 `logs/` 仅保留本地,不再提交;Python 缓存及本地依赖同样忽略。必要的业务部署与数据库迁移说明随后端 `sql/` 目录维护。代码、迁移 SQL、测试和必要部署配置仍正常跟踪。
|
||||||
|
|
||||||
|
其他已有克隆首次拉取本次清理提交前,应先备份这些目录中需要保留的文件:Git 可能删除此前被跟踪的副本。此次清理不重写历史,旧提交中的文件仍然存在。
|
||||||
|
|
||||||
## 在线体验
|
## 在线体验
|
||||||
|
|
||||||
|
|||||||
@@ -1,106 +0,0 @@
|
|||||||
# PDA 托盘业务验收与培训手册
|
|
||||||
|
|
||||||
## 1. 文档目的
|
|
||||||
|
|
||||||
本手册用于服务器、数据库和 PDA 设备准备完成后的现场验收与客户培训。它不替代部署、数据库迁移或 APK 打包,也不把本地构建结果视为真机验收结果。
|
|
||||||
|
|
||||||
当前代码交付物是 uni-app PDA 页面、接口封装、HID 扫码组件和可验证 H5 构建;APK 按当前范围暂不生成。
|
|
||||||
|
|
||||||
## 2. 验收前置条件
|
|
||||||
|
|
||||||
- 后端服务已部署并可从 PDA 访问,已确定 `VITE_APP_BASE_API` 对应地址。
|
|
||||||
- 数据库已执行与目标数据库类型匹配的初始化 SQL/业务补丁,并完成备份。
|
|
||||||
- Redis、JWT、传输加密和验证码配置已按目标环境确认。
|
|
||||||
- 已准备管理员、仓库操作员、客户现场操作员三类账号,并分别配置仓库/现场数据范围。
|
|
||||||
- 已准备至少两个空托盘、一个已装填托盘、一个可部分使用托盘和一个可退回托盘;每个托盘二维码唯一且可扫描。
|
|
||||||
- PDA 与扫码头处于 HID 键盘输入模式,扫码结束符配置为回车;网络稳定性和离线恢复策略已确认。
|
|
||||||
- 验收记录表包含:用例编号、账号、托盘码、时间、预期结果、实际结果、截图/日志、问题编号和签字人。
|
|
||||||
|
|
||||||
## 3. 角色验收
|
|
||||||
|
|
||||||
| 角色 | 应能操作 | 不应能操作 |
|
|
||||||
| --- | --- | --- |
|
|
||||||
| 管理员 | 在授权范围内查看基础资料、业务单、报表和追溯 | 不应绕过后端权限与数据范围 |
|
|
||||||
| 仓库操作员 | 入库、装填、发货、退回收货 | 不应操作未授权仓库或客户现场 |
|
|
||||||
| 客户现场操作员 | 扫码查看托盘、绑定产线、录入使用、发起退回 | 不应确认仓库收货或访问未授权现场 |
|
|
||||||
|
|
||||||
登录页默认填充用户名 `admin`;密码必须由操作员现场手工输入,不记录在测试单、日志或源码中。
|
|
||||||
|
|
||||||
## 4. 核心业务验收用例
|
|
||||||
|
|
||||||
### 4.1 基础资料与二维码
|
|
||||||
|
|
||||||
1. Web 后台新增菌种、客户、现场、产线、仓库和托盘。
|
|
||||||
2. 为托盘设置容量,生成并查看固定二维码。
|
|
||||||
3. 重复托盘编号或二维码应被拒绝;停用托盘不能进入业务流程。
|
|
||||||
4. 为仓库和现场分配用户,使用受限账号确认数据范围。
|
|
||||||
|
|
||||||
### 4.2 入库
|
|
||||||
|
|
||||||
1. 仓库用户选择授权仓库,扫描 `UNSTOCKED` 托盘。
|
|
||||||
2. 重复扫描同一托盘应被前端提示并不会重复加入。
|
|
||||||
3. 创建入库草稿,移除一条明细后保存并重新进入详情。
|
|
||||||
4. 确认入库,检查库存状态变为仓库空托盘,并检查托盘事件。
|
|
||||||
5. 在响应丢失后使用同一操作重试,确认不会重复入库。
|
|
||||||
|
|
||||||
### 4.3 装填
|
|
||||||
|
|
||||||
1. 扫描仓库空托盘,确认页面显示仓库、容量和当前余量。
|
|
||||||
2. 选择菌种,录入批次、规格和正整数包数。
|
|
||||||
3. 使用 0、负数、超容量和未授权仓库数据验证后端拒绝。
|
|
||||||
4. 提交成功后检查状态、菌种、批次、初始包数和装填事件。
|
|
||||||
|
|
||||||
### 4.4 发货
|
|
||||||
|
|
||||||
1. 选择授权来源仓库和目标客户现场,连续扫描可发货托盘。
|
|
||||||
2. 检查页面展示的菌种、批次和剩余包数为服务端数据。
|
|
||||||
3. 创建草稿并确认,检查来源库存扣减、现场位置和发货事件。
|
|
||||||
4. 用同一幂等键重试确认,确认不会重复扣减库存。
|
|
||||||
|
|
||||||
### 4.5 客户现场使用
|
|
||||||
|
|
||||||
1. 现场用户扫描已发货托盘,确认菌种、批次和剩余包数可读。
|
|
||||||
2. 首次使用选择当前现场产线,录入正整数使用包数。
|
|
||||||
3. 使用小于余量的包数,确认状态为部分使用且剩余包数正确。
|
|
||||||
4. 使用剩余全部包数,确认状态为现场空托盘且剩余包数为 0。
|
|
||||||
5. 尝试切换已绑定的其他产线、超出余量或使用 0 包,确认请求被拒绝。
|
|
||||||
|
|
||||||
### 4.6 退回
|
|
||||||
|
|
||||||
1. 现场用户选择目标仓库并扫描可退回托盘,提交退回申请。
|
|
||||||
2. 检查托盘状态进入退回中,不能再次发货或重复申请。
|
|
||||||
3. 仓库用户查看退回详情,扫描整集合托盘并确认收货。
|
|
||||||
4. 漏扫、错扫、重复扫和余量快照变化均应阻止确认。
|
|
||||||
5. 确认成功后检查仓库库存、托盘状态和退回事件。
|
|
||||||
|
|
||||||
## 5. 报表、权限与异常验收
|
|
||||||
|
|
||||||
- 查看托盘库存、装填、发货、产线消耗、退回和托盘追溯六类报表。
|
|
||||||
- 用受限账号验证未授权菜单不显示,直接调用接口返回 403。
|
|
||||||
- 检查关键写操作包含操作人、时间、业务单和托盘事件。
|
|
||||||
- 在扫码请求期间连续回车,确认输入锁生效且不会并发提交。
|
|
||||||
- 断网后重试,确认使用原幂等键;网络恢复后不会重复扣减库存。
|
|
||||||
- 使用非法状态、库存不足、错误仓库/现场和旧详情快照,确认错误可见且状态不被部分写入。
|
|
||||||
|
|
||||||
## 6. 培训顺序
|
|
||||||
|
|
||||||
1. 讲解托盘二维码、状态和“服务端结果为准”原则。
|
|
||||||
2. 仓库操作员练习入库、装填、发货和退回收货。
|
|
||||||
3. 客户现场操作员练习扫码、产线选择、部分/全部使用和退回申请。
|
|
||||||
4. 管理员练习基础资料、用户数据范围、报表和托盘追溯。
|
|
||||||
5. 演练重复扫码、断网重试、无权限和库存不足,不使用真实业务数据做首次演示。
|
|
||||||
6. 培训结束后由各角色完成一条完整闭环:入库 → 装填 → 发货 → 使用 → 退回。
|
|
||||||
|
|
||||||
## 7. 当前不包含事项
|
|
||||||
|
|
||||||
- 本阶段不打包、签名、安装或发布 APK。
|
|
||||||
- 本阶段不调用摄像头扫码,不新增原生扫码 SDK;扫码方式为 HID 扫码头加手工输入兜底。
|
|
||||||
- 本手册不执行生产部署、数据库迁移、密码重置或客户培训;这些动作需在目标环境中按前置条件执行并留存记录。
|
|
||||||
|
|
||||||
## 8. 代码证据
|
|
||||||
|
|
||||||
- 设计与需求覆盖矩阵:`docs/superpowers/specs/2026-09-20-pda-business-workflow-design.md`
|
|
||||||
- PDA 页面与接口:`shierfeng-fastapi-app/src/pages/business`、`shierfeng-fastapi-app/src/api/business`
|
|
||||||
- Web 基础资料、业务和报表:`shierfeng-fastapi-frontend/src/views`
|
|
||||||
- 后端业务与状态机:`shierfeng-fastapi-backend/module_business`
|
|
||||||
- 数据库结构:`shierfeng-fastapi-backend/sql`
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,774 +0,0 @@
|
|||||||
# 业务菜单一级展示 Implementation Plan
|
|
||||||
|
|
||||||
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (- [ ]) syntax for tracking.
|
|
||||||
|
|
||||||
**Goal:** 将“基础资料维护”“业务管理”“报表查询”提升为独立一级菜单,并让六个目标一级目录按 121、122、123、1、2、3 的顺序展示。
|
|
||||||
|
|
||||||
**Architecture:** Web 菜单继续由后端 /getRouters 根据 sys_menu 动态生成,不增加前端拍平或重排代码。新建库通过 MySQL/PostgreSQL 初始化 SQL 得到目标层级,已有 MySQL 库通过独立、幂等、fail-closed 的 20260727 增量补丁迁移;已执行的 20260724 历史补丁保持不变。
|
|
||||||
|
|
||||||
**Tech Stack:** MySQL 8、PostgreSQL、Python 3.10 unittest、Ruff、Vue 3、Vite 6、Node 20。
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 文件结构与保护边界
|
|
||||||
|
|
||||||
- 修改 shierfeng-fastapi-backend/tests/module_business/test_sql_contract.py:区分初始化器目标状态与 20260724 补丁历史状态,并新增 20260727 补丁契约。
|
|
||||||
- 修改 shierfeng-fastapi-backend/sql/shierfeng-fastapi.sql:新建 MySQL 数据库的六个一级菜单层级与排序。
|
|
||||||
- 修改 shierfeng-fastapi-backend/sql/shierfeng-fastapi-pg.sql:新建 PostgreSQL 数据库的六个一级菜单层级与排序。
|
|
||||||
- 创建 shierfeng-fastapi-backend/sql/patches/20260727_promote_business_menus_mysql.sql:迁移现有 MySQL 数据库。
|
|
||||||
- 不修改 shierfeng-fastapi-backend/sql/patches/20260724_pallet_workflow_mysql.sql。
|
|
||||||
- 不修改 Web 前端源码、APP、API、权限标识、角色菜单关联、业务子菜单或数据库表结构。
|
|
||||||
- 当前工作区已有 APP、后端/前端环境文件和已暂存 .idea/git_toolbox_prj.xml;每次暂存和提交都必须按路径执行,禁止 git add -A。
|
|
||||||
|
|
||||||
## Task 1:用契约固定初始化器的目标层级,并保留历史补丁语义
|
|
||||||
|
|
||||||
**Files:**
|
|
||||||
|
|
||||||
- Modify: shierfeng-fastapi-backend/tests/module_business/test_sql_contract.py
|
|
||||||
- Modify: shierfeng-fastapi-backend/sql/shierfeng-fastapi.sql
|
|
||||||
- Modify: shierfeng-fastapi-backend/sql/shierfeng-fastapi-pg.sql
|
|
||||||
- Preserve: shierfeng-fastapi-backend/sql/patches/20260724_pallet_workflow_mysql.sql
|
|
||||||
|
|
||||||
- [ ] **Step 1:先修改契约测试,表达目标状态和历史状态**
|
|
||||||
|
|
||||||
在测试文件顶部保留旧补丁路径,并新增新补丁路径:
|
|
||||||
|
|
||||||
PATCH_PATH = SQL_ROOT / 'patches/20260724_pallet_workflow_mysql.sql'
|
|
||||||
MENU_PROMOTION_PATCH_PATH = SQL_ROOT / 'patches/20260727_promote_business_menus_mysql.sql'
|
|
||||||
|
|
||||||
把 BUSINESS_MENU_SPECS 的前三行改为初始化器目标值,其余 61 行原样保留:
|
|
||||||
|
|
||||||
BUSINESS_MENU_SPECS = """
|
|
||||||
121|0|基础资料维护|businessMaster||1||<NULL>
|
|
||||||
122|0|业务管理|businessOperation||2||<NULL>
|
|
||||||
123|0|报表查询|businessReport||3||<NULL>
|
|
||||||
502|121|菌种资料|strain||1|master:strain:list|master/strain/index
|
|
||||||
|
|
||||||
在 EXPECTED_BUSINESS_MENU_FIELDS 和 BUSINESS_MENU_IDS 定义之后加入:
|
|
||||||
|
|
||||||
LEGACY_PATCH_BUSINESS_MENU_FIELDS = {
|
|
||||||
**EXPECTED_BUSINESS_MENU_FIELDS,
|
|
||||||
121: (1, '基础资料维护', 'businessMaster', '', 10, '', None),
|
|
||||||
122: (1, '业务管理', 'businessOperation', '', 11, '', None),
|
|
||||||
123: (1, '报表查询', 'businessReport', '', 12, '', None),
|
|
||||||
}
|
|
||||||
EXPECTED_TOP_LEVEL_MENU_POSITIONS = {
|
|
||||||
121: ('基础资料维护', 0, 1),
|
|
||||||
122: ('业务管理', 0, 2),
|
|
||||||
123: ('报表查询', 0, 3),
|
|
||||||
1: ('系统管理', 0, 4),
|
|
||||||
2: ('系统监控', 0, 5),
|
|
||||||
3: ('系统工具', 0, 6),
|
|
||||||
}
|
|
||||||
MENU_PROMOTION_IDS = set(EXPECTED_TOP_LEVEL_MENU_POSITIONS)
|
|
||||||
|
|
||||||
不要把 1、2、3 加入 BUSINESS_MENU_IDS;该集合还被“新业务菜单不默认授权角色”的现有测试使用。
|
|
||||||
|
|
||||||
把菜单提取和字段断言改为以下实现:
|
|
||||||
|
|
||||||
def _menu_rows(sql: str, menu_ids: set[int]) -> dict[int, list]:
|
|
||||||
rows = _insert_rows(sql, 'sys_menu')
|
|
||||||
selected = [
|
|
||||||
row
|
|
||||||
for row in rows
|
|
||||||
if row and str(row[0]).isdigit() and int(row[0]) in menu_ids
|
|
||||||
]
|
|
||||||
counts = {
|
|
||||||
menu_id: sum(int(row[0]) == menu_id for row in selected)
|
|
||||||
for menu_id in menu_ids
|
|
||||||
}
|
|
||||||
if any(count != 1 for count in counts.values()):
|
|
||||||
raise AssertionError(f'menu row counts differ: {counts}')
|
|
||||||
return {int(row[0]): row for row in selected}
|
|
||||||
|
|
||||||
|
|
||||||
def _business_menu_rows(sql: str) -> dict[int, list]:
|
|
||||||
return _menu_rows(sql, BUSINESS_MENU_IDS)
|
|
||||||
|
|
||||||
|
|
||||||
def _assert_business_menu_fields(
|
|
||||||
test_case: unittest.TestCase,
|
|
||||||
sql: str,
|
|
||||||
expected_fields: dict[int, tuple] = EXPECTED_BUSINESS_MENU_FIELDS,
|
|
||||||
) -> None:
|
|
||||||
rows = _business_menu_rows(sql)
|
|
||||||
invalid_widths = {
|
|
||||||
menu_id: len(row)
|
|
||||||
for menu_id, row in rows.items()
|
|
||||||
if len(row) != SYS_MENU_VALUE_COUNT
|
|
||||||
}
|
|
||||||
test_case.assertEqual({}, invalid_widths)
|
|
||||||
actual = {
|
|
||||||
menu_id: (
|
|
||||||
int(row[2]),
|
|
||||||
row[1],
|
|
||||||
row[4],
|
|
||||||
row[7],
|
|
||||||
int(row[3]),
|
|
||||||
row[13],
|
|
||||||
row[5],
|
|
||||||
)
|
|
||||||
for menu_id, row in rows.items()
|
|
||||||
}
|
|
||||||
test_case.assertEqual(expected_fields, actual)
|
|
||||||
|
|
||||||
在 test_initializers_define_fixed_business_menus_and_permissions 中把三个根目录断言改成:
|
|
||||||
|
|
||||||
self.assertEqual(
|
|
||||||
('基础资料维护', '0', '1', 'businessMaster', 'M', ''),
|
|
||||||
tuple(rows[121][index] for index in (1, 2, 3, 4, 10, 13)),
|
|
||||||
)
|
|
||||||
self.assertEqual(
|
|
||||||
('业务管理', '0', '2', 'businessOperation', 'M', ''),
|
|
||||||
tuple(rows[122][index] for index in (1, 2, 3, 4, 10, 13)),
|
|
||||||
)
|
|
||||||
self.assertEqual(
|
|
||||||
('报表查询', '0', '3', 'businessReport', 'M', ''),
|
|
||||||
tuple(rows[123][index] for index in (1, 2, 3, 4, 10, 13)),
|
|
||||||
)
|
|
||||||
|
|
||||||
紧接该测试新增六个一级目录的顺序契约:
|
|
||||||
|
|
||||||
def test_initializers_define_expected_top_level_menu_order(self) -> None:
|
|
||||||
for filename in INITIALIZERS:
|
|
||||||
with self.subTest(filename=filename):
|
|
||||||
sql = (SQL_ROOT / filename).read_text(encoding='utf-8')
|
|
||||||
rows = _menu_rows(sql, MENU_PROMOTION_IDS)
|
|
||||||
actual = {
|
|
||||||
menu_id: (row[1], int(row[2]), int(row[3]))
|
|
||||||
for menu_id, row in rows.items()
|
|
||||||
}
|
|
||||||
self.assertEqual(EXPECTED_TOP_LEVEL_MENU_POSITIONS, actual)
|
|
||||||
|
|
||||||
在 test_patch_is_documented_idempotent_and_contains_full_contract 中,将旧补丁字段断言改成:
|
|
||||||
|
|
||||||
_assert_business_menu_fields(
|
|
||||||
self,
|
|
||||||
raw,
|
|
||||||
LEGACY_PATCH_BUSINESS_MENU_FIELDS,
|
|
||||||
)
|
|
||||||
|
|
||||||
同一测试中,旧补丁与当前 MySQL 初始化器的比较只比较不含 parent_id、order_num 的稳定字段:
|
|
||||||
|
|
||||||
compared_indexes = (0, 1, *range(4, 15))
|
|
||||||
self.assertEqual(
|
|
||||||
{
|
|
||||||
menu_id: tuple(row[index] for index in compared_indexes)
|
|
||||||
for menu_id, row in mysql_rows.items()
|
|
||||||
},
|
|
||||||
{
|
|
||||||
menu_id: tuple(row[index] for index in compared_indexes)
|
|
||||||
for menu_id, row in patch_rows.items()
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
- [ ] **Step 2:运行初始化器契约,确认 RED**
|
|
||||||
|
|
||||||
工作目录:shierfeng-fastapi-backend
|
|
||||||
|
|
||||||
PYTHONDONTWRITEBYTECODE=1 conda run -n ShiErFeng python -m unittest \
|
|
||||||
tests.module_business.test_sql_contract.SqlContractTest.test_initializers_define_fixed_business_menus_and_permissions \
|
|
||||||
tests.module_business.test_sql_contract.SqlContractTest.test_initializers_define_expected_top_level_menu_order \
|
|
||||||
-v
|
|
||||||
|
|
||||||
预期:FAIL。MySQL/PostgreSQL 初始化器仍将 121/122/123 放在 parent_id=1、order_num=10/11/12,1/2/3 仍使用 order_num=1/2/3。
|
|
||||||
|
|
||||||
- [ ] **Step 3:对两份初始化 SQL 做六行最小修改**
|
|
||||||
|
|
||||||
MySQL 的六行目标内容:
|
|
||||||
|
|
||||||
insert into sys_menu values('1', '系统管理', '0', '4', 'system', null, '', '', 1, 0, 'M', '0', '0', '', 'system', 'admin', sysdate(), '', null, '系统管理目录');
|
|
||||||
insert into sys_menu values('2', '系统监控', '0', '5', 'monitor', null, '', '', 1, 0, 'M', '0', '0', '', 'monitor', 'admin', sysdate(), '', null, '系统监控目录');
|
|
||||||
insert into sys_menu values('3', '系统工具', '0', '6', 'tool', null, '', '', 1, 0, 'M', '0', '0', '', 'tool', 'admin', sysdate(), '', null, '系统工具目录');
|
|
||||||
|
|
||||||
insert into sys_menu values('121', '基础资料维护', '0', '1', 'businessMaster', null, '', '', 1, 0, 'M', '0', '0', '', '#', 'admin', sysdate(), '', null, '基础资料维护目录');
|
|
||||||
insert into sys_menu values('122', '业务管理', '0', '2', 'businessOperation', null, '', '', 1, 0, 'M', '0', '0', '', '#', 'admin', sysdate(), '', null, '业务管理目录');
|
|
||||||
insert into sys_menu values('123', '报表查询', '0', '3', 'businessReport', null, '', '', 1, 0, 'M', '0', '0', '', '#', 'admin', sysdate(), '', null, '报表查询目录');
|
|
||||||
|
|
||||||
把 MySQL 注释“托盘业务目录”同步改为“托盘业务一级目录”。
|
|
||||||
|
|
||||||
PostgreSQL 的六行目标内容:
|
|
||||||
|
|
||||||
insert into sys_menu values(1, '系统管理', 0, '4', 'system', null, '', '', 1, 0, 'M', '0', '0', '', 'system', 'admin', current_timestamp, '', null, '系统管理目录');
|
|
||||||
insert into sys_menu values(2, '系统监控', 0, '5', 'monitor', null, '', '', 1, 0, 'M', '0', '0', '', 'monitor', 'admin', current_timestamp, '', null, '系统监控目录');
|
|
||||||
insert into sys_menu values(3, '系统工具', 0, '6', 'tool', null, '', '', 1, 0, 'M', '0', '0', '', 'tool', 'admin', current_timestamp, '', null, '系统工具目录');
|
|
||||||
|
|
||||||
(121, '基础资料维护', 0, '1', 'businessMaster', null, '', '', 1, 0, 'M', '0', '0', '', '#', 'admin', current_timestamp, '', null, ''),
|
|
||||||
(122, '业务管理', 0, '2', 'businessOperation', null, '', '', 1, 0, 'M', '0', '0', '', '#', 'admin', current_timestamp, '', null, ''),
|
|
||||||
(123, '报表查询', 0, '3', 'businessReport', null, '', '', 1, 0, 'M', '0', '0', '', '#', 'admin', current_timestamp, '', null, ''),
|
|
||||||
|
|
||||||
把 PostgreSQL 注释“初始化-托盘业务菜单和权限”同步改为“初始化-托盘业务一级菜单和权限”。
|
|
||||||
|
|
||||||
- [ ] **Step 4:运行 GREEN 和历史补丁兼容回归**
|
|
||||||
|
|
||||||
工作目录:shierfeng-fastapi-backend
|
|
||||||
|
|
||||||
PYTHONDONTWRITEBYTECODE=1 conda run -n ShiErFeng python -m unittest \
|
|
||||||
tests.module_business.test_sql_contract.SqlContractTest.test_initializers_define_fixed_business_menus_and_permissions \
|
|
||||||
tests.module_business.test_sql_contract.SqlContractTest.test_initializers_define_expected_top_level_menu_order \
|
|
||||||
tests.module_business.test_sql_contract.SqlContractTest.test_mysql_and_postgresql_business_menu_fields_are_identical \
|
|
||||||
tests.module_business.test_sql_contract.SqlContractTest.test_patch_is_documented_idempotent_and_contains_full_contract \
|
|
||||||
-v
|
|
||||||
|
|
||||||
预期:4 项均通过;旧 20260724 补丁仍按历史层级通过契约,不发生文件改动。
|
|
||||||
|
|
||||||
- [ ] **Step 5:提交初始化器和对应契约**
|
|
||||||
|
|
||||||
从仓库根目录执行:
|
|
||||||
|
|
||||||
git add -- \
|
|
||||||
shierfeng-fastapi-backend/tests/module_business/test_sql_contract.py \
|
|
||||||
shierfeng-fastapi-backend/sql/shierfeng-fastapi.sql \
|
|
||||||
shierfeng-fastapi-backend/sql/shierfeng-fastapi-pg.sql
|
|
||||||
git commit --only -m '调整:提升业务菜单为一级目录' -- \
|
|
||||||
shierfeng-fastapi-backend/tests/module_business/test_sql_contract.py \
|
|
||||||
shierfeng-fastapi-backend/sql/shierfeng-fastapi.sql \
|
|
||||||
shierfeng-fastapi-backend/sql/shierfeng-fastapi-pg.sql
|
|
||||||
|
|
||||||
提交后确认 .idea/git_toolbox_prj.xml 仍单独处于暂存区。
|
|
||||||
|
|
||||||
## Task 2:新增幂等、fail-closed 的 MySQL 前向补丁
|
|
||||||
|
|
||||||
**Files:**
|
|
||||||
|
|
||||||
- Modify: shierfeng-fastapi-backend/tests/module_business/test_sql_contract.py
|
|
||||||
- Create: shierfeng-fastapi-backend/sql/patches/20260727_promote_business_menus_mysql.sql
|
|
||||||
|
|
||||||
- [ ] **Step 1:先写新补丁的失败契约**
|
|
||||||
|
|
||||||
在 SqlContractTest 中新增:
|
|
||||||
|
|
||||||
def test_menu_promotion_patch_is_fail_closed_atomic_and_exact(self) -> None:
|
|
||||||
self.assertTrue(
|
|
||||||
MENU_PROMOTION_PATCH_PATH.is_file(),
|
|
||||||
f'missing patch: {MENU_PROMOTION_PATCH_PATH}',
|
|
||||||
)
|
|
||||||
raw = MENU_PROMOTION_PATCH_PATH.read_text(encoding='utf-8')
|
|
||||||
self.assertIn('备份', raw)
|
|
||||||
self.assertIn('未自动执行', raw)
|
|
||||||
self.assertIn('可幂等重跑', raw)
|
|
||||||
self.assertIn('禁止使用 mysql --force', raw)
|
|
||||||
|
|
||||||
statements = _sql_statements(raw)
|
|
||||||
normalized = [_normalized_sql_statement(statement) for statement in statements]
|
|
||||||
expected_table = 'promote_business_menus_expected'
|
|
||||||
guard_table = 'promote_business_menus_guard'
|
|
||||||
|
|
||||||
expected_insert_indexes = [
|
|
||||||
index
|
|
||||||
for index, statement in enumerate(normalized)
|
|
||||||
if statement.startswith(f'insert into {expected_table} ')
|
|
||||||
]
|
|
||||||
self.assertEqual(1, len(expected_insert_indexes))
|
|
||||||
expected_rows = _insert_rows(
|
|
||||||
statements[expected_insert_indexes[0]],
|
|
||||||
expected_table,
|
|
||||||
)
|
|
||||||
self.assertEqual(6, len(expected_rows))
|
|
||||||
actual_expected_rows = {
|
|
||||||
int(row[0]): tuple(row[1:])
|
|
||||||
for row in expected_rows
|
|
||||||
}
|
|
||||||
self.assertEqual(
|
|
||||||
{
|
|
||||||
1: ('系统管理', 'system', None, '', '', '1', '0', 'M', '0', '0', '', 'system', '0', '1', '0', '4'),
|
|
||||||
2: ('系统监控', 'monitor', None, '', '', '1', '0', 'M', '0', '0', '', 'monitor', '0', '2', '0', '5'),
|
|
||||||
3: ('系统工具', 'tool', None, '', '', '1', '0', 'M', '0', '0', '', 'tool', '0', '3', '0', '6'),
|
|
||||||
121: ('基础资料维护', 'businessMaster', None, '', '', '1', '0', 'M', '0', '0', '', '#', '1', '10', '0', '1'),
|
|
||||||
122: ('业务管理', 'businessOperation', None, '', '', '1', '0', 'M', '0', '0', '', '#', '1', '11', '0', '2'),
|
|
||||||
123: ('报表查询', 'businessReport', None, '', '', '1', '0', 'M', '0', '0', '', '#', '1', '12', '0', '3'),
|
|
||||||
},
|
|
||||||
actual_expected_rows,
|
|
||||||
)
|
|
||||||
|
|
||||||
starts = [
|
|
||||||
index
|
|
||||||
for index, statement in enumerate(normalized)
|
|
||||||
if statement == 'start transaction'
|
|
||||||
]
|
|
||||||
commits = [
|
|
||||||
index
|
|
||||||
for index, statement in enumerate(normalized)
|
|
||||||
if statement == 'commit'
|
|
||||||
]
|
|
||||||
self.assertEqual(1, len(starts))
|
|
||||||
self.assertEqual(1, len(commits))
|
|
||||||
start_transaction = starts[0]
|
|
||||||
commit = commits[0]
|
|
||||||
|
|
||||||
row_locks = [
|
|
||||||
index
|
|
||||||
for index, statement in enumerate(normalized)
|
|
||||||
if re.fullmatch(
|
|
||||||
r'select menu_id from sys_menu '
|
|
||||||
r'where menu_id in \(1, 2, 3, 121, 122, 123\) '
|
|
||||||
r'order by menu_id for update',
|
|
||||||
statement,
|
|
||||||
)
|
|
||||||
]
|
|
||||||
self.assertEqual(1, len(row_locks))
|
|
||||||
|
|
||||||
guard_indexes = [
|
|
||||||
index
|
|
||||||
for index, statement in enumerate(normalized)
|
|
||||||
if statement.startswith(f'insert into {guard_table} ')
|
|
||||||
]
|
|
||||||
self.assertEqual(2, len(guard_indexes))
|
|
||||||
precondition_guard = normalized[guard_indexes[0]]
|
|
||||||
postcondition_guard = normalized[guard_indexes[1]]
|
|
||||||
self.assertIn('as precondition_guard_rows', precondition_guard)
|
|
||||||
self.assertIn('as postcondition_guard_rows', postcondition_guard)
|
|
||||||
self.assertEqual(
|
|
||||||
2,
|
|
||||||
precondition_guard.count(
|
|
||||||
"'promote-business-menus-precondition-conflict'"
|
|
||||||
),
|
|
||||||
)
|
|
||||||
self.assertEqual(
|
|
||||||
2,
|
|
||||||
postcondition_guard.count(
|
|
||||||
"'promote-business-menus-postcondition-conflict'"
|
|
||||||
),
|
|
||||||
)
|
|
||||||
|
|
||||||
identity_columns = (
|
|
||||||
('menu_name', 'menu_name'),
|
|
||||||
('path', 'path'),
|
|
||||||
('component', 'component'),
|
|
||||||
('query', 'query_value'),
|
|
||||||
('route_name', 'route_name'),
|
|
||||||
('is_frame', 'is_frame'),
|
|
||||||
('is_cache', 'is_cache'),
|
|
||||||
('menu_type', 'menu_type'),
|
|
||||||
('visible', 'visible'),
|
|
||||||
('status', 'status'),
|
|
||||||
('perms', 'perms'),
|
|
||||||
('icon', 'icon'),
|
|
||||||
)
|
|
||||||
for actual_column, expected_column in identity_columns:
|
|
||||||
comparison = (
|
|
||||||
f'actual.{actual_column} <=> expected.{expected_column}'
|
|
||||||
)
|
|
||||||
self.assertIn(comparison, precondition_guard)
|
|
||||||
self.assertIn(comparison, postcondition_guard)
|
|
||||||
|
|
||||||
compact_precondition = re.sub(r'\s+', '', precondition_guard)
|
|
||||||
self.assertIn('count(actual.menu_id)=6', compact_precondition)
|
|
||||||
self.assertIn(
|
|
||||||
'sum((actual.parent_id<=>expected.old_parent_id)'
|
|
||||||
'and(actual.order_num<=>expected.old_order_num))=6',
|
|
||||||
compact_precondition,
|
|
||||||
)
|
|
||||||
self.assertIn(
|
|
||||||
'sum((actual.parent_id<=>expected.new_parent_id)'
|
|
||||||
'and(actual.order_num<=>expected.new_order_num))=6',
|
|
||||||
compact_precondition,
|
|
||||||
)
|
|
||||||
compact_postcondition = re.sub(r'\s+', '', postcondition_guard)
|
|
||||||
self.assertIn('count(actual.menu_id)=6', compact_postcondition)
|
|
||||||
self.assertIn(
|
|
||||||
'sum((actual.parent_id<=>expected.new_parent_id)'
|
|
||||||
'and(actual.order_num<=>expected.new_order_num))=6',
|
|
||||||
compact_postcondition,
|
|
||||||
)
|
|
||||||
|
|
||||||
expected_update = (
|
|
||||||
'update sys_menu set parent_id = case '
|
|
||||||
'when menu_id in (121, 122, 123) then 0 '
|
|
||||||
'else parent_id end, order_num = case menu_id '
|
|
||||||
'when 121 then 1 when 122 then 2 when 123 then 3 '
|
|
||||||
'when 1 then 4 when 2 then 5 when 3 then 6 '
|
|
||||||
'else order_num end '
|
|
||||||
'where menu_id in (1, 2, 3, 121, 122, 123)'
|
|
||||||
)
|
|
||||||
update_indexes = [
|
|
||||||
index
|
|
||||||
for index, statement in enumerate(normalized)
|
|
||||||
if statement == expected_update
|
|
||||||
]
|
|
||||||
self.assertEqual(1, len(update_indexes))
|
|
||||||
update_index = update_indexes[0]
|
|
||||||
|
|
||||||
permanent_mutations = [
|
|
||||||
statement
|
|
||||||
for statement in normalized
|
|
||||||
if re.match(
|
|
||||||
r'(?:insert\s+into|replace\s+into|update|delete\s+from)\s+sys_',
|
|
||||||
statement,
|
|
||||||
)
|
|
||||||
]
|
|
||||||
self.assertEqual([expected_update], permanent_mutations)
|
|
||||||
self.assertEqual(
|
|
||||||
(
|
|
||||||
start_transaction,
|
|
||||||
row_locks[0],
|
|
||||||
guard_indexes[0],
|
|
||||||
update_index,
|
|
||||||
guard_indexes[1],
|
|
||||||
commit,
|
|
||||||
),
|
|
||||||
tuple(
|
|
||||||
sorted(
|
|
||||||
(
|
|
||||||
start_transaction,
|
|
||||||
row_locks[0],
|
|
||||||
guard_indexes[0],
|
|
||||||
update_index,
|
|
||||||
guard_indexes[1],
|
|
||||||
commit,
|
|
||||||
)
|
|
||||||
)
|
|
||||||
),
|
|
||||||
)
|
|
||||||
|
|
||||||
expected_verification = (
|
|
||||||
'select menu_id, menu_name, parent_id, order_num, path, component, '
|
|
||||||
'menu_type, visible, status, perms from sys_menu '
|
|
||||||
'where menu_id in (1, 2, 3, 121, 122, 123) '
|
|
||||||
'order by order_num, menu_id'
|
|
||||||
)
|
|
||||||
self.assertEqual(expected_verification, normalized[-1])
|
|
||||||
|
|
||||||
- [ ] **Step 2:运行新补丁契约,确认 RED**
|
|
||||||
|
|
||||||
工作目录:shierfeng-fastapi-backend
|
|
||||||
|
|
||||||
PYTHONDONTWRITEBYTECODE=1 conda run -n ShiErFeng python -m unittest \
|
|
||||||
tests.module_business.test_sql_contract.SqlContractTest.test_menu_promotion_patch_is_fail_closed_atomic_and_exact \
|
|
||||||
-v
|
|
||||||
|
|
||||||
预期:FAIL,错误指出缺少 20260727_promote_business_menus_mysql.sql。
|
|
||||||
|
|
||||||
- [ ] **Step 3:创建最小 MySQL 前向补丁**
|
|
||||||
|
|
||||||
创建 shierfeng-fastapi-backend/sql/patches/20260727_promote_business_menus_mysql.sql,内容如下:
|
|
||||||
|
|
||||||
-- 将托盘业务目录 121/122/123 提升为一级菜单,并将系统菜单 1/2/3 后移。
|
|
||||||
-- 本补丁只更新 sys_menu.parent_id 和 sys_menu.order_num。
|
|
||||||
-- 本文件未自动执行;执行前必须备份目标数据库。
|
|
||||||
--
|
|
||||||
-- 必须在独立连接中使用标准 mysql batch 执行,并确保客户端遇错立即退出。
|
|
||||||
-- 禁止使用 mysql --force;guard 的 Duplicate entry 是故意设计的 fail-closed 错误,
|
|
||||||
-- 不能忽略错误继续执行到 commit。
|
|
||||||
--
|
|
||||||
-- 允许的写前状态只有两种:
|
|
||||||
-- 1. 20260724 旧状态;
|
|
||||||
-- 2. 本补丁目标状态,因此可幂等重跑。
|
|
||||||
-- 缺行、固定 ID 身份冲突或新旧状态混杂都会在永久更新前中止。
|
|
||||||
|
|
||||||
drop temporary table if exists promote_business_menus_expected;
|
|
||||||
create temporary table promote_business_menus_expected (
|
|
||||||
menu_id bigint not null,
|
|
||||||
menu_name varchar(50) not null,
|
|
||||||
path varchar(200),
|
|
||||||
component varchar(255),
|
|
||||||
query_value varchar(255),
|
|
||||||
route_name varchar(50),
|
|
||||||
is_frame int,
|
|
||||||
is_cache int,
|
|
||||||
menu_type char(1),
|
|
||||||
visible char(1),
|
|
||||||
status char(1),
|
|
||||||
perms varchar(100),
|
|
||||||
icon varchar(100),
|
|
||||||
old_parent_id bigint not null,
|
|
||||||
old_order_num int not null,
|
|
||||||
new_parent_id bigint not null,
|
|
||||||
new_order_num int not null,
|
|
||||||
primary key (menu_id)
|
|
||||||
) engine=innodb;
|
|
||||||
|
|
||||||
insert into promote_business_menus_expected (
|
|
||||||
menu_id, menu_name, path, component, query_value, route_name,
|
|
||||||
is_frame, is_cache, menu_type, visible, status, perms, icon,
|
|
||||||
old_parent_id, old_order_num, new_parent_id, new_order_num
|
|
||||||
) values
|
|
||||||
(1, '系统管理', 'system', null, '', '', 1, 0, 'M', '0', '0', '', 'system', 0, 1, 0, 4),
|
|
||||||
(2, '系统监控', 'monitor', null, '', '', 1, 0, 'M', '0', '0', '', 'monitor', 0, 2, 0, 5),
|
|
||||||
(3, '系统工具', 'tool', null, '', '', 1, 0, 'M', '0', '0', '', 'tool', 0, 3, 0, 6),
|
|
||||||
(121, '基础资料维护', 'businessMaster', null, '', '', 1, 0, 'M', '0', '0', '', '#', 1, 10, 0, 1),
|
|
||||||
(122, '业务管理', 'businessOperation', null, '', '', 1, 0, 'M', '0', '0', '', '#', 1, 11, 0, 2),
|
|
||||||
(123, '报表查询', 'businessReport', null, '', '', 1, 0, 'M', '0', '0', '', '#', 1, 12, 0, 3);
|
|
||||||
|
|
||||||
drop temporary table if exists promote_business_menus_guard;
|
|
||||||
create temporary table promote_business_menus_guard (
|
|
||||||
guard_token varchar(64) not null,
|
|
||||||
primary key (guard_token)
|
|
||||||
) engine=innodb;
|
|
||||||
|
|
||||||
start transaction;
|
|
||||||
|
|
||||||
-- 锁定目标行,防止身份校验与更新之间被并发修改。
|
|
||||||
select menu_id
|
|
||||||
from sys_menu
|
|
||||||
where menu_id in (1, 2, 3, 121, 122, 123)
|
|
||||||
order by menu_id
|
|
||||||
for update;
|
|
||||||
|
|
||||||
-- 写前身份和整体状态校验。失败时重复 token 触发主键冲突并终止 batch。
|
|
||||||
insert into promote_business_menus_guard (guard_token)
|
|
||||||
select guard_token
|
|
||||||
from (
|
|
||||||
select 'promote-business-menus-precondition-conflict' as guard_token
|
|
||||||
union all
|
|
||||||
select if(
|
|
||||||
count(actual.menu_id) = 6
|
|
||||||
and sum(
|
|
||||||
(actual.menu_name <=> expected.menu_name)
|
|
||||||
and (actual.path <=> expected.path)
|
|
||||||
and (actual.component <=> expected.component)
|
|
||||||
and (actual.query <=> expected.query_value)
|
|
||||||
and (actual.route_name <=> expected.route_name)
|
|
||||||
and (actual.is_frame <=> expected.is_frame)
|
|
||||||
and (actual.is_cache <=> expected.is_cache)
|
|
||||||
and (actual.menu_type <=> expected.menu_type)
|
|
||||||
and (actual.visible <=> expected.visible)
|
|
||||||
and (actual.status <=> expected.status)
|
|
||||||
and (actual.perms <=> expected.perms)
|
|
||||||
and (actual.icon <=> expected.icon)
|
|
||||||
) = 6
|
|
||||||
and (
|
|
||||||
sum(
|
|
||||||
(actual.parent_id <=> expected.old_parent_id)
|
|
||||||
and (actual.order_num <=> expected.old_order_num)
|
|
||||||
) = 6
|
|
||||||
or sum(
|
|
||||||
(actual.parent_id <=> expected.new_parent_id)
|
|
||||||
and (actual.order_num <=> expected.new_order_num)
|
|
||||||
) = 6
|
|
||||||
),
|
|
||||||
'promote-business-menus-precondition-verified',
|
|
||||||
'promote-business-menus-precondition-conflict'
|
|
||||||
) as guard_token
|
|
||||||
from promote_business_menus_expected as expected
|
|
||||||
left join sys_menu as actual
|
|
||||||
on actual.menu_id = expected.menu_id
|
|
||||||
) as precondition_guard_rows;
|
|
||||||
|
|
||||||
-- 永久变更只涉及 parent_id 和 order_num。
|
|
||||||
update sys_menu
|
|
||||||
set parent_id = case
|
|
||||||
when menu_id in (121, 122, 123) then 0
|
|
||||||
else parent_id
|
|
||||||
end,
|
|
||||||
order_num = case menu_id
|
|
||||||
when 121 then 1
|
|
||||||
when 122 then 2
|
|
||||||
when 123 then 3
|
|
||||||
when 1 then 4
|
|
||||||
when 2 then 5
|
|
||||||
when 3 then 6
|
|
||||||
else order_num
|
|
||||||
end
|
|
||||||
where menu_id in (1, 2, 3, 121, 122, 123);
|
|
||||||
|
|
||||||
-- 提交前再次校验目标状态,捕获未覆盖行或触发器造成的意外变化。
|
|
||||||
insert into promote_business_menus_guard (guard_token)
|
|
||||||
select guard_token
|
|
||||||
from (
|
|
||||||
select 'promote-business-menus-postcondition-conflict' as guard_token
|
|
||||||
union all
|
|
||||||
select if(
|
|
||||||
count(actual.menu_id) = 6
|
|
||||||
and sum(
|
|
||||||
(actual.menu_name <=> expected.menu_name)
|
|
||||||
and (actual.path <=> expected.path)
|
|
||||||
and (actual.component <=> expected.component)
|
|
||||||
and (actual.query <=> expected.query_value)
|
|
||||||
and (actual.route_name <=> expected.route_name)
|
|
||||||
and (actual.is_frame <=> expected.is_frame)
|
|
||||||
and (actual.is_cache <=> expected.is_cache)
|
|
||||||
and (actual.menu_type <=> expected.menu_type)
|
|
||||||
and (actual.visible <=> expected.visible)
|
|
||||||
and (actual.status <=> expected.status)
|
|
||||||
and (actual.perms <=> expected.perms)
|
|
||||||
and (actual.icon <=> expected.icon)
|
|
||||||
) = 6
|
|
||||||
and sum(
|
|
||||||
(actual.parent_id <=> expected.new_parent_id)
|
|
||||||
and (actual.order_num <=> expected.new_order_num)
|
|
||||||
) = 6,
|
|
||||||
'promote-business-menus-postcondition-verified',
|
|
||||||
'promote-business-menus-postcondition-conflict'
|
|
||||||
) as guard_token
|
|
||||||
from promote_business_menus_expected as expected
|
|
||||||
left join sys_menu as actual
|
|
||||||
on actual.menu_id = expected.menu_id
|
|
||||||
) as postcondition_guard_rows;
|
|
||||||
|
|
||||||
commit;
|
|
||||||
|
|
||||||
drop temporary table promote_business_menus_guard;
|
|
||||||
drop temporary table promote_business_menus_expected;
|
|
||||||
|
|
||||||
-- 固定 ID 事后核对:顺序应为 121、122、123、1、2、3。
|
|
||||||
select menu_id, menu_name, parent_id, order_num, path, component,
|
|
||||||
menu_type, visible, status, perms
|
|
||||||
from sys_menu
|
|
||||||
where menu_id in (1, 2, 3, 121, 122, 123)
|
|
||||||
order by order_num, menu_id;
|
|
||||||
|
|
||||||
- [ ] **Step 4:运行新补丁契约与完整 SQL 契约**
|
|
||||||
|
|
||||||
工作目录:shierfeng-fastapi-backend
|
|
||||||
|
|
||||||
PYTHONDONTWRITEBYTECODE=1 conda run -n ShiErFeng python -m unittest \
|
|
||||||
tests.module_business.test_sql_contract.SqlContractTest.test_menu_promotion_patch_is_fail_closed_atomic_and_exact \
|
|
||||||
-v
|
|
||||||
PYTHONDONTWRITEBYTECODE=1 conda run -n ShiErFeng python -m unittest \
|
|
||||||
tests.module_business.test_sql_contract \
|
|
||||||
-v
|
|
||||||
conda run -n ShiErFeng python -m ruff format --check \
|
|
||||||
tests/module_business/test_sql_contract.py
|
|
||||||
conda run -n ShiErFeng python -m ruff check \
|
|
||||||
tests/module_business/test_sql_contract.py
|
|
||||||
|
|
||||||
预期:新补丁定向契约通过,完整 SQL 契约全部通过,Ruff format/check 均为成功退出。
|
|
||||||
|
|
||||||
- [ ] **Step 5:提交新补丁和对应契约**
|
|
||||||
|
|
||||||
从仓库根目录执行:
|
|
||||||
|
|
||||||
git add -- \
|
|
||||||
shierfeng-fastapi-backend/tests/module_business/test_sql_contract.py \
|
|
||||||
shierfeng-fastapi-backend/sql/patches/20260727_promote_business_menus_mysql.sql
|
|
||||||
git commit --only -m '迁移:新增业务菜单层级补丁' -- \
|
|
||||||
shierfeng-fastapi-backend/tests/module_business/test_sql_contract.py \
|
|
||||||
shierfeng-fastapi-backend/sql/patches/20260727_promote_business_menus_mysql.sql
|
|
||||||
|
|
||||||
提交后再次确认 .idea/git_toolbox_prj.xml 仍单独处于暂存区,APP 和环境文件指纹未变化。
|
|
||||||
|
|
||||||
## Task 3:完成代码级回归验证
|
|
||||||
|
|
||||||
**Files:**
|
|
||||||
|
|
||||||
- Verify only: shierfeng-fastapi-backend
|
|
||||||
- Verify only: shierfeng-fastapi-frontend
|
|
||||||
|
|
||||||
- [ ] **Step 1:运行后端业务测试和 SQL 契约**
|
|
||||||
|
|
||||||
工作目录:shierfeng-fastapi-backend
|
|
||||||
|
|
||||||
PYTHONDONTWRITEBYTECODE=1 conda run -n ShiErFeng python -m unittest discover \
|
|
||||||
-s tests/module_business -p 'test_*.py' -v
|
|
||||||
|
|
||||||
预期:全部业务测试通过,不生成新的 Python 字节码。
|
|
||||||
|
|
||||||
- [ ] **Step 2:运行后端格式和静态检查**
|
|
||||||
|
|
||||||
工作目录:shierfeng-fastapi-backend
|
|
||||||
|
|
||||||
conda run -n ShiErFeng python -m ruff format --check \
|
|
||||||
module_business tests/module_business
|
|
||||||
conda run -n ShiErFeng python -m ruff check \
|
|
||||||
module_business tests/module_business
|
|
||||||
|
|
||||||
预期:两条命令均成功退出,无格式或 lint 错误。
|
|
||||||
|
|
||||||
- [ ] **Step 3:运行 Web 契约与生产构建**
|
|
||||||
|
|
||||||
工作目录:shierfeng-fastapi-frontend
|
|
||||||
|
|
||||||
/Users/jiaolongyan/.nvm/versions/node/v20.20.2/bin/node \
|
|
||||||
--test scripts/verify-business-contract.mjs
|
|
||||||
/Users/jiaolongyan/.nvm/versions/node/v20.20.2/bin/node \
|
|
||||||
/Users/jiaolongyan/.nvm/versions/node/v20.20.2/lib/node_modules/npm/bin/npm-cli.js \
|
|
||||||
run build:prod
|
|
||||||
|
|
||||||
预期:Node 业务契约全部通过,Vite 生产构建成功。构建会读取用户已有的前端环境文件,但本任务不得修改或提交这些文件。
|
|
||||||
|
|
||||||
- [ ] **Step 4:检查 diff、提交边界和受保护改动**
|
|
||||||
|
|
||||||
从仓库根目录执行:
|
|
||||||
|
|
||||||
git diff --check
|
|
||||||
git status --short --branch
|
|
||||||
git diff --cached --name-status
|
|
||||||
|
|
||||||
预期:git diff --check 无输出;本任务代码已按路径提交;.idea/git_toolbox_prj.xml 仍保持用户原有暂存状态;APP、环境文件、缓存、日志和构建产物未被纳入提交。
|
|
||||||
|
|
||||||
## Task 4:经再次确认后迁移本地 MySQL 并验收菜单
|
|
||||||
|
|
||||||
**Files:**
|
|
||||||
|
|
||||||
- Read configuration: shierfeng-fastapi-backend/.env.dev
|
|
||||||
- Execute: shierfeng-fastapi-backend/sql/patches/20260727_promote_business_menus_mysql.sql
|
|
||||||
- Backup output pattern: /private/tmp/shierfeng-fastapi-before-promote-business-menus-YYYYMMDD-HHMMSS.sql
|
|
||||||
|
|
||||||
- [ ] **Step 1:停止并取得数据库写入确认**
|
|
||||||
|
|
||||||
向用户列出:目标数据库来自 .env.dev、将创建新的全库备份、将执行的补丁文件、只更新 sys_menu 六行的 parent_id/order_num、禁止 mysql --force。没有本次明确确认时不得执行后续步骤。
|
|
||||||
|
|
||||||
- [ ] **Step 2:确认后创建新的数据库备份并执行补丁**
|
|
||||||
|
|
||||||
工作目录:shierfeng-fastapi-backend。以下命令不打印密码,且 set -e 保证备份或补丁遇错立即退出:
|
|
||||||
|
|
||||||
set -euo pipefail
|
|
||||||
task_db_type=$(sed -nE "s/^[[:space:]]*DB_TYPE[[:space:]]*=[[:space:]]*'([^']*)'.*/\1/p" .env.dev)
|
|
||||||
task_db_host=$(sed -nE "s/^[[:space:]]*DB_HOST[[:space:]]*=[[:space:]]*'([^']*)'.*/\1/p" .env.dev)
|
|
||||||
task_db_port=$(sed -nE "s/^[[:space:]]*DB_PORT[[:space:]]*=[[:space:]]*([0-9]+).*/\1/p" .env.dev)
|
|
||||||
task_db_user=$(sed -nE "s/^[[:space:]]*DB_USERNAME[[:space:]]*=[[:space:]]*'([^']*)'.*/\1/p" .env.dev)
|
|
||||||
task_db_password=$(sed -nE "s/^[[:space:]]*DB_PASSWORD[[:space:]]*=[[:space:]]*'([^']*)'.*/\1/p" .env.dev)
|
|
||||||
task_db_name=$(sed -nE "s/^[[:space:]]*DB_DATABASE[[:space:]]*=[[:space:]]*'([^']*)'.*/\1/p" .env.dev)
|
|
||||||
test "$task_db_type" = 'mysql'
|
|
||||||
test -n "$task_db_host"
|
|
||||||
test -n "$task_db_port"
|
|
||||||
test -n "$task_db_user"
|
|
||||||
test -n "$task_db_password"
|
|
||||||
test -n "$task_db_name"
|
|
||||||
task_backup_path="/private/tmp/shierfeng-fastapi-before-promote-business-menus-$(date +%Y%m%d-%H%M%S).sql"
|
|
||||||
MYSQL_PWD="$task_db_password" mysqldump \
|
|
||||||
--host="$task_db_host" \
|
|
||||||
--port="$task_db_port" \
|
|
||||||
--user="$task_db_user" \
|
|
||||||
--single-transaction \
|
|
||||||
--routines \
|
|
||||||
--triggers \
|
|
||||||
--events \
|
|
||||||
--no-tablespaces \
|
|
||||||
"$task_db_name" > "$task_backup_path"
|
|
||||||
test -s "$task_backup_path"
|
|
||||||
shasum -a 256 "$task_backup_path"
|
|
||||||
MYSQL_PWD="$task_db_password" mysql \
|
|
||||||
--host="$task_db_host" \
|
|
||||||
--port="$task_db_port" \
|
|
||||||
--user="$task_db_user" \
|
|
||||||
--database="$task_db_name" \
|
|
||||||
< sql/patches/20260727_promote_business_menus_mysql.sql
|
|
||||||
unset task_db_password
|
|
||||||
|
|
||||||
预期:生成新的非空备份并输出其 SHA-256;mysql 使用独立连接、未带 --force;补丁最后输出六个目标菜单,parent_id 均为 0,order_num 依次为 1、2、3、4、5、6。
|
|
||||||
|
|
||||||
- [ ] **Step 3:只读核对数据库菜单和不变量**
|
|
||||||
|
|
||||||
继续使用 .env.dev 解析出的连接参数,在新的 mysql 连接执行:
|
|
||||||
|
|
||||||
select menu_id, menu_name, parent_id, order_num, path, component,
|
|
||||||
menu_type, visible, status, perms
|
|
||||||
from sys_menu
|
|
||||||
where menu_id in (1, 2, 3, 121, 122, 123)
|
|
||||||
order by order_num, menu_id;
|
|
||||||
|
|
||||||
select parent_id, count(*) as child_count
|
|
||||||
from sys_menu
|
|
||||||
where parent_id in (121, 122, 123)
|
|
||||||
group by parent_id
|
|
||||||
order by parent_id;
|
|
||||||
|
|
||||||
select count(*) as business_permission_count
|
|
||||||
from sys_menu
|
|
||||||
where perms regexp '^(master|business|report):';
|
|
||||||
|
|
||||||
预期:六个根目录顺序为 121、122、123、1、2、3;121/122/123 的直属子菜单数为 6、5、6;业务权限菜单总数为 61。
|
|
||||||
|
|
||||||
- [ ] **Step 4:重新登录并核对 /getRouters 与 Web 侧边栏**
|
|
||||||
|
|
||||||
保持现有前后端启动方式不变,退出 Web 登录后重新登录,使现有登录缓存刷新。确认 /getRouters 返回的根节点依次包含“基础资料维护”“业务管理”“报表查询”“系统管理”“系统监控”“系统工具”,三个业务目录不再出现在“系统管理”的 children 中;侧边栏顺序与返回结果一致。不得执行 Redis FLUSHALL,也不修改 APP。
|
|
||||||
|
|
||||||
## 最终验收
|
|
||||||
|
|
||||||
- 新建 MySQL/PostgreSQL 数据库直接得到目标一级菜单层级。
|
|
||||||
- 已有 MySQL 数据库只能从完整旧状态或完整目标状态执行 20260727 补丁;缺行、ID 复用、身份漂移和新旧状态混杂均在永久更新前失败。
|
|
||||||
- 永久 DML 只更新六个 sys_menu 行的 parent_id/order_num,并在提交前复核目标状态。
|
|
||||||
- 20260724 历史补丁、子菜单、API、权限标识、角色关联、Web 动态路由机制与 APP 均保持不变。
|
|
||||||
- 后端业务测试、SQL 契约、Ruff、Web 业务契约和生产构建均通过。
|
|
||||||
@@ -1,721 +0,0 @@
|
|||||||
# PDA 托盘业务操作功能 Implementation Plan
|
|
||||||
|
|
||||||
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
|
|
||||||
|
|
||||||
**Goal:** 在不改变 FastAPI 业务契约的前提下,为 `shierfeng-fastapi-app` 增加可在 H5/开发环境验证的托盘入库、装填、发货、现场使用和退回操作。
|
|
||||||
|
|
||||||
**Architecture:** PDA 复用现有 `request`、JWT、传输加密和后端业务接口;API 封装按业务模块拆分,扫码输入和幂等键生成作为无业务状态的共享工具。五个页面各自维护表单、扫码会话、请求代数和服务端刷新状态,后端继续作为权限、库存、状态机、产线绑定和退回集合校验的唯一权威。
|
|
||||||
|
|
||||||
**Tech Stack:** uni-app Vue 3、Pinia、Tailwind CSS、现有 `src/utils/request.js`、Node 20 `node:test`、pnpm;不增加依赖。
|
|
||||||
|
|
||||||
**Spec:** `docs/superpowers/specs/2026-09-20-pda-business-workflow-design.md`
|
|
||||||
|
|
||||||
## Global Constraints
|
|
||||||
|
|
||||||
- 不打包、签名、安装或发布 APK;只运行 PDA 的 H5/开发构建。
|
|
||||||
- 不调用摄像头扫码,不新增原生扫码 SDK;扫码输入必须兼容 HID 键盘逐字符输入后回车提交,并保留手工输入。
|
|
||||||
- 不修改现有 FastAPI 业务接口的请求/响应契约,不在 PDA 前端计算最终库存或托盘状态。
|
|
||||||
- 基础资料维护和六类报表继续使用 Web 后台,不复制到 PDA。
|
|
||||||
- 不把管理员密码、Token、Cookie 或其他凭据写入源码、测试固定文本或日志;登录表单不得预填密码。
|
|
||||||
- 不修改 `.env.dev`、`.env.prod`、前端环境文件、用户已有 APP 改动、后端日志和无关缓存。
|
|
||||||
- 不安装、升级或删除依赖;使用仓库已有 `node_modules`、Node 20 和 pnpm 配置。
|
|
||||||
- 所有业务写请求必须使用后端要求的 camelCase 字段和幂等键;网络失败后直接重试复用原键,改变业务输入后才生成新键。
|
|
||||||
- 页面入口只按当前用户权限显示;页面内按钮权限与后端 401/403 校验同时保留,前端隐藏不能替代后端权限。
|
|
||||||
- 每个提交只包含本任务明确列出的文件;暂存和提交使用显式路径,禁止 `git add -A`、`git clean`、重置或覆盖用户已有改动。
|
|
||||||
- 每个任务完成后使用中文提交说明,并用 `git commit --only` 保护工作区中既有暂存内容。
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 文件结构与责任边界
|
|
||||||
|
|
||||||
### 新建文件
|
|
||||||
|
|
||||||
- `shierfeng-fastapi-app/src/api/business/inbound.js`:首次入库列表、选项、扫码、详情、草稿增改删和确认请求。
|
|
||||||
- `shierfeng-fastapi-app/src/api/business/filling.js`:装填列表、菌种选项、扫码、详情和装填提交请求。
|
|
||||||
- `shierfeng-fastapi-app/src/api/business/shipment.js`:发货列表、仓库/现场选项、扫码、详情、草稿增改删和确认请求。
|
|
||||||
- `shierfeng-fastapi-app/src/api/business/usage.js`:使用列表、产线选项、扫码、详情和使用提交请求。
|
|
||||||
- `shierfeng-fastapi-app/src/api/business/return.js`:退回列表、仓库选项、扫码、申请、详情和确认请求。
|
|
||||||
- `shierfeng-fastapi-app/src/utils/palletScan.js`:扫码值规范化、短时重复判断和 Web Crypto UUID v4 幂等键生成;不保存业务状态。
|
|
||||||
- `shierfeng-fastapi-app/src/components/business/PalletScanInput.vue`:HID/手工输入、回车提交、空值校验、短时重复提示和输入焦点管理。
|
|
||||||
- `shierfeng-fastapi-app/src/pages/business/inbound/index.vue`:入库草稿编辑、扫码、删除和确认。
|
|
||||||
- `shierfeng-fastapi-app/src/pages/business/filling/index.vue`:单托盘装填。
|
|
||||||
- `shierfeng-fastapi-app/src/pages/business/shipment/index.vue`:发货草稿编辑、扫码、删除和确认。
|
|
||||||
- `shierfeng-fastapi-app/src/pages/business/usage/index.vue`:现场使用、产线选择和服务端结果展示。
|
|
||||||
- `shierfeng-fastapi-app/src/pages/business/return/index.vue`:退回申请和仓库确认两个独立操作区。
|
|
||||||
- `shierfeng-fastapi-app/tests/business-contract.test.mjs`:Node 20 静态 API/页面/字段/安全契约与扫码工具测试。
|
|
||||||
|
|
||||||
### 修改文件
|
|
||||||
|
|
||||||
- `shierfeng-fastapi-app/package.json`:增加不依赖新包的 `test:business` 脚本。
|
|
||||||
- `shierfeng-fastapi-app/src/pages.json`:注册五个业务页面路由。
|
|
||||||
- `shierfeng-fastapi-app/src/pages/login.vue`:移除旧默认密码预填值,保留现有认证流程。
|
|
||||||
- `shierfeng-fastapi-app/src/pages/work/index.vue`:增加按权限过滤的五类 PDA 业务入口。
|
|
||||||
|
|
||||||
### 明确不修改
|
|
||||||
|
|
||||||
- `shierfeng-fastapi-backend/module_business/**`:后端接口已存在,本计划只消费其当前契约。
|
|
||||||
- `shierfeng-fastapi-frontend/**`:Web 端作为接口和交互参考,不复制改动。
|
|
||||||
- `shierfeng-fastapi-app/src/utils/request.js`、传输加密、Pinia 用户会话和环境配置:除非测试证明共享层存在直接阻塞,否则保持现状。
|
|
||||||
|
|
||||||
## 已核实的后端接口与字段
|
|
||||||
|
|
||||||
| 模块 | 查询/选项/扫码 | 写请求 | 必须保持的写入字段 |
|
|
||||||
| --- | --- | --- | --- |
|
|
||||||
| 入库 | `GET /business/inbound/list`、`/warehouse-options`、`/scan/{qrToken}?warehouseId=`、`/{inboundId}` | `POST /business/inbound`、`PUT /business/inbound`、`DELETE /business/inbound/{ids}`、`PUT /business/inbound/{id}/confirm` | 草稿:`warehouseId,palletIds`;确认:`idempotencyKey` |
|
|
||||||
| 装填 | `GET /business/filling/list`、`/strain-options`、`/scan/{qrToken}`、`/{fillingId}` | `POST /business/filling` | `qrToken,warehouseId,strainId,batchNo,packageSpec,initialPackages,idempotencyKey` |
|
|
||||||
| 发货 | `GET /business/shipment/list`、`/warehouse-options`、`/site-options`、`/scan/{qrToken}?sourceWarehouseId=&targetSiteId=`、`/{shipmentId}` | `POST /business/shipment`、`PUT /business/shipment`、`DELETE /business/shipment/{ids}`、`PUT /business/shipment/{id}/confirm` | 草稿:`sourceWarehouseId,targetSiteId,palletIds`;确认:`idempotencyKey` |
|
|
||||||
| 使用 | `GET /business/usage/list`、`/line-options?siteId=`、`/scan/{qrToken}`、`/{usageId}` | `POST /business/usage` | `qrToken,lineId,usedPackages,idempotencyKey` |
|
|
||||||
| 退回 | `GET /business/return/list`、`/warehouse-options`、`/scan/{qrToken}?mode=&returnId=`、`/{returnId}` | `POST /business/return/request`、`PUT /business/return/{id}/confirm` | 申请:`sourceSiteId,targetWarehouseId,palletIds,idempotencyKey`;确认:`scannedPalletIds,idempotencyKey` |
|
|
||||||
|
|
||||||
后端扫码响应统一使用 `data.palletId/palletCode/flowState/warehouseId/siteId/currentLineId/strainId/strainCode/strainName/batchNo/packageSpec/capacityPackages/remainingPackages/allowedActions`;列表响应使用 `rows` 和 `total`;详情使用 `data`。装填和使用写请求没有单独确认接口,成功后以列表、扫码结果或使用响应为准。
|
|
||||||
|
|
||||||
## Task 1: 用测试锁定 API 封装、扫码工具和幂等键
|
|
||||||
|
|
||||||
**Files:**
|
|
||||||
|
|
||||||
- Create: `shierfeng-fastapi-app/tests/business-contract.test.mjs`
|
|
||||||
- Create: `shierfeng-fastapi-app/src/api/business/inbound.js`
|
|
||||||
- Create: `shierfeng-fastapi-app/src/api/business/filling.js`
|
|
||||||
- Create: `shierfeng-fastapi-app/src/api/business/shipment.js`
|
|
||||||
- Create: `shierfeng-fastapi-app/src/api/business/usage.js`
|
|
||||||
- Create: `shierfeng-fastapi-app/src/api/business/return.js`
|
|
||||||
- Create: `shierfeng-fastapi-app/src/utils/palletScan.js`
|
|
||||||
- Modify: `shierfeng-fastapi-app/package.json`
|
|
||||||
|
|
||||||
**Interfaces:**
|
|
||||||
|
|
||||||
- Produces API exports `listInbound`, `getInboundWarehouseOptions`, `scanInboundPallet`, `getInbound`, `addInbound`, `updateInbound`, `delInbound`, `confirmInbound`;其他四个模块使用已核实接口表中的同义导出名。
|
|
||||||
- Produces `normalizeScanValue(value)`, `isDuplicateScan(value,lastValue,scannedAt,lastScannedAt,duplicateWindowMs)` 和 `createIdempotencyKey(cryptoProvider)`。
|
|
||||||
- All API wrappers import `request` from `@/utils/request` and return its promise without改写响应结构。
|
|
||||||
|
|
||||||
各模块的完整导出名固定如下,页面不得自行拼接 URL:
|
|
||||||
|
|
||||||
- `inbound.js`:`listInbound(query)`、`getInboundWarehouseOptions()`、`scanInboundPallet(qrToken,query)`、`getInbound(inboundId)`、`addInbound(data)`、`updateInbound(data)`、`delInbound(inboundIds)`、`confirmInbound(inboundId,data)`。
|
|
||||||
- `filling.js`:`listFilling(query)`、`getFillingStrainOptions()`、`scanFillingPallet(qrToken)`、`getFilling(fillingId)`、`addFilling(data)`。
|
|
||||||
- `shipment.js`:`listShipment(query)`、`getShipmentWarehouseOptions()`、`getShipmentSiteOptions()`、`scanShipmentPallet(qrToken,query)`、`getShipment(shipmentId)`、`addShipment(data)`、`updateShipment(data)`、`delShipment(shipmentIds)`、`confirmShipment(shipmentId,data)`。
|
|
||||||
- `usage.js`:`listUsage(query)`、`getUsageLineOptions(siteId)`、`scanUsagePallet(qrToken)`、`getUsage(usageId)`、`addUsage(data)`。
|
|
||||||
- `return.js`:`listReturn(query)`、`getReturnWarehouseOptions()`、`scanReturnPallet(qrToken,query)`、`requestReturn(data)`、`getReturn(returnId)`、`confirmReturn(returnId,data)`。
|
|
||||||
|
|
||||||
- [ ] **Step 1: 先写 API 与工具的失败测试**
|
|
||||||
|
|
||||||
在测试文件中用 `readFile` 读取五个 API 文件,用正则逐个断言 URL、HTTP 方法和关键参数名称;同时为工具写可执行单元测试:
|
|
||||||
|
|
||||||
```js
|
|
||||||
test('扫码值只去除首尾空白并拒绝空值', async () => {
|
|
||||||
const { normalizeScanValue } = await import('../src/utils/palletScan.js')
|
|
||||||
assert.equal(normalizeScanValue(' QR-001\n'), 'QR-001')
|
|
||||||
assert.throws(() => normalizeScanValue(' \n\t '), /二维码不能为空/)
|
|
||||||
})
|
|
||||||
|
|
||||||
test('幂等键使用 randomUUID 或安全随机字节,不使用时间和伪随机数', async () => {
|
|
||||||
const { createIdempotencyKey } = await import('../src/utils/palletScan.js')
|
|
||||||
const expected = '12345678-1234-4123-8123-123456789abc'
|
|
||||||
assert.equal(createIdempotencyKey({ randomUUID: () => expected }), expected)
|
|
||||||
assert.equal(
|
|
||||||
createIdempotencyKey({
|
|
||||||
getRandomValues(bytes) {
|
|
||||||
bytes.fill(0)
|
|
||||||
return bytes
|
|
||||||
}
|
|
||||||
}),
|
|
||||||
'00000000-0000-4000-8000-000000000000'
|
|
||||||
)
|
|
||||||
})
|
|
||||||
|
|
||||||
test('同一值只在重复时间窗口内被识别', async () => {
|
|
||||||
const { isDuplicateScan } = await import('../src/utils/palletScan.js')
|
|
||||||
assert.equal(isDuplicateScan('QR-001', 'QR-001', 1200, 1000, 500), true)
|
|
||||||
assert.equal(isDuplicateScan('QR-001', 'QR-002', 1200, 1000, 500), false)
|
|
||||||
assert.equal(isDuplicateScan('QR-001', 'QR-001', 1801, 1000, 500), false)
|
|
||||||
})
|
|
||||||
```
|
|
||||||
|
|
||||||
API 契约测试至少覆盖以下请求:入库和发货的列表、选项、扫码、详情、草稿增改删、确认;装填和使用的列表、选项、扫码、详情、提交;退回的列表、选项、扫码、申请、详情、确认。测试还要断言确认/写请求的函数名和 `data`/`params` 位置,防止把 query 字段误放入 body。
|
|
||||||
|
|
||||||
- [ ] **Step 2: 运行失败测试确认缺口**
|
|
||||||
|
|
||||||
工作目录:`shierfeng-fastapi-app`
|
|
||||||
|
|
||||||
```bash
|
|
||||||
node --test tests/business-contract.test.mjs
|
|
||||||
```
|
|
||||||
|
|
||||||
预期:因五个 API 模块、扫码工具和测试脚本尚未存在而失败;此时不修改后端或依赖。
|
|
||||||
|
|
||||||
- [ ] **Step 3: 实现最小 API 封装和测试脚本**
|
|
||||||
|
|
||||||
`package.json` 只增加以下脚本,不增加依赖:
|
|
||||||
|
|
||||||
```json
|
|
||||||
"test:business": "node --test tests/business-contract.test.mjs"
|
|
||||||
```
|
|
||||||
|
|
||||||
每个 API 文件只做路径和参数映射。例如入库模块必须保持如下接口形状:
|
|
||||||
|
|
||||||
```js
|
|
||||||
import request from '@/utils/request'
|
|
||||||
|
|
||||||
export function listInbound(query) {
|
|
||||||
return request({ url: '/business/inbound/list', method: 'get', params: query })
|
|
||||||
}
|
|
||||||
|
|
||||||
export function scanInboundPallet(qrToken, query) {
|
|
||||||
return request({ url: '/business/inbound/scan/' + qrToken, method: 'get', params: query })
|
|
||||||
}
|
|
||||||
|
|
||||||
export function addInbound(data) {
|
|
||||||
return request({ url: '/business/inbound', method: 'post', data })
|
|
||||||
}
|
|
||||||
|
|
||||||
export function confirmInbound(inboundId, data) {
|
|
||||||
return request({
|
|
||||||
url: '/business/inbound/' + inboundId + '/confirm',
|
|
||||||
method: 'put',
|
|
||||||
data,
|
|
||||||
headers: { repeatSubmit: false }
|
|
||||||
})
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
其他函数按接口表逐一实现,不增加前端字段别名。`createIdempotencyKey` 优先使用 `crypto.randomUUID()`,否则用 `crypto.getRandomValues(new Uint8Array(16))` 按 UUID v4 设置版本和变体位;缺少安全随机源时抛出明确错误,不使用 `Date.now()`、`Math.random()` 或账号信息。
|
|
||||||
|
|
||||||
- [ ] **Step 4: 运行测试确认 API 与工具契约通过**
|
|
||||||
|
|
||||||
```bash
|
|
||||||
pnpm test:business
|
|
||||||
```
|
|
||||||
|
|
||||||
预期:本任务新增的 API 路径、HTTP 方法、参数位置、扫码规范化、重复窗口和 UUID 测试通过;页面相关测试在后续任务加入。
|
|
||||||
|
|
||||||
- [ ] **Step 5: 只提交本任务文件**
|
|
||||||
|
|
||||||
```bash
|
|
||||||
git add -- \
|
|
||||||
shierfeng-fastapi-app/package.json \
|
|
||||||
shierfeng-fastapi-app/tests/business-contract.test.mjs \
|
|
||||||
shierfeng-fastapi-app/src/api/business/inbound.js \
|
|
||||||
shierfeng-fastapi-app/src/api/business/filling.js \
|
|
||||||
shierfeng-fastapi-app/src/api/business/shipment.js \
|
|
||||||
shierfeng-fastapi-app/src/api/business/usage.js \
|
|
||||||
shierfeng-fastapi-app/src/api/business/return.js \
|
|
||||||
shierfeng-fastapi-app/src/utils/palletScan.js
|
|
||||||
git commit --only -m '新增:PDA 业务 API 与扫码幂等工具' -- \
|
|
||||||
shierfeng-fastapi-app/package.json \
|
|
||||||
shierfeng-fastapi-app/tests/business-contract.test.mjs \
|
|
||||||
shierfeng-fastapi-app/src/api/business/inbound.js \
|
|
||||||
shierfeng-fastapi-app/src/api/business/filling.js \
|
|
||||||
shierfeng-fastapi-app/src/api/business/shipment.js \
|
|
||||||
shierfeng-fastapi-app/src/api/business/usage.js \
|
|
||||||
shierfeng-fastapi-app/src/api/business/return.js \
|
|
||||||
shierfeng-fastapi-app/src/utils/palletScan.js
|
|
||||||
```
|
|
||||||
|
|
||||||
## Task 2: 先测试再实现 HID 扫码输入组件
|
|
||||||
|
|
||||||
**Files:**
|
|
||||||
|
|
||||||
- Create: `shierfeng-fastapi-app/src/components/business/PalletScanInput.vue`
|
|
||||||
- Modify: `shierfeng-fastapi-app/tests/business-contract.test.mjs`
|
|
||||||
|
|
||||||
**Interfaces:**
|
|
||||||
|
|
||||||
- Consumes `normalizeScanValue` and `isDuplicateScan` from `@/utils/palletScan`.
|
|
||||||
- Props: `disabled:Boolean=false`、`loading:Boolean=false`、`duplicateWindowMs:Number=500`。
|
|
||||||
- Emits: `scan(normalizedValue)`、`invalid(message)`、`duplicate(normalizedValue)`。
|
|
||||||
- Exposes no business state; parent controls request lock through `loading` and owns accepted pallet rows.
|
|
||||||
|
|
||||||
- [ ] **Step 1: 写组件静态契约测试并确认 RED**
|
|
||||||
|
|
||||||
在 `business-contract.test.mjs` 读取组件源码,断言存在 `@confirm="handleSubmit"`、`normalizeScanValue`、`isDuplicateScan`、三个 emit 名称、`:disabled="disabled || loading"` 或等价锁定逻辑,并断言没有 `uni.scanCode`、摄像头 API 或状态机字段判断。执行 `pnpm test:business`,预期组件测试失败。
|
|
||||||
|
|
||||||
- [ ] **Step 2: 实现组件输入状态机**
|
|
||||||
|
|
||||||
组件使用 uni-app 原生 `<input>`,同时绑定 `@confirm`(HID 回车和手工确认)与一个可点击的“提交扫描”按钮;输入框在 `disabled` 或 `loading` 时只读/禁用。提交逻辑必须保持以下顺序:
|
|
||||||
|
|
||||||
```js
|
|
||||||
function handleSubmit() {
|
|
||||||
if (props.disabled || props.loading) return
|
|
||||||
let value
|
|
||||||
try {
|
|
||||||
value = normalizeScanValue(scanValue.value)
|
|
||||||
} catch (error) {
|
|
||||||
errorMessage.value = error.message
|
|
||||||
emit('invalid', error.message)
|
|
||||||
focusInput(true)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
const scannedAt = Date.now()
|
|
||||||
if (isDuplicateScan(value, lastScanValue, scannedAt, lastScanAt, props.duplicateWindowMs)) {
|
|
||||||
scanValue.value = ''
|
|
||||||
emit('duplicate', value)
|
|
||||||
focusInput()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
lastScanValue = value
|
|
||||||
lastScanAt = scannedAt
|
|
||||||
scanValue.value = ''
|
|
||||||
emit('scan', value)
|
|
||||||
focusInput()
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
`Date.now()`只用于比较短时重复输入,不得用于生成业务幂等键。组件自动聚焦、扫描完成后清空输入并重新聚焦;页面切换、请求进行中和权限不足时由父页面传入 `disabled/loading`。
|
|
||||||
|
|
||||||
- [ ] **Step 3: 运行组件契约和工具测试确认 GREEN**
|
|
||||||
|
|
||||||
```bash
|
|
||||||
pnpm test:business
|
|
||||||
```
|
|
||||||
|
|
||||||
预期:组件的 HID 回车、手工提交、空值、重复值和请求锁静态契约通过。
|
|
||||||
|
|
||||||
- [ ] **Step 4: 提交组件**
|
|
||||||
|
|
||||||
```bash
|
|
||||||
git add -- shierfeng-fastapi-app/src/components/business/PalletScanInput.vue shierfeng-fastapi-app/tests/business-contract.test.mjs
|
|
||||||
git commit --only -m '新增:PDA HID 扫码输入组件' -- \
|
|
||||||
shierfeng-fastapi-app/src/components/business/PalletScanInput.vue \
|
|
||||||
shierfeng-fastapi-app/tests/business-contract.test.mjs
|
|
||||||
```
|
|
||||||
|
|
||||||
## Task 3: 注册路由、移除密码预填并增加权限入口
|
|
||||||
|
|
||||||
**Files:**
|
|
||||||
|
|
||||||
- Modify: `shierfeng-fastapi-app/src/pages.json`
|
|
||||||
- Modify: `shierfeng-fastapi-app/src/pages/login.vue`
|
|
||||||
- Modify: `shierfeng-fastapi-app/src/pages/work/index.vue`
|
|
||||||
- Modify: `shierfeng-fastapi-app/tests/business-contract.test.mjs`
|
|
||||||
|
|
||||||
**Interfaces:**
|
|
||||||
|
|
||||||
- Produces routes `pages/business/inbound/index`、`pages/business/filling/index`、`pages/business/shipment/index`、`pages/business/usage/index`、`pages/business/return/index`。
|
|
||||||
- Uses existing `$auth.hasPermiOr`/`$auth.hasPermiAnd` and `$tab.navigateTo`; does not change Pinia or permission storage.
|
|
||||||
|
|
||||||
- [ ] **Step 1: 写路由、权限和凭据安全测试并确认 RED**
|
|
||||||
|
|
||||||
测试必须断言五个页面路径和标题存在,工作台包含五类业务权限字符串,且 `src/pages/login.vue` 不再包含旧默认密码或其他密码字面量。测试也要断言入口跳转路径与页面路径一致。
|
|
||||||
|
|
||||||
- [ ] **Step 2: 注册五个页面并实现入口过滤**
|
|
||||||
|
|
||||||
在 `pages.json` 按工作台之后加入五个页面,使用中文标题“仓库入库”“托盘装填”“发货出库”“现场使用”“退回仓库”。工作台增加“现场业务”区块,入口权限使用以下 OR 集合:
|
|
||||||
|
|
||||||
```js
|
|
||||||
const businessEntries = [
|
|
||||||
{ path: '/pages/business/inbound/index', permissions: ['business:inbound:list', 'business:inbound:query', 'business:inbound:add', 'business:inbound:edit', 'business:inbound:remove', 'business:inbound:confirm'] },
|
|
||||||
{ path: '/pages/business/filling/index', permissions: ['business:filling:list', 'business:filling:query', 'business:filling:add'] },
|
|
||||||
{ path: '/pages/business/shipment/index', permissions: ['business:shipment:list', 'business:shipment:query', 'business:shipment:add', 'business:shipment:edit', 'business:shipment:remove', 'business:shipment:confirm'] },
|
|
||||||
{ path: '/pages/business/usage/index', permissions: ['business:usage:list', 'business:usage:query', 'business:usage:add'] },
|
|
||||||
{ path: '/pages/business/return/index', permissions: ['business:return:list', 'business:return:query', 'business:return:request', 'business:return:confirm'] }
|
|
||||||
]
|
|
||||||
```
|
|
||||||
|
|
||||||
模板只渲染 `proxy.$auth.hasPermiOr(entry.permissions)` 为真的入口;点击前再次检查权限并调用 `$tab.navigateTo(entry.path)`。页面没有任何授权时不显示业务区块。保留现有非本任务系统入口,不扩展其他模块。
|
|
||||||
|
|
||||||
- [ ] **Step 3: 清除登录页密码默认值**
|
|
||||||
|
|
||||||
将 `loginForm` 的 `username` 和 `password` 初始值改为空字符串,验证码和登录 API 流程保持不变;开发联调账号只在人工输入时使用,不写入源码、测试或日志。
|
|
||||||
|
|
||||||
- [ ] **Step 4: 运行测试确认 GREEN**
|
|
||||||
|
|
||||||
```bash
|
|
||||||
pnpm test:business
|
|
||||||
```
|
|
||||||
|
|
||||||
预期:五个路由、权限入口、登录安全静态契约通过。
|
|
||||||
|
|
||||||
- [ ] **Step 5: 提交页面壳层改动**
|
|
||||||
|
|
||||||
```bash
|
|
||||||
git add -- \
|
|
||||||
shierfeng-fastapi-app/src/pages.json \
|
|
||||||
shierfeng-fastapi-app/src/pages/login.vue \
|
|
||||||
shierfeng-fastapi-app/src/pages/work/index.vue \
|
|
||||||
shierfeng-fastapi-app/tests/business-contract.test.mjs
|
|
||||||
git commit --only -m '新增:PDA 业务页面路由与权限入口' -- \
|
|
||||||
shierfeng-fastapi-app/src/pages.json \
|
|
||||||
shierfeng-fastapi-app/src/pages/login.vue \
|
|
||||||
shierfeng-fastapi-app/src/pages/work/index.vue \
|
|
||||||
shierfeng-fastapi-app/tests/business-contract.test.mjs
|
|
||||||
```
|
|
||||||
|
|
||||||
## Task 4: 实现首次入库 PDA 页面
|
|
||||||
|
|
||||||
**Files:**
|
|
||||||
|
|
||||||
- Create: `shierfeng-fastapi-app/src/pages/business/inbound/index.vue`
|
|
||||||
- Modify: `shierfeng-fastapi-app/tests/business-contract.test.mjs`
|
|
||||||
|
|
||||||
**Interfaces:**
|
|
||||||
|
|
||||||
- Consumes all exports from `src/api/business/inbound.js`, `PalletScanInput`, `createIdempotencyKey` and `$auth`.
|
|
||||||
- Produces page methods `handleInboundScan`, `submitInboundDraft`, `saveInboundUpdate`, `confirmInboundDraft`, `removeScannedPallet`, `resetInboundOperation`。
|
|
||||||
- Page state stores only scanned display rows, draft form values, request/loading/error state and confirm idempotency key; it never stores a client-calculated inventory state。
|
|
||||||
|
|
||||||
- [ ] **Step 1: 写入库页面契约测试并确认 RED**
|
|
||||||
|
|
||||||
测试读取页面源码并断言:
|
|
||||||
|
|
||||||
1. 使用 `PalletScanInput`,扫描调用 `scanInboundPallet(qrToken, { warehouseId })`。
|
|
||||||
2. 只接受 `flowState === 'UNSTOCKED'`,按 `palletId` 去重。
|
|
||||||
3. 草稿 payload 只含 `{ warehouseId, palletIds }`,编辑 payload 只含 `{ inboundId, warehouseId, palletIds }`。
|
|
||||||
4. 确认调用 `confirmInbound(inboundId, { idempotencyKey })`,失败分支不清空当前键。
|
|
||||||
5. 编辑/删除/确认按钮分别包含 `business:inbound:edit/remove/confirm`,入口操作需要同时具备 `query` 与对应写权限。
|
|
||||||
|
|
||||||
- [ ] **Step 2: 实现仓库选项、草稿扫码和编辑状态**
|
|
||||||
|
|
||||||
页面加载授权仓库选项和第一页列表;新增时选择仓库后允许连续扫描。每次扫码携带当前仓库 ID,接受服务端返回的 `palletId/palletCode/flowState`,重复托盘只提示不追加。切换仓库清空当前扫描集合并使旧扫码响应失效。
|
|
||||||
|
|
||||||
编辑时先调用 `getInbound(inboundId)`,只有详情仍为 `DRAFT` 才填充仓库和明细;详情未返回前禁止扫码、保存和删除。列表刷新/页面 `onShow` 以服务端 `rows` 为准,不从本地草稿推导状态。
|
|
||||||
|
|
||||||
- [ ] **Step 3: 实现草稿写入和确认重试**
|
|
||||||
|
|
||||||
```js
|
|
||||||
function submitInboundDraft() {
|
|
||||||
return addInbound({
|
|
||||||
warehouseId: form.value.warehouseId,
|
|
||||||
palletIds: scannedPallets.value.map((item) => item.palletId)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
function confirmInboundDraft(row) {
|
|
||||||
const idempotencyKey = ensureConfirmIdempotencyKey(row.inboundId)
|
|
||||||
confirmLoading.value = true
|
|
||||||
confirmInbound(row.inboundId, { idempotencyKey })
|
|
||||||
.then(() => {
|
|
||||||
clearConfirmIdempotency()
|
|
||||||
loadInboundList()
|
|
||||||
})
|
|
||||||
.catch(() => {
|
|
||||||
confirmError.value = '入库确认失败;再次确认将复用本次幂等键'
|
|
||||||
})
|
|
||||||
.finally(() => {
|
|
||||||
confirmLoading.value = false
|
|
||||||
})
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
后端新增草稿响应不保证返回单据 ID,因此保存后只关闭编辑区并重新读取列表,由用户从服务端返回的 `DRAFT` 行选择确认,不按时间或本地数组猜测刚创建的单据。确认成功后清除键;网络超时、401 以外的可重试失败保留键,401 交由现有 `request` 会话处理。
|
|
||||||
|
|
||||||
- [ ] **Step 4: 运行入库契约和构建前静态检查**
|
|
||||||
|
|
||||||
```bash
|
|
||||||
pnpm test:business
|
|
||||||
```
|
|
||||||
|
|
||||||
预期:入库页面的字段、状态、权限、幂等键和服务端刷新契约通过。
|
|
||||||
|
|
||||||
- [ ] **Step 5: 提交入库页面**
|
|
||||||
|
|
||||||
```bash
|
|
||||||
git add -- shierfeng-fastapi-app/src/pages/business/inbound/index.vue shierfeng-fastapi-app/tests/business-contract.test.mjs
|
|
||||||
git commit --only -m '新增:PDA 首次入库操作页' -- \
|
|
||||||
shierfeng-fastapi-app/src/pages/business/inbound/index.vue \
|
|
||||||
shierfeng-fastapi-app/tests/business-contract.test.mjs
|
|
||||||
```
|
|
||||||
|
|
||||||
## Task 5: 实现整托发货 PDA 页面
|
|
||||||
|
|
||||||
**Files:**
|
|
||||||
|
|
||||||
- Create: `shierfeng-fastapi-app/src/pages/business/shipment/index.vue`
|
|
||||||
- Modify: `shierfeng-fastapi-app/tests/business-contract.test.mjs`
|
|
||||||
|
|
||||||
**Interfaces:**
|
|
||||||
|
|
||||||
- Consumes `src/api/business/shipment.js`、`PalletScanInput` 和 `createIdempotencyKey`。
|
|
||||||
- Produces `handleShipmentScan`, `submitShipmentDraft`, `saveShipmentUpdate`, `confirmShipmentDraft`, `removeScannedPallet`。
|
|
||||||
- Scanned rows expose `palletCode`, `strainName/strainCode`, `batchNo`, `remainingPackages` as read-only display values。
|
|
||||||
|
|
||||||
- [ ] **Step 1: 写发货页面失败契约**
|
|
||||||
|
|
||||||
断言页面加载仓库和现场选项,扫描调用 `scanShipmentPallet(qrToken, { sourceWarehouseId, targetSiteId })`,只接受 `flowState === 'FILLED_IN_WAREHOUSE' && remainingPackages > 0`,草稿/确认字段与接口表一致,并保留确认失败时的幂等键。
|
|
||||||
|
|
||||||
- [ ] **Step 2: 实现来源仓库、目标现场和集合扫码**
|
|
||||||
|
|
||||||
来源仓库或目标现场改变时清空托盘集合并使旧请求失效。扫描期间锁定输入和提交按钮;同一 `palletId` 不重复追加。列表、详情和选项失败显示页面内可重试错误,不吞掉后端业务消息。
|
|
||||||
|
|
||||||
- [ ] **Step 3: 实现草稿和确认**
|
|
||||||
|
|
||||||
```js
|
|
||||||
function submitShipmentDraft() {
|
|
||||||
return addShipment({
|
|
||||||
sourceWarehouseId: form.value.sourceWarehouseId,
|
|
||||||
targetSiteId: form.value.targetSiteId,
|
|
||||||
palletIds: scannedPallets.value.map((item) => item.palletId)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
function confirmShipmentDraft(row) {
|
|
||||||
const idempotencyKey = ensureConfirmIdempotencyKey(row.shipmentId)
|
|
||||||
return confirmShipment(row.shipmentId, { idempotencyKey })
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
保存后重新读取列表;确认前要求 `DRAFT`,成功后重新加载列表和页面状态。错误重试只复用同一确认键,改变单据或托盘集合时清除并重新生成键;不在前端扣减 `remainingPackages`。
|
|
||||||
|
|
||||||
- [ ] **Step 4: 运行测试并提交**
|
|
||||||
|
|
||||||
```bash
|
|
||||||
pnpm test:business
|
|
||||||
git add -- shierfeng-fastapi-app/src/pages/business/shipment/index.vue shierfeng-fastapi-app/tests/business-contract.test.mjs
|
|
||||||
git commit --only -m '新增:PDA 整托发货操作页' -- \
|
|
||||||
shierfeng-fastapi-app/src/pages/business/shipment/index.vue \
|
|
||||||
shierfeng-fastapi-app/tests/business-contract.test.mjs
|
|
||||||
```
|
|
||||||
|
|
||||||
预期:测试通过后才执行提交;提交只包含发货页面和契约测试增量。
|
|
||||||
|
|
||||||
## Task 6: 实现单托盘装填 PDA 页面
|
|
||||||
|
|
||||||
**Files:**
|
|
||||||
|
|
||||||
- Create: `shierfeng-fastapi-app/src/pages/business/filling/index.vue`
|
|
||||||
- Modify: `shierfeng-fastapi-app/tests/business-contract.test.mjs`
|
|
||||||
|
|
||||||
**Interfaces:**
|
|
||||||
|
|
||||||
- Consumes `listFilling`、`getFillingStrainOptions`、`scanFillingPallet`、`addFilling` 和 `PalletScanInput`。
|
|
||||||
- Produces form fields `qrToken`, `warehouseId`, `strainId`, `batchNo`, `packageSpec`, `initialPackages` and one operation-scoped `idempotencyKey`。
|
|
||||||
|
|
||||||
- [ ] **Step 1: 写装填页面失败契约**
|
|
||||||
|
|
||||||
断言页面只接受 `flowState === 'EMPTY_IN_WAREHOUSE'`,扫码成功后展示仓库和容量,提交 payload 包含且只包含后端 `FillingCreateModel` 字段,包数校验为严格正整数,成功/失败状态不伪造库存。
|
|
||||||
|
|
||||||
- [ ] **Step 2: 实现扫码和表单**
|
|
||||||
|
|
||||||
扫码后保存服务端返回的 `qrToken`、`warehouseId`、`palletCode`、`capacityPackages`,加载菌种选项。菌种、批次、规格和包数在请求期间锁定;包数的前端校验只做正整数和非空检查,容量和托盘状态由后端最终判定。
|
|
||||||
|
|
||||||
- [ ] **Step 3: 实现幂等提交和成功刷新**
|
|
||||||
|
|
||||||
```js
|
|
||||||
function submitFilling() {
|
|
||||||
const idempotencyKey = ensureFillingIdempotencyKey()
|
|
||||||
return addFilling({
|
|
||||||
qrToken: form.value.qrToken,
|
|
||||||
warehouseId: form.value.warehouseId,
|
|
||||||
strainId: form.value.strainId,
|
|
||||||
batchNo: form.value.batchNo.trim(),
|
|
||||||
packageSpec: form.value.packageSpec.trim(),
|
|
||||||
initialPackages: form.value.initialPackages,
|
|
||||||
idempotencyKey
|
|
||||||
})
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
提交成功后清空表单并刷新装填列表,再以扫码查询或列表结果显示服务端状态;刷新失败不能覆盖已经成功的写入提示。提交失败保留键;修改托盘、菌种、批次、规格或包数后清除键,下一次输入生成新键。
|
|
||||||
|
|
||||||
- [ ] **Step 4: 运行测试并提交**
|
|
||||||
|
|
||||||
```bash
|
|
||||||
pnpm test:business
|
|
||||||
git add -- shierfeng-fastapi-app/src/pages/business/filling/index.vue shierfeng-fastapi-app/tests/business-contract.test.mjs
|
|
||||||
git commit --only -m '新增:PDA 托盘装填操作页' -- \
|
|
||||||
shierfeng-fastapi-app/src/pages/business/filling/index.vue \
|
|
||||||
shierfeng-fastapi-app/tests/business-contract.test.mjs
|
|
||||||
```
|
|
||||||
|
|
||||||
## Task 7: 实现客户现场使用 PDA 页面
|
|
||||||
|
|
||||||
**Files:**
|
|
||||||
|
|
||||||
- Create: `shierfeng-fastapi-app/src/pages/business/usage/index.vue`
|
|
||||||
- Modify: `shierfeng-fastapi-app/tests/business-contract.test.mjs`
|
|
||||||
|
|
||||||
**Interfaces:**
|
|
||||||
|
|
||||||
- Consumes `listUsage`、`getUsageLineOptions(siteId)`、`scanUsagePallet`、`addUsage` 和 `PalletScanInput`。
|
|
||||||
- Produces `handleUsageScan`, `loadLineOptions`, `submitUsage`, `resetUsageOperation`。
|
|
||||||
- Uses `UsageSuccessResponseModel` fields `usageId`, `remainingPackages`, `flowState` for result display only。
|
|
||||||
|
|
||||||
- [ ] **Step 1: 写现场使用失败契约**
|
|
||||||
|
|
||||||
断言页面只接受 `AT_SITE_UNUSED` 或 `AT_SITE_PARTIAL` 且 `remainingPackages > 0`;没有 `currentLineId` 时按扫码响应的 `siteId` 获取产线,有绑定时锁定该产线;提交使用 `qrToken,lineId,usedPackages,idempotencyKey`,不在本地推算新状态。
|
|
||||||
|
|
||||||
- [ ] **Step 2: 实现扫码、产线锁定和正整数校验**
|
|
||||||
|
|
||||||
每次新扫码先使旧产线请求失效、清空旧结果和幂等键。扫码成功后保存托盘、菌种、批次、余量和现场信息;首次使用显示可选产线,已有 `currentLineId` 时只能使用该产线。使用包数必须是严格正整数,超过当前展示余量时给出提示,但即使通过前端检查也仍由服务端校验。
|
|
||||||
|
|
||||||
- [ ] **Step 3: 实现使用提交和结果刷新**
|
|
||||||
|
|
||||||
```js
|
|
||||||
function submitUsage() {
|
|
||||||
const idempotencyKey = ensureUsageIdempotencyKey()
|
|
||||||
return addUsage({
|
|
||||||
qrToken: form.value.qrToken,
|
|
||||||
lineId: form.value.lineId,
|
|
||||||
usedPackages: form.value.usedPackages,
|
|
||||||
idempotencyKey
|
|
||||||
}).then((response) => {
|
|
||||||
usageResult.value = response.data
|
|
||||||
clearUsageIdempotencyKey()
|
|
||||||
return loadUsageList()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
网络失败时保留键并显示“再次提交将复用本次幂等键”;成功只采用 `response.data.remainingPackages` 和 `response.data.flowState`,然后清理表单或允许重新扫码。列表和扫码响应晚于新会话时必须被请求代数丢弃。
|
|
||||||
|
|
||||||
- [ ] **Step 4: 运行测试并提交**
|
|
||||||
|
|
||||||
```bash
|
|
||||||
pnpm test:business
|
|
||||||
git add -- shierfeng-fastapi-app/src/pages/business/usage/index.vue shierfeng-fastapi-app/tests/business-contract.test.mjs
|
|
||||||
git commit --only -m '新增:PDA 客户现场使用操作页' -- \
|
|
||||||
shierfeng-fastapi-app/src/pages/business/usage/index.vue \
|
|
||||||
shierfeng-fastapi-app/tests/business-contract.test.mjs
|
|
||||||
```
|
|
||||||
|
|
||||||
## Task 8: 实现托盘退回申请与仓库确认
|
|
||||||
|
|
||||||
**Files:**
|
|
||||||
|
|
||||||
- Create: `shierfeng-fastapi-app/src/pages/business/return/index.vue`
|
|
||||||
- Modify: `shierfeng-fastapi-app/tests/business-contract.test.mjs`
|
|
||||||
|
|
||||||
**Interfaces:**
|
|
||||||
|
|
||||||
- Consumes all exports from `src/api/business/return.js` and two independent `PalletScanInput` instances。
|
|
||||||
- Request side state: `sourceSiteId`, `targetWarehouseId`, `requestScannedPallets`, `requestIdempotencyKey`。
|
|
||||||
- Confirm side state: `returnId`, `expectedPalletIds`, `confirmScannedPallets`, `confirmIdempotencyKey`。
|
|
||||||
- Produces `handleRequestScan`, `submitReturnRequest`, `loadReturnDetail`, `handleConfirmScan`, `submitReturnConfirm`, `sameIdSet`。
|
|
||||||
|
|
||||||
- [ ] **Step 1: 写退回两阶段失败契约**
|
|
||||||
|
|
||||||
断言测试覆盖:
|
|
||||||
|
|
||||||
1. 申请扫码使用 `{ mode: 'request' }`,首个托盘确定 `sourceSiteId`,后续托盘必须属于同一现场。
|
|
||||||
2. 申请 payload 为 `sourceSiteId,targetWarehouseId,palletIds,idempotencyKey`,申请键和确认键互不复用。
|
|
||||||
3. 确认先读取详情,状态必须为 `REQUESTED`,扫描使用 `{ mode: 'confirm', returnId }`,扫码集合必须与详情托盘 ID 集合完全相同。
|
|
||||||
4. 确认写请求前再次 `getReturn(returnId)`,比较最新状态和 ID 集合后才调用 `confirmReturn`。
|
|
||||||
5. 请求或确认扫码/提交的旧响应不能覆盖新选择;失败不清除对应幂等键。
|
|
||||||
|
|
||||||
- [ ] **Step 2: 实现申请区**
|
|
||||||
|
|
||||||
加载可访问目标仓库和退回列表。申请扫码成功后保存 `palletId,palletCode,siteId,remainingPackages`,同一托盘不重复,目标仓库或会话变化时清空集合和申请键。`requestReturn` 成功后清除申请键、清空申请区并刷新列表;不根据响应消息猜测新 `returnId`,确认入口从服务端返回的 `REQUESTED` 列表选择单据。
|
|
||||||
|
|
||||||
- [ ] **Step 3: 实现确认区的详情快照与整集合扫码**
|
|
||||||
|
|
||||||
选择退回单后调用 `getReturn`,保存详情中的 `items[].palletId` 作为预期集合。确认扫码必须命中预期集合且不能重复;切换退回单使确认扫码代数、详情代数和确认键同时失效。实现集合比较时使用去重后的 `Set`,长度和成员都必须一致:
|
|
||||||
|
|
||||||
```js
|
|
||||||
function sameIdSet(left, right) {
|
|
||||||
if (left.length !== right.length) return false
|
|
||||||
const leftSet = new Set(left)
|
|
||||||
const rightSet = new Set(right)
|
|
||||||
return leftSet.size === left.length &&
|
|
||||||
rightSet.size === right.length &&
|
|
||||||
right.every((id) => leftSet.has(id))
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
- [ ] **Step 4: 实现确认前复核和幂等提交**
|
|
||||||
|
|
||||||
```js
|
|
||||||
async function submitReturnConfirm() {
|
|
||||||
const returnId = confirmForm.value.returnId
|
|
||||||
const scannedPalletIds = confirmScannedPallets.value.map((item) => item.palletId)
|
|
||||||
if (!returnId || !sameIdSet(expectedPalletIds.value, scannedPalletIds)) {
|
|
||||||
confirmError.value = '必须逐个扫描并完整匹配退回单全部托盘'
|
|
||||||
return
|
|
||||||
}
|
|
||||||
const latest = (await getReturn(returnId)).data
|
|
||||||
if (latest.status !== 'REQUESTED' ||
|
|
||||||
!sameIdSet(latest.items.map((item) => item.palletId), scannedPalletIds)) {
|
|
||||||
confirmError.value = '退回单状态或托盘明细已变化,请重新选择并扫码'
|
|
||||||
return
|
|
||||||
}
|
|
||||||
const idempotencyKey = ensureConfirmIdempotencyKey(returnId)
|
|
||||||
await confirmReturn(returnId, { scannedPalletIds, idempotencyKey })
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
确认成功后清除确认键、刷新退回列表和详情;网络失败保留键。申请确认两个阶段的输入锁、错误状态和重试键必须分开,不能用一个全局 `loading` 或一个幂等键混用。
|
|
||||||
|
|
||||||
- [ ] **Step 5: 运行测试并提交**
|
|
||||||
|
|
||||||
```bash
|
|
||||||
pnpm test:business
|
|
||||||
git add -- shierfeng-fastapi-app/src/pages/business/return/index.vue shierfeng-fastapi-app/tests/business-contract.test.mjs
|
|
||||||
git commit --only -m '新增:PDA 托盘退回两阶段操作页' -- \
|
|
||||||
shierfeng-fastapi-app/src/pages/business/return/index.vue \
|
|
||||||
shierfeng-fastapi-app/tests/business-contract.test.mjs
|
|
||||||
```
|
|
||||||
|
|
||||||
## Task 9: 完成全量契约验证、H5 构建和交付检查
|
|
||||||
|
|
||||||
**Files:**
|
|
||||||
|
|
||||||
- Modify: `shierfeng-fastapi-app/tests/business-contract.test.mjs`(仅在发现测试覆盖缺口时补充)
|
|
||||||
- Preserve: 所有后端、Web、环境、日志、缓存和用户已有 APP 文件
|
|
||||||
|
|
||||||
**Interfaces:**
|
|
||||||
|
|
||||||
- Consumes all five PDA pages, five API modules, shared scanner and existing backend contract。
|
|
||||||
- Produces a verified H5/development build;does not produce an APK。
|
|
||||||
|
|
||||||
- [ ] **Step 1: 完成静态契约覆盖清单**
|
|
||||||
|
|
||||||
测试必须逐项覆盖:
|
|
||||||
|
|
||||||
- 五个 API 文件的路径、方法、参数位置和导出函数。
|
|
||||||
- 五个页面的路由存在、页面调用对应 API、camelCase payload 字段正确。
|
|
||||||
- 五类状态条件:`UNSTOCKED`、`EMPTY_IN_WAREHOUSE`、`FILLED_IN_WAREHOUSE`、`AT_SITE_UNUSED/AT_SITE_PARTIAL`、退回 `REQUESTED`。
|
|
||||||
- HID 回车、空值、重复扫码、扫描请求锁和手工输入。
|
|
||||||
- 入库/发货确认、装填、使用、退回申请/确认的幂等键生成、保留和成功清理时机。
|
|
||||||
- 页面权限标识和登录页无密码预填。
|
|
||||||
- 不存在摄像头扫码调用、APK 构建脚本调用、管理员密码或 Token 字面量。
|
|
||||||
|
|
||||||
- [ ] **Step 2: 运行 PDA 契约测试**
|
|
||||||
|
|
||||||
工作目录:`shierfeng-fastapi-app`
|
|
||||||
|
|
||||||
```bash
|
|
||||||
pnpm test:business
|
|
||||||
```
|
|
||||||
|
|
||||||
预期:所有 Node 20 测试通过且零失败。
|
|
||||||
|
|
||||||
- [ ] **Step 3: 运行 H5 构建,不运行 APK 构建**
|
|
||||||
|
|
||||||
```bash
|
|
||||||
pnpm run build:h5
|
|
||||||
```
|
|
||||||
|
|
||||||
预期:uni-app H5 构建成功。禁止运行 `pnpm run build:app`、`pnpm run dev:app`、APK 签名、安装或发布命令;构建产物不加入提交。
|
|
||||||
|
|
||||||
- [ ] **Step 4: 运行已有后端业务回归**
|
|
||||||
|
|
||||||
工作目录:`shierfeng-fastapi-backend`,使用当前已配置 Python 环境,不安装依赖:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
PYTHONDONTWRITEBYTECODE=1 python -m pytest tests/module_business -q
|
|
||||||
ruff format --check module_business tests/module_business
|
|
||||||
ruff check module_business tests/module_business
|
|
||||||
```
|
|
||||||
|
|
||||||
预期:已有后端业务测试、格式检查和静态检查通过;若本地 Python 环境无法执行,记录实际错误,不伪造通过结果。
|
|
||||||
|
|
||||||
- [ ] **Step 5: 做最终 diff 与敏感信息检查**
|
|
||||||
|
|
||||||
仓库根目录执行:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
git diff --check HEAD~9..HEAD
|
|
||||||
rg -n --fixed-strings '旧默认密码' shierfeng-fastapi-app/src shierfeng-fastapi-app/tests
|
|
||||||
rg -n 'Bearer[[:space:]]+[A-Za-z0-9._-]+' shierfeng-fastapi-app/src shierfeng-fastapi-app/tests
|
|
||||||
git status --short
|
|
||||||
```
|
|
||||||
|
|
||||||
敏感信息检查应无命中;`git status` 中只允许出现本计划任务的 PDA 文件和用户原有改动,不能出现由构建生成且准备提交的 APK、环境文件、日志或缓存。若提交数量因任务合并而不同,将 `HEAD~9..HEAD` 改为本次 PDA 首个提交到当前 `HEAD` 的实际范围,不扩大检查目标。
|
|
||||||
|
|
||||||
- [ ] **Step 6: 按人工验收清单交付**
|
|
||||||
|
|
||||||
在受控本地环境手工验证:管理员和受限普通用户登录;未授权入口不显示且直接接口返回 403;HID 扫码回车、重复扫码、空值和网络重试;库存余量、托盘状态、产线绑定、退回冻结与事件追溯均来自服务端;页面刷新和断网重试不重复扣减库存。管理员密码只在人工输入,不记录到终端输出、源码或日志。
|
|
||||||
|
|
||||||
## 计划自检
|
|
||||||
|
|
||||||
- 设计文档的范围、五类流程、认证安全、扫码输入、状态/幂等、验证、部署边界分别由 Tasks 1–9 覆盖。
|
|
||||||
- 所有跨任务接口在“已核实的后端接口与字段”和各任务的 `Interfaces` 中定义,页面调用名称与 API 导出名称保持一致。
|
|
||||||
- 没有新增依赖、后端契约改动、摄像头 SDK、APK 构建或凭据写入步骤。
|
|
||||||
- 实现前先写失败契约,随后运行最小测试,再执行 H5 和后端回归;每个任务都以显式路径提交。
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,77 +0,0 @@
|
|||||||
# MySQL Initialization and Docker Compose Implementation Plan
|
|
||||||
|
|
||||||
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
|
|
||||||
|
|
||||||
**Goal:** Keep the MySQL fresh-install script aligned with the current business model and provide a safe, persistent Compose deployment for the frontend, backend, MySQL, and Redis.
|
|
||||||
|
|
||||||
**Architecture:** The existing MySQL initializer remains the single bootstrap source for a new empty database and is mounted into MySQL's first-start initialization directory. Existing database volumes are never migrated automatically; operators continue to use the reviewed MySQL patches separately. Compose keeps MySQL and Redis on an internal network, persists their data in named volumes, and reads credentials from an ignored local `.env` file created from a checked-in example.
|
|
||||||
|
|
||||||
**Tech Stack:** MySQL 8.0, Redis 7, existing FastAPI and Vue/Nginx Dockerfiles, Docker Compose v2, Python `unittest` schema contracts.
|
|
||||||
|
|
||||||
**Spec:** User request; schema/seed contract in `shierfeng-fastapi-backend/tests/module_business/test_sql_contract.py`; operational migration guidance in `docs/test-data-batch-operations.md` and `docs/pallet-workflow-deployment.md`.
|
|
||||||
|
|
||||||
## Global Constraints
|
|
||||||
|
|
||||||
- MySQL remains the only database engine; do not add PostgreSQL configuration or SQL files.
|
|
||||||
- Do not execute SQL, apply patches, start containers, or remove/replace any database volume as part of this change.
|
|
||||||
- The full initializer contains `DROP TABLE`; mount it only as a first-start script for a fresh MySQL data directory.
|
|
||||||
- Keep existing seed records and schema unchanged when the current contract tests confirm they are synchronized.
|
|
||||||
- Do not place real credentials in Compose or the checked-in example environment file.
|
|
||||||
- Preserve unrelated staged, unstaged, and untracked work already in the repository.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Task 1: Mark the MySQL initializer's safe-use boundary
|
|
||||||
|
|
||||||
**Files:**
|
|
||||||
- Modify: `shierfeng-fastapi-backend/sql/shierfeng-fastapi.sql`
|
|
||||||
- Test: `shierfeng-fastapi-backend/tests/module_business/test_sql_contract.py`
|
|
||||||
|
|
||||||
**Interfaces:**
|
|
||||||
- Consumes: current SQLAlchemy ORM table metadata and the existing MySQL SQL contract tests.
|
|
||||||
- Produces: the same schema and seed statements, with a clear warning that this destructive bootstrap is only for an empty/new database.
|
|
||||||
|
|
||||||
- [x] Add a Chinese header warning that the script drops/recreates tables and is for a fresh empty database only; direct existing-database users to reviewed files under `sql/patches/`.
|
|
||||||
- [x] Run the existing SQL contract suite and confirm all table, field, constraint, menu, and test-batch contracts still pass.
|
|
||||||
- [x] Review the diff to confirm no seed rows or DDL changed beyond the warning.
|
|
||||||
|
|
||||||
### Task 2: Add a persistent full-stack Docker Compose deployment
|
|
||||||
|
|
||||||
**Files:**
|
|
||||||
- Create: `docker-compose.yml`
|
|
||||||
- Create: `.env.docker.example`
|
|
||||||
- Modify: `.gitignore`
|
|
||||||
|
|
||||||
**Interfaces:**
|
|
||||||
- Consumes: `Dockerfile.my`, the frontend `Dockerfile`, `nginx.dockermy.conf`, `.env.dockermy`, and the MySQL initializer.
|
|
||||||
- Produces: Compose services `shierfeng-mysql`, `shierfeng-redis`, `shierfeng-backend-my`, and `shierfeng-frontend`; named volumes `mysql-data` and `redis-data`; required secrets supplied by root `.env`.
|
|
||||||
|
|
||||||
- [x] Define MySQL 8.0 with the fresh-install SQL mounted read-only at `/docker-entrypoint-initdb.d/01-schema-and-seed.sql`, an app-scoped database user, a health check, and a named data volume.
|
|
||||||
- [x] Define Redis 7 with append-only persistence, a health check, and a named data volume; do not publish Redis to the host.
|
|
||||||
- [x] Build the backend and frontend from the existing Dockerfiles. Configure backend DB/Redis service hosts and credentials through Compose environment overrides; make backend wait for healthy dependencies.
|
|
||||||
- [x] Route browser API requests through the existing Nginx config. Publish the frontend on configurable host port 8080 by default and MySQL only on loopback port 13307 by default.
|
|
||||||
- [x] Create `.env.docker.example` with placeholders for MySQL root password, app DB username/password, and JWT secret; add only root `/.env` to `.gitignore`.
|
|
||||||
- [x] Run `docker compose config --quiet` with test-only environment values and confirm configuration resolves without starting services.
|
|
||||||
|
|
||||||
### Task 3: Document first-run and existing-database workflows
|
|
||||||
|
|
||||||
**Files:**
|
|
||||||
- Modify: `README.md`
|
|
||||||
|
|
||||||
**Interfaces:**
|
|
||||||
- Consumes: root Compose file and `.env.docker.example`.
|
|
||||||
- Produces: concise setup commands and explicit distinction between fresh database initialization and existing-database patches.
|
|
||||||
|
|
||||||
- [x] Replace the root deployment instructions that point to the test-only Compose file with instructions to copy `.env.docker.example` to `.env`, set strong local credentials, validate with `docker compose config`, and start with `docker compose up -d --build`.
|
|
||||||
- [x] Document the default frontend/MySQL addresses and state that MySQL initialization scripts run only when its data directory is empty; existing databases must use reviewed patches after backup.
|
|
||||||
- [x] Do not include `docker compose down -v` or any other volume-deletion command in the documentation.
|
|
||||||
- [x] Re-run the SQL contract suite and Compose config validation; do not run `docker compose up`.
|
|
||||||
|
|
||||||
## Verification Commands
|
|
||||||
|
|
||||||
```bash
|
|
||||||
PYTHONDONTWRITEBYTECODE=1 /Users/jiaolongyan/miniconda3/envs/ShiErFeng/bin/python -m unittest tests.module_business.test_sql_contract -v
|
|
||||||
MYSQL_ROOT_PASSWORD=compose-validation DB_USERNAME=compose_validation DB_PASSWORD=compose-validation JWT_SECRET_KEY=compose-validation docker compose config --quiet
|
|
||||||
```
|
|
||||||
|
|
||||||
Do not run the SQL initializer, migration patches, or `docker compose up` during implementation verification.
|
|
||||||
@@ -1,136 +0,0 @@
|
|||||||
# 会议物料流转缺口补齐 Implementation Plan
|
|
||||||
|
|
||||||
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
|
|
||||||
|
|
||||||
**Goal:** 完整补齐会议纪要中现有三个业务模块的缺口,并对齐 PC、APP/PDA 与后端。
|
|
||||||
|
|
||||||
**Architecture:** 复用现有 controller/service/dao/vo/do 分层、库存状态机、作用域与事件流水。报表和 APP 接口纠偏先独立完成;日期、收货与 FIFO 在共享模型和迁移中顺序集成。
|
|
||||||
|
|
||||||
**Tech Stack:** FastAPI、SQLAlchemy、Pydantic、MySQL、Vue 3、Element Plus、uni-app、Python unittest、Node 20。
|
|
||||||
|
|
||||||
**Spec:** docs/superpowers/specs/2026-10-08-meeting-flow-completion-design.md
|
|
||||||
|
|
||||||
## Global Constraints
|
|
||||||
|
|
||||||
- 托盘号沿用发货方录入值;生产批号、托盘号和内部溯源号互不替代。
|
|
||||||
- 正式数据与测试批次隔离;权限、仓库/现场数据范围、事务锁、幂等和事件流水继续在后端执行。
|
|
||||||
- 不安装依赖、不修改运行环境、不修改无关文件、不提交既有暂存内容。
|
|
||||||
- 仅准备初始化 SQL 和增量迁移;连接真实数据库执行结构变更、补数或业务写入前另行获得明确确认。
|
|
||||||
|
|
||||||
## Task 1: 隧道报表与混批明细
|
|
||||||
|
|
||||||
**Files:** backend module_business/dao/report_dao.py、entity/vo/report_vo.py、service/report_service.py;frontend src/views/report;相关测试。
|
|
||||||
|
|
||||||
**Interfaces:** 复用现有 tunnel_id、trace_no、batch_no_snapshot;增加 camelCase 隧道筛选和名称字段;保持所有既有报表路径。
|
|
||||||
|
|
||||||
- [x] 用数据库查询生成或隔离内存数据测试证明:line_id=NULL 的使用记录仍出现,跨测试批次关联不泄漏。
|
|
||||||
- [x] 先运行新增测试确认失败,再修改产线可选关联、隧道与溯源筛选/输出、退回快照。
|
|
||||||
- [x] PC 报表改为可读隧道编号/名称,提供同隧道/同溯源关系的多批次明细,不混加使用量与退回量。
|
|
||||||
- [x] 运行 `python -B -m unittest tests.module_business.test_report_service -q` 及新增专项测试;Node 20 运行 PC 契约测试。
|
|
||||||
|
|
||||||
## Task 2: APP/PDA 隧道操作
|
|
||||||
|
|
||||||
**Files:** app src/api/business/usage.js、src/pages/business/usage/index.vue、tests 下专项测试。
|
|
||||||
|
|
||||||
**Interfaces:** GET /business/usage/tunnel-options?siteId;POST /business/usage/enter-tunnel;POST /business/usage {qrToken,tunnelId,lineId?,usedPackages,idempotencyKey}。
|
|
||||||
|
|
||||||
- [x] 用真实页面脚本/API封装的行为测试覆盖未入隧不能使用、选隧道、失败重试键不变、切换输入旧响应无效、产线可空。
|
|
||||||
- [x] 运行新增测试确认旧实现失败。
|
|
||||||
- [x] 对齐后端接口,入隧独立提交;不在前端推算最终库存;内部溯源码不占普通操作主界面。
|
|
||||||
- [x] Node 20 运行 APP 契约测试、H5 与 APP 资源构建。
|
|
||||||
|
|
||||||
## Task 3: 批次日期与完整标签
|
|
||||||
|
|
||||||
**Files:** operation_do.py、operation_vo.py、filling_service.py、各扫描响应、PC/APP filling 页面、PC shipment 标签、SQL与测试。
|
|
||||||
|
|
||||||
**Interfaces:** productionDate、expiryDate(YYYY-MM-DD);历史读取可空,新增录入必须完整且有效期不早于生产日期。
|
|
||||||
|
|
||||||
- [x] 写日期缺失、倒置、合法日期与幂等内容变化的失败测试。
|
|
||||||
- [x] 录入并保留原生产批次,日期参与请求摘要;扫描与发货标签读同一装填记录。
|
|
||||||
- [x] 实现发货标签,不以操作日期推导历史生产日期。
|
|
||||||
- [x] 运行 filling、shipment、模型与PC/APP相关测试。
|
|
||||||
|
|
||||||
## Task 4: 接收核对闭环
|
|
||||||
|
|
||||||
**Files:** shipment controller/service/dao/model、state machine、PC/APP shipment 页面、权限 SQL、事件流水与相关测试。
|
|
||||||
|
|
||||||
**Interfaces:** 接收确认附带原单据与核对托盘集合、独立幂等键;服务端复核目标现场权限和全部物料身份。
|
|
||||||
|
|
||||||
- [x] 写发货未接收不可入隧、越权接收、漏扫/错扫、重复确认、同键不同内容的失败测试。
|
|
||||||
- [x] 增加接收动作与时间/操作人/状态留痕;接收不新增托盘、批号或重复扣减包数。
|
|
||||||
- [x] 同步PC/PDA状态显示、按钮权限及扫码核对交互。
|
|
||||||
- [x] 准备历史数据兼容迁移和回滚/备份说明,执行前停在确认门。
|
|
||||||
- [x] 运行 shipment、usage、return、状态机、权限、测试批次图与清理回归测试。
|
|
||||||
|
|
||||||
## Task 5: 印刷托盘号解析
|
|
||||||
|
|
||||||
**Files:** inventory DAO、业务扫描服务/响应、PC/APP扫码消费端与测试。
|
|
||||||
|
|
||||||
**Interfaces:** 扫描入口接受二维码固定标识或印刷托盘号,返回 canonical qrToken;写命令保持二维码身份一致。
|
|
||||||
|
|
||||||
- [x] 写二维码输入、托盘号输入、两者歧义、跨范围/跨批次的失败测试。
|
|
||||||
- [x] 服务端解析并执行原业务权限检查;客户端提交规范化标识。
|
|
||||||
- [x] 运行五类扫码服务与PC/APP组件行为测试。
|
|
||||||
|
|
||||||
## Task 6: 先到先用与界面简化
|
|
||||||
|
|
||||||
**Files:** usage service/dao/vo、PC/APP usage、相关测试。
|
|
||||||
|
|
||||||
**Interfaces:** 排序依据实际接收时间;同现场同品种。用户已批准“允许跳过但必须记录原因”。入隧与使用写命令新增可选 `fifoSkipReason`(去首尾空白,最多500字);服务端在原锁与幂等流程内复核,仅存在严格更早的已知到货候选时要求原因。同时间不按ID强迫先后;历史到货未知时保留人工核对提示。原因及推荐快照随原事件/使用记录同事务保存。
|
|
||||||
|
|
||||||
- [x] 完成只读推荐边界测试:实际到货顺序、部分使用、同现场同品种、在途/停用/零库存排除、测试隔离、旧溯源周期排除和历史时间未知。
|
|
||||||
- [x] 实现推荐提示,保留权限与幂等;界面显示推荐托盘,不暴露长内部码。
|
|
||||||
- [x] 用户批准允许跳过但必须记录原因;完成两端输入/恢复、后端入隧及使用复核、原因与推荐快照同事务留痕和增量迁移。
|
|
||||||
- [x] 运行 usage、return 与PC/APP行为测试;退回清空本轮到货时间,新收货记录实际时间。
|
|
||||||
|
|
||||||
## Task 7: 全量覆盖审计与迁移交付
|
|
||||||
|
|
||||||
- [x] 逐条对照设计,独立复查数据闭环、权限、测试隔离、重试与历史兼容性。
|
|
||||||
- [x] 运行业务单元测试、PC与APP契约测试、构建;记录真实命令及结果。
|
|
||||||
- [x] 获得“批准开发库迁移,FIFO按推荐规则执行”授权后,完成停写、43表完整备份、隔离恢复演练、三份补丁试跑、开发库迁移与历史数据摘要核对、后端恢复。
|
|
||||||
- [x] 更新部署文档,明确实机扫码和HTTP联调尚未覆盖的部分。
|
|
||||||
|
|
||||||
## 首轮执行记录(迁移授权前,历史)
|
|
||||||
|
|
||||||
- 已确认工作分支为 codex/test-data-batch-cleanup;当前未提交隧道改动是本次基础,不回滚或复制丢失。
|
|
||||||
- 基线:后端 report_service + tunnel_flow_contract 共36项通过。
|
|
||||||
- 默认 shell Node 是16;现有 Node20 位于 /Users/jiaolongyan/.nvm/versions/node/v20.20.2/bin,后续显式使用,不安装或修改全局环境。
|
|
||||||
- 用户已要求直接实施评估中缺口;唯一待业务选择项为FIFO执行强度。代码之外的数据库执行仍需独立确认。
|
|
||||||
- 726项后端业务回归通过;新增收货读取/权限/幂等24项包含SQLite与ASGI验证,不等于真实MySQL并发验证。
|
|
||||||
- 复查补上退回确认事件的原隧道字段;回归先复现缺失,再验证48项退回服务测试通过。
|
|
||||||
- 两端未知请求凭据落盘、离页恢复与可选产线失败降级均已有真实页面行为测试。PC静态使用断言改为执行行为套件,避免旧源码匹配要求与安全重试冲突。
|
|
||||||
- 原许可证、登录页面、缓存/日志和既有隧道改动均保留;本轮未提交、暂存、推送、执行迁移、授角色或重启服务。
|
|
||||||
|
|
||||||
## 首轮集成验证记录(2026-10-08,迁移授权前)
|
|
||||||
|
|
||||||
- 后端:`LOG_FILE_ENABLED=false PYTHONDONTWRITEBYTECODE=1 /Users/jiaolongyan/miniconda3/envs/ShiErFeng/bin/python -B -m unittest discover -s tests/module_business -q`,727项通过。
|
|
||||||
- PC、APP分别在项目目录,使用现有Node20执行 `npm run test:business`,分别208项、75项通过;PC套件含两端收货组件行为测试。
|
|
||||||
- PC `npm run build:prod -- --outDir /private/tmp/shierfeng-meeting-pc.kB6NUN` 退出0。
|
|
||||||
- APP `UNI_OUTPUT_DIR=/private/tmp/shierfeng-meeting-app.oow8jU npm run build:app` 退出0。此为APP资源构建,不是签名APK;未覆盖当前 `dist/dev/app`。
|
|
||||||
- 主线程修改涉及的收货/FIFO分层文件、库存DAO、报表DAO、装填/入库/发货/使用/退回服务及物料模型定向Ruff检查通过;限定任务路径 `git diff --check` 通过。
|
|
||||||
- 审查发现的旧溯源FIFO候选已修复:已入隧候选必须匹配当前隧道和已验证trace,未知数量统计复用同一过滤;先观察失败,再运行7项FIFO测试通过,并经只读复核关闭问题。
|
|
||||||
- 未执行真实MySQL迁移、行锁竞争验收、生产HTTP联调、角色授予、打印机和PDA实机测试。迁移和FIFO执行强度仍待用户明确选择,不能将这些状态写为已完成。
|
|
||||||
- 最终前端独立复审无Critical/Important;补验两端×账号/批次切换×恢复/人工解除的8种交错场景通过。人工解除仅清理核对后的本机待确认记录,不发业务写请求,不宣称原操作成功。
|
|
||||||
|
|
||||||
## 数据库只读预检补充(2026-10-08)
|
|
||||||
|
|
||||||
- 继续轮完成了新证据核对,不是重复报告状态:实际开发目标为 `127.0.0.1:3306/shierfeng-fastapi`,MySQL 8.0.36,已有测试批次和隧道结构。
|
|
||||||
- 两个日期列、发货单5个收货列、库存实际收货时间列尚未落库;收货菜单1119和同名权限均未占用,也无1119孤立角色授权。
|
|
||||||
- 查询采用只读事务,仅结构元数据和菜单冲突检查,未做备份、DDL、业务写入、授权或重启。后端9099仍有监听,不能在未获准停写时执行补丁。
|
|
||||||
- 余下目标仍依赖用户确认两份增量迁移的维护窗口,以及FIFO跳过策略;未将自动目标续跑当作数据库写入授权。
|
|
||||||
|
|
||||||
## 迁移授权后实施与最终验证(2026-10-08)
|
|
||||||
|
|
||||||
本节是用户明确“批准开发库迁移,FIFO按推荐规则执行”后的当前状态;上文待授权、未迁移等描述保留为历史,不代表仍需重复审批。
|
|
||||||
|
|
||||||
- 已对本机 `127.0.0.1:3306/shierfeng-fastapi` 完成停写、43表完整备份、隔离库恢复及逐行摘要比对、三份补丁试跑、开发库迁移、原数据摘要核对和9099服务恢复。依次执行日期、收货、FIFO补丁;没有重跑初始化、清空业务表或自动授予普通角色。备份路径及SHA-256见 `docs/pallet-workflow-deployment.md`。
|
|
||||||
- FIFO已实现为“允许跳过严格更早到货的可用托盘,但必须填写最多500字原因”。入隧、使用两个写入口强制校验;原因及推荐快照同事务保存,参与幂等摘要;同时间和历史未知时间不伪造顺序。PC、APP均接入。
|
|
||||||
- 真实MySQL发现的提交/回滚后ORM过期属性读取已修复;返回值和ID在事务结束前取值。FIFO候选改为 `FOR UPDATE NOWAIT`,只对3572/1213/1205最多三次整事务原键重试,避免反向锁等待且不跳过早到候选。
|
|
||||||
- 前端审查发现的3项问题已补回归并修复:APP无业务code的HTTP5xx及不完整结果误清凭据、PC跨页面旧成功删除新待确认记录、PC恢复FIFO拒绝后推荐失败丢失已知必填要求。
|
|
||||||
- 主线程在最终代码运行后端 `LOG_FILE_ENABLED=false PYTHONDONTWRITEBYTECODE=1 /Users/jiaolongyan/miniconda3/envs/ShiErFeng/bin/python -B -m unittest discover -s tests/module_business -q`:741项,0失败,其中2项需显式隔离库而跳过。出现一条asyncio慢任务警告,不影响测试结果。
|
|
||||||
- 随后在已恢复的本机隔离库,设置 `SHIERFENG_MYSQL_FLOW_TEST_DATABASE=shierfeng_rehearsal_20261008_6ce_sy6c`,使用同一Python、`LOG_FILE_ENABLED=false DB_ECHO=false PYTHONDONTWRITEBYTECODE=1` 执行 `-m unittest discover -s tests/module_business -p test_material_flow_mysql.py -v`:2项均通过。覆盖完整物料流程、四类报表、三连接同键不重复扣减,以及正式scope两托交错入隧/使用的真实锁冲突回滚重试。未写实际开发库业务数据。
|
|
||||||
- 两端分别使用 `PATH=/Users/jiaolongyan/.nvm/versions/node/v20.20.2/bin:$PATH npm run test:business`:PC 243/243、APP 144/144通过,无跳过。
|
|
||||||
- PC `npm run build:prod -- --outDir /private/tmp/shierfeng-fifo-final-pc.kMm0to` 退出0;APP `UNI_OUTPUT_DIR=/private/tmp/shierfeng-fifo-final-app.BepwcI npm run build:app` 退出0,均使用上述Node20。构建到独立临时目录,未覆盖用户当前 `dist/dev/app`;APP产物为资源包,不是签名APK。
|
|
||||||
- 最终FIFO生产文件定向Ruff通过,限定任务路径 `git diff --check` 通过。`GET /docs` 返回HTTP200;未登录收货列表返回业务401,验证运行态及访问保护正常。
|
|
||||||
- 独立复审已关闭后端候选锁顺序及部署清单2项、前端F1/F2/F3三项问题,限定范围内无剩余阻断项;复审另行实跑后端11项及3组补充检查、PC 12项、APP 42项定向回归。没有用审查报告替代上述主线程最终全套验证。
|
|
||||||
- 普通角色配置、真实登录账号的HTTP写入联调、打印机及东集PDA实机仍未验收;未新增依赖、未改生产环境、未暂存/提交/推送,原有许可证、登录页、日志、缓存等改动均保留。
|
|
||||||
@@ -1,440 +0,0 @@
|
|||||||
# 智链云枢托盘业务系统设计
|
|
||||||
|
|
||||||
## 1. 背景与目标
|
|
||||||
|
|
||||||
当前项目是基于 Vue 3、Element Plus、Pinia、Vite、FastAPI 和异步 SQLAlchemy 的通用管理后台。Web 菜单由后端 `/getRouters` 根据 `sys_menu`、`sys_role_menu` 动态生成,按钮权限由前端 `v-hasPermi` 控制,真实接口权限由后端 `UserInterfaceAuthDependency` 校验。
|
|
||||||
|
|
||||||
本次以用户提供的流程图为最终业务依据,完成以下目标:
|
|
||||||
|
|
||||||
- 完整移除“AI管理”专属功能。
|
|
||||||
- 删除“施尔丰仓库”外链菜单。
|
|
||||||
- 在“系统管理”下新增托盘基础资料、五类业务操作和六类报表。
|
|
||||||
- 保证菜单、页面、API、按钮权限、后端权限与数据范围一致。
|
|
||||||
- 建立可审计、可并发控制的托盘库存和追溯模型。
|
|
||||||
|
|
||||||
## 2. 已确认的范围
|
|
||||||
|
|
||||||
### 2.1 本次包含
|
|
||||||
|
|
||||||
- Web 前端页面、动态菜单、按钮权限、API 请求和类型约定。
|
|
||||||
- FastAPI 后端 Controller、Service、DAO、DO、VO、状态机和权限校验。
|
|
||||||
- MySQL、PostgreSQL 初始化脚本同步。
|
|
||||||
- 一份仅供审查、不自动执行的 MySQL 增量补丁。
|
|
||||||
- 直接相关的测试、README、CHANGELOG 和依赖声明。
|
|
||||||
- 适配 Android PDA 浏览器的 Web 操作页面。
|
|
||||||
|
|
||||||
### 2.2 本次明确排除
|
|
||||||
|
|
||||||
- 不修改 `shierfeng-fastapi-app` 下任何文件,也不兼容其现有接口逻辑。
|
|
||||||
- 不连接、不写入、不迁移本地 MySQL。
|
|
||||||
- 不生成或执行 PostgreSQL 增量补丁。
|
|
||||||
- 不删除现有数据库中的 AI 业务表、模型配置、聊天配置或 Agno 运行数据。
|
|
||||||
- 不新增在途、签收、拒收、冲销、库存调整、导入、导出或摄像头扫码功能。
|
|
||||||
- 不预置新的业务角色,不给现有普通角色自动分配新增权限。
|
|
||||||
- 不删除用户、角色、菜单、部门、岗位、字典、参数、通知、日志、监控或系统工具等通用功能。
|
|
||||||
|
|
||||||
## 3. 总体架构
|
|
||||||
|
|
||||||
### 3.1 后端
|
|
||||||
|
|
||||||
新增独立的 `module_business`,继续采用现有分层:
|
|
||||||
|
|
||||||
```text
|
|
||||||
module_business/
|
|
||||||
├── controller/
|
|
||||||
├── service/
|
|
||||||
├── dao/
|
|
||||||
├── entity/
|
|
||||||
│ ├── do/
|
|
||||||
│ └── vo/
|
|
||||||
└── domain/
|
|
||||||
```
|
|
||||||
|
|
||||||
模块内部职责划分:
|
|
||||||
|
|
||||||
- `master`:菌种、客户、客户现场、产线、仓库、托盘及用户授权。
|
|
||||||
- `operation`:首次入库、工厂装填、发货、现场使用、退回。
|
|
||||||
- `report`:六类只读报表和托盘追溯。
|
|
||||||
- `domain`:托盘状态枚举、状态迁移规则和跨业务公共校验。
|
|
||||||
|
|
||||||
Controller 只负责协议、参数、认证和权限依赖;Service 负责事务、状态机、数据范围和幂等;DAO 负责持久化查询;前端不得直接指定最终库存或最终状态。
|
|
||||||
|
|
||||||
### 3.2 Web
|
|
||||||
|
|
||||||
新增以下目录,沿用现有页面与请求风格:
|
|
||||||
|
|
||||||
```text
|
|
||||||
src/api/master/
|
|
||||||
src/api/business/
|
|
||||||
src/api/report/
|
|
||||||
src/views/master/
|
|
||||||
src/views/business/
|
|
||||||
src/views/report/
|
|
||||||
src/components/PalletScanInput/
|
|
||||||
```
|
|
||||||
|
|
||||||
PDA 页面属于 Web 页面,使用响应式布局。扫码设备按 HID 键盘输入处理:输入框自动聚焦,扫码头输入二维码后回车提交;不调用摄像头,不引入前端扫码依赖。
|
|
||||||
|
|
||||||
### 3.3 库存一致性
|
|
||||||
|
|
||||||
托盘是业务聚合根。每次状态变更必须在一个数据库事务内同时完成:
|
|
||||||
|
|
||||||
1. 校验接口权限和仓库/客户现场数据范围。
|
|
||||||
2. 锁定托盘当前库存行。
|
|
||||||
3. 校验当前状态、位置、数量和幂等键。
|
|
||||||
4. 写入或确认业务单据。
|
|
||||||
5. 更新托盘当前库存快照。
|
|
||||||
6. 追加不可变托盘事件。
|
|
||||||
|
|
||||||
任何一步失败都整体回滚,多托盘单据不允许部分成功。
|
|
||||||
|
|
||||||
## 4. 主数据模型
|
|
||||||
|
|
||||||
### 4.1 `biz_strain`
|
|
||||||
|
|
||||||
- 菌种是基础品种/SKU,不代表生产批次。
|
|
||||||
- `strain_code` 非空且唯一。
|
|
||||||
- 生产批次、包装规格和本次装填包数保存在装填记录中。
|
|
||||||
- 已被业务引用后只能停用,不能删除。
|
|
||||||
|
|
||||||
### 4.2 `biz_warehouse`
|
|
||||||
|
|
||||||
- 保存仓库编码、名称、地址和启停状态。
|
|
||||||
- `warehouse_code` 非空且唯一。
|
|
||||||
- 通过 `biz_user_warehouse` 与现有 `sys_user` 多对多关联。
|
|
||||||
|
|
||||||
### 4.3 客户、现场与产线
|
|
||||||
|
|
||||||
- `biz_customer`:客户主数据,客户编码唯一。
|
|
||||||
- `biz_customer_site`:归属于客户,现场编码在同一客户下唯一。
|
|
||||||
- `biz_production_line`:仅表示客户现场使用/消耗产线,产线编码在同一现场下唯一。
|
|
||||||
- `biz_user_site`:现有用户与客户现场的多对多关联。
|
|
||||||
- 本次不建立工厂内部装填产线。
|
|
||||||
|
|
||||||
### 4.4 `biz_pallet`
|
|
||||||
|
|
||||||
- 保存托盘编号、容量包数、资产启停状态和固定二维码标识。
|
|
||||||
- `pallet_code`、`qr_token` 非空且唯一,创建后不可修改。
|
|
||||||
- 托盘创建时同时建立 `biz_pallet_inventory`,初始流转状态为 `UNSTOCKED`。
|
|
||||||
- 二维码只编码不可推测的随机 `qr_token`,不包含菌种、批次、数量、客户或权限信息。
|
|
||||||
- 使用后端 `qrcode` 和现有 Pillow 生成可打印二维码;二维码损坏时补打原标识,不允许换码。
|
|
||||||
|
|
||||||
## 5. 业务与库存模型
|
|
||||||
|
|
||||||
### 5.1 单据与事实表
|
|
||||||
|
|
||||||
| 表 | 用途和核心约束 |
|
|
||||||
|---|---|
|
|
||||||
| `biz_inbound_order` | 首次入库单,状态仅为 `DRAFT`、`CONFIRMED`,单号唯一。 |
|
|
||||||
| `biz_inbound_item` | 入库单托盘明细,同一单据内托盘唯一。 |
|
|
||||||
| `biz_filling_record` | 单托盘即时装填;保存菌种、批次、包装规格、初始整数包数、仓库和操作人。 |
|
|
||||||
| `biz_shipment_order` | 发货单,状态仅为 `DRAFT`、`CONFIRMED`,单号唯一。 |
|
|
||||||
| `biz_shipment_item` | 多托盘整托发货明细;包数由确认时的当前余量快照生成,不允许手填拆分。 |
|
|
||||||
| `biz_usage_record` | 每次现场使用事实;保存产线、本次使用包数、使用后余量和幂等键。 |
|
|
||||||
| `biz_return_order` | 两阶段退回单,状态为 `REQUESTED`、`CONFIRMED`。 |
|
|
||||||
| `biz_return_item` | 退回托盘及发起时余量快照;同一退回单内托盘唯一。 |
|
|
||||||
| `biz_pallet_inventory` | 每托盘唯一一行当前状态、位置、余量、当前装填记录、当前绑定产线和版本号。 |
|
|
||||||
| `biz_pallet_event` | 只追加追溯流水;记录来源单据、前后状态、位置、数量、操作人、时间和幂等键。 |
|
|
||||||
|
|
||||||
### 5.2 数量约束
|
|
||||||
|
|
||||||
- 库存最小单位为“包”,所有包数均为整数。
|
|
||||||
- 装填量和使用量必须大于零。
|
|
||||||
- 剩余量必须满足 `0 <= remaining_packages <= pallet.capacity_packages`。
|
|
||||||
- 一个托盘的同一装填周期只能包含一个菌种和一个生产批次,禁止混装。
|
|
||||||
- 当前装填记录在余量归零后关闭;下一次装填形成新的独立记录,不覆盖历史。
|
|
||||||
|
|
||||||
### 5.3 位置约束
|
|
||||||
|
|
||||||
`biz_pallet_inventory` 在任意时刻只能表达一个有效位置:
|
|
||||||
|
|
||||||
- 位于仓库时只能有 `warehouse_id`。
|
|
||||||
- 位于客户现场时只能有 `site_id`。
|
|
||||||
- `UNSTOCKED` 时两者都为空。
|
|
||||||
- `current_line_id` 只能在客户现场第一次使用后设置,并在仓库确认退回时清空。
|
|
||||||
|
|
||||||
## 6. 托盘状态机
|
|
||||||
|
|
||||||
```text
|
|
||||||
UNSTOCKED
|
|
||||||
└─ 首次入库确认 → EMPTY_IN_WAREHOUSE
|
|
||||||
└─ 单托盘装填 → FILLED_IN_WAREHOUSE
|
|
||||||
└─ 发货确认 → AT_SITE_UNUSED
|
|
||||||
├─ 部分使用 → AT_SITE_PARTIAL
|
|
||||||
├─ 全部用完 → AT_SITE_EMPTY
|
|
||||||
└─ 发起退回 → RETURNING
|
|
||||||
AT_SITE_PARTIAL
|
|
||||||
├─ 继续部分使用 → AT_SITE_PARTIAL
|
|
||||||
├─ 全部用完 → AT_SITE_EMPTY
|
|
||||||
└─ 发起退回 → RETURNING
|
|
||||||
AT_SITE_EMPTY
|
|
||||||
└─ 发起退回 → RETURNING
|
|
||||||
RETURNING
|
|
||||||
└─ 仓库确认收货:
|
|
||||||
├─ remaining_packages > 0 → FILLED_IN_WAREHOUSE
|
|
||||||
└─ remaining_packages = 0 → EMPTY_IN_WAREHOUSE
|
|
||||||
```
|
|
||||||
|
|
||||||
补充规则:
|
|
||||||
|
|
||||||
- 发货确认后直接归属目标客户现场,不增加在途或签收状态。
|
|
||||||
- 客户现场第一次使用时选择产线,本次驻场周期内不可变更。
|
|
||||||
- 客户发起退回后冻结使用和再次发货,直到仓库确认。
|
|
||||||
- 仓库确认退回后解除产线绑定。
|
|
||||||
- 带料退回保留原菌种、批次和余量,可再次整托发货;再次到达现场后重新绑定产线。
|
|
||||||
- 空托盘必须退回仓库后才能再次装填。
|
|
||||||
|
|
||||||
## 7. 五类业务流程
|
|
||||||
|
|
||||||
### 7.1 仓库入库
|
|
||||||
|
|
||||||
- 只处理已建档空托盘的首次入库。
|
|
||||||
- 创建草稿,选择目标仓库,连续扫描 `UNSTOCKED` 托盘。
|
|
||||||
- 草稿可编辑或删除;确认后锁定全部托盘并整单转为 `EMPTY_IN_WAREHOUSE`。
|
|
||||||
- 流程图中连续出现的第二个“创建入库单”按重复节点处理。
|
|
||||||
|
|
||||||
### 7.2 工厂装填
|
|
||||||
|
|
||||||
- 扫描 `EMPTY_IN_WAREHOUSE` 托盘。
|
|
||||||
- 校验当前用户拥有该仓库数据权限。
|
|
||||||
- 选择菌种,填写生产批次、包装规格和正整数包数。
|
|
||||||
- 一次操作只处理一个托盘并即时确认。
|
|
||||||
- 成功后创建装填记录,状态转为 `FILLED_IN_WAREHOUSE`。
|
|
||||||
|
|
||||||
### 7.3 发货出库
|
|
||||||
|
|
||||||
- 创建草稿,选择来源仓库和目标客户现场。
|
|
||||||
- 一张发货单允许多个托盘,只允许整托发货。
|
|
||||||
- 当前用户必须同时拥有来源仓库和目标客户现场数据权限。
|
|
||||||
- 确认时按托盘 ID 排序加锁;全部成功后转为 `AT_SITE_UNUSED`。
|
|
||||||
- 不增加在途、签收或拒收流程。
|
|
||||||
|
|
||||||
### 7.4 客户现场使用
|
|
||||||
|
|
||||||
- 用户必须具备 `business:usage:add` 且关联当前客户现场。
|
|
||||||
- 扫码后后端返回托盘、菌种、批次、当前余量和允许操作。
|
|
||||||
- 第一次使用选择该现场下的产线,并锁定至本次退回完成。
|
|
||||||
- 使用包数必须为正整数且不得超过当前余量。
|
|
||||||
- 使用后余量大于零时转为 `AT_SITE_PARTIAL`,等于零时转为 `AT_SITE_EMPTY`。
|
|
||||||
- 使用请求必须携带幂等键,PDA 重复提交不得重复扣减。
|
|
||||||
|
|
||||||
### 7.5 退回仓库
|
|
||||||
|
|
||||||
- 客户现场用户扫描一个或多个同现场托盘,选择目标仓库并发起退回。
|
|
||||||
- 发起后保存余量快照,托盘转为 `RETURNING`,禁止继续使用。
|
|
||||||
- 仓库人员实际收货扫码确认,必须拥有目标仓库数据权限。
|
|
||||||
- 确认时重新校验状态和余量快照,整单成功或整单回滚。
|
|
||||||
- 有余料时转为 `FILLED_IN_WAREHOUSE`,无余料时转为 `EMPTY_IN_WAREHOUSE`。
|
|
||||||
|
|
||||||
## 8. 菜单、页面、API 与权限
|
|
||||||
|
|
||||||
### 8.1 菜单结构
|
|
||||||
|
|
||||||
```text
|
|
||||||
系统管理
|
|
||||||
├─ 基础资料维护
|
|
||||||
│ ├─ 菌种资料
|
|
||||||
│ ├─ 客户资料
|
|
||||||
│ ├─ 客户现场
|
|
||||||
│ ├─ 产线资料
|
|
||||||
│ ├─ 仓库资料
|
|
||||||
│ └─ 托盘资料
|
|
||||||
├─ 业务管理
|
|
||||||
│ ├─ 仓库入库
|
|
||||||
│ ├─ 工厂装填
|
|
||||||
│ ├─ 发货出库
|
|
||||||
│ ├─ 客户现场使用
|
|
||||||
│ └─ 退回仓库
|
|
||||||
└─ 报表查询
|
|
||||||
├─ 托盘库存
|
|
||||||
├─ 装填记录
|
|
||||||
├─ 发货出库
|
|
||||||
├─ 产线消耗
|
|
||||||
├─ 退回仓库
|
|
||||||
└─ 托盘追溯
|
|
||||||
```
|
|
||||||
|
|
||||||
三个目录节点不设置权限字符串。页面菜单使用 `*:list`,按钮节点使用具体操作权限。
|
|
||||||
|
|
||||||
### 8.2 权限映射
|
|
||||||
|
|
||||||
| 页面 | 资源前缀 | 动作 |
|
|
||||||
|---|---|---|
|
|
||||||
| 菌种资料 | `master:strain` | `list/query/add/edit/remove` |
|
|
||||||
| 客户资料 | `master:customer` | `list/query/add/edit/remove` |
|
|
||||||
| 客户现场 | `master:site` | `list/query/add/edit/remove/assign` |
|
|
||||||
| 产线资料 | `master:line` | `list/query/add/edit/remove` |
|
|
||||||
| 仓库资料 | `master:warehouse` | `list/query/add/edit/remove/assign` |
|
|
||||||
| 托盘资料 | `master:pallet` | `list/query/add/edit/remove/print` |
|
|
||||||
| 仓库入库 | `business:inbound` | `list/query/add/edit/remove/confirm` |
|
|
||||||
| 工厂装填 | `business:filling` | `list/query/add` |
|
|
||||||
| 发货出库 | `business:shipment` | `list/query/add/edit/remove/confirm` |
|
|
||||||
| 客户现场使用 | `business:usage` | `list/query/add` |
|
|
||||||
| 退回仓库 | `business:return` | `list/query/request/confirm` |
|
|
||||||
| 托盘库存 | `report:palletinventory` | `list` |
|
|
||||||
| 装填记录 | `report:filling` | `list` |
|
|
||||||
| 发货出库 | `report:shipment` | `list` |
|
|
||||||
| 产线消耗 | `report:consumption` | `list` |
|
|
||||||
| 退回仓库 | `report:return` | `list` |
|
|
||||||
| 托盘追溯 | `report:pallettrace` | `list` |
|
|
||||||
|
|
||||||
每个权限字符串必须同时出现在:
|
|
||||||
|
|
||||||
1. `sys_menu.perms`。
|
|
||||||
2. Web 的 `v-hasPermi` 或页面权限判断。
|
|
||||||
3. 后端 `UserInterfaceAuthDependency`。
|
|
||||||
4. 对应权限测试。
|
|
||||||
|
|
||||||
未授权用户绕过 Web 直接调用接口时返回现有规范的 403。拥有功能权限但没有目标仓库或客户现场关联时,同样拒绝访问。
|
|
||||||
|
|
||||||
### 8.3 API 前缀
|
|
||||||
|
|
||||||
- 主数据:`/master/strain`、`/master/customer`、`/master/site`、`/master/line`、`/master/warehouse`、`/master/pallet`。
|
|
||||||
- 业务:`/business/inbound`、`/business/filling`、`/business/shipment`、`/business/usage`、`/business/return`。
|
|
||||||
- 报表:`/report/pallet-inventory`、`/report/filling`、`/report/shipment`、`/report/consumption`、`/report/return`、`/report/pallet-trace`。
|
|
||||||
|
|
||||||
各业务 Controller 提供自己的扫码查询接口,避免现场操作员被迫获得托盘主数据管理权限。所有写接口由后端重新查询当前状态,不信任前端提交的库存、位置或状态。
|
|
||||||
|
|
||||||
### 8.4 角色
|
|
||||||
|
|
||||||
- 不新增固定业务角色。
|
|
||||||
- 不写入新增菜单对应的普通角色种子。
|
|
||||||
- 超级管理员沿用现有特例获得全部菜单和数据。
|
|
||||||
- 其他用户通过现有角色管理分配菜单和按钮,并通过仓库/客户现场页面分配数据范围。
|
|
||||||
- 角色授权必须包含“系统管理 → 分组目录 → 页面 → 按钮”的完整祖先链。
|
|
||||||
|
|
||||||
## 9. Web 页面行为
|
|
||||||
|
|
||||||
### 9.1 基础资料
|
|
||||||
|
|
||||||
- 沿用现有搜索、分页、表格和弹窗表单风格。
|
|
||||||
- 仓库和客户现场页面提供“分配用户”。
|
|
||||||
- 托盘页面提供二维码生成、查看、打印和补打。
|
|
||||||
- 被引用数据只允许停用;未引用数据才显示删除操作。
|
|
||||||
|
|
||||||
### 9.2 PDA Web
|
|
||||||
|
|
||||||
- 页面使用大尺寸输入区和操作按钮,适配 Android PDA 浏览器。
|
|
||||||
- 扫码输入框在成功、失败和页面恢复后重新聚焦。
|
|
||||||
- 回车触发扫码查询,重复扫码给出明确提示。
|
|
||||||
- 使用 `crypto.randomUUID()` 生成请求幂等键,不新增前端 UUID 依赖。
|
|
||||||
- 前端展示后端返回的状态和允许动作,不自行推算业务状态。
|
|
||||||
|
|
||||||
### 9.3 报表
|
|
||||||
|
|
||||||
六个独立页面只提供查询、筛选和分页:
|
|
||||||
|
|
||||||
- 托盘库存:当前状态、位置、菌种、批次、初始包数和剩余包数。
|
|
||||||
- 装填记录:装填时间、仓库、托盘、菌种、批次、规格和包数。
|
|
||||||
- 发货出库:发货单、客户现场、托盘和发货时余量。
|
|
||||||
- 产线消耗:客户、现场、产线、托盘、菌种、批次和使用包数。
|
|
||||||
- 退回仓库:退回申请、目标仓库、托盘、余量和确认时间。
|
|
||||||
- 托盘追溯:按事件时间展示托盘完整状态、位置和数量变化。
|
|
||||||
|
|
||||||
筛选条件从日期、仓库、客户、现场、产线、菌种、批次、托盘编号和状态中按页面需要选取。本次不提供 Excel 导出。
|
|
||||||
|
|
||||||
## 10. AI 管理与外链菜单清理
|
|
||||||
|
|
||||||
### 10.1 删除范围
|
|
||||||
|
|
||||||
- 删除后端 `module_ai` 全部源码。
|
|
||||||
- 删除 `utils/ai_util.py` 和仅被 AI 使用的 `utils/crypto_util.py`。
|
|
||||||
- 删除 Web `src/api/ai`、`src/views/ai` 和三个 AI 图标。
|
|
||||||
- 删除 13 个 `/ai/*` 接口及 `ai:model:*`、`ai:chat:*` 权限。
|
|
||||||
- 删除 AI 专属缓存命名空间、限流常量和 LiteLLM 日志配置。
|
|
||||||
- 从后端 requirements 删除 Agno 和模型提供商 SDK。
|
|
||||||
- 从前端 `package.json` 删除仅供 AI 使用的 Markdown、Monaco、UUID 等依赖,并删除 Monaco Vite 配置。
|
|
||||||
- README 删除当前 AI 功能说明;CHANGELOG 保留历史新增记录并增加移除记录。
|
|
||||||
|
|
||||||
### 10.2 保留范围
|
|
||||||
|
|
||||||
- 认证、JWT、接口权限、数据范围、自动路由扫描、缓存、日志、限流和通用上传。
|
|
||||||
- `utils/transport_crypto_util.py`。
|
|
||||||
- `@vueuse/core`、Pillow、PyJWT、cryptography 等共享依赖。
|
|
||||||
- 通用 API Key 日志脱敏测试。
|
|
||||||
- 导航栏独立“源码地址”和“文档地址”入口。
|
|
||||||
|
|
||||||
### 10.3 数据库残留策略
|
|
||||||
|
|
||||||
- 两套初始化脚本删除 AI 菜单、角色关联、AI 字典和 AI 表 DDL,确保新环境不再创建 AI 功能。
|
|
||||||
- MySQL 增量补丁删除 AI 菜单元数据、AI 字典元数据和“施尔丰仓库”菜单,但不执行。
|
|
||||||
- 增量补丁不得包含 `DROP TABLE ai_models`、`DROP TABLE ai_chat_config` 或任何 Agno 表删除语句。
|
|
||||||
- 现有 AI 表、行数、敏感配置和备份需求在最终交付中单独列出,后续获得明确确认后再清理。
|
|
||||||
|
|
||||||
## 11. SQL 交付策略
|
|
||||||
|
|
||||||
### 11.1 初始化脚本
|
|
||||||
|
|
||||||
MySQL 和 PostgreSQL 初始化脚本保持语义一致:
|
|
||||||
|
|
||||||
- 删除 AI 和外链菜单种子。
|
|
||||||
- 删除 AI 字典及 AI 表定义。
|
|
||||||
- 新增业务表、唯一约束、检查约束和索引。
|
|
||||||
- 新增三个目录、十一个业务/主数据页面、六个报表页面及按钮权限。
|
|
||||||
- 不重新编号现有无关菜单、字典或序列。
|
|
||||||
- 不给普通角色增加 `sys_role_menu` 记录。
|
|
||||||
|
|
||||||
### 11.2 MySQL 增量补丁
|
|
||||||
|
|
||||||
- 文件名使用日期和业务含义,作为一次性、可审查补丁。
|
|
||||||
- DDL 使用明确表名;菜单删除使用已审计的明确 ID,禁止通配删除。
|
|
||||||
- DDL 与菜单 DML 分节书写,明确 MySQL DDL 隐式提交边界。
|
|
||||||
- 包含业务表创建、菜单与权限插入、AI 元数据和菜单 ID 99 清理。
|
|
||||||
- 不连接、不执行本地 MySQL。
|
|
||||||
- 补丁应用后的 Redis 菜单、用户信息和 AI 字典缓存清理作为部署步骤记录,不在本次自动执行。
|
|
||||||
|
|
||||||
## 12. 错误、并发与审计
|
|
||||||
|
|
||||||
- 认证失败、功能越权和数据范围越权沿用项目现有异常与 403 处理。
|
|
||||||
- 非法数量、资源不存在、托盘状态冲突或单据状态冲突必须返回失败,不得伪成功。
|
|
||||||
- 所有确认、使用和退回请求使用唯一幂等键。
|
|
||||||
- 状态变更使用数据库行锁;多托盘按托盘 ID 排序加锁以降低死锁概率。
|
|
||||||
- `biz_pallet_inventory.version` 用于并发版本校验。
|
|
||||||
- `biz_pallet_event` 只追加、不修改、不删除;`sys_oper_log` 只作为补充审计,不能替代业务追溯。
|
|
||||||
- 已确认单据不可编辑或删除,本次不实现冲销或补偿事件入口。
|
|
||||||
|
|
||||||
## 13. 验证与验收
|
|
||||||
|
|
||||||
### 13.1 后端
|
|
||||||
|
|
||||||
- 运行 `ruff` 和相关 `pytest`。
|
|
||||||
- 验证应用可以导入,OpenAPI 中不存在 `/ai/*`。
|
|
||||||
- 覆盖状态机合法/非法迁移、整数数量边界、超用、幂等、数据范围和 403。
|
|
||||||
- 覆盖入库、装填、发货、使用、退回的事务回滚行为。
|
|
||||||
- 验证二维码生成接口输出有效图形。
|
|
||||||
|
|
||||||
### 13.2 Web
|
|
||||||
|
|
||||||
- 运行项目可用的 lint/check 命令和生产构建。
|
|
||||||
- 检查所有按钮权限和请求 URL 与后端一致。
|
|
||||||
- 检查 PDA 扫码输入、自动聚焦、重复提交和错误展示。
|
|
||||||
- 确认 `shierfeng-fastapi-app` 没有本次任务产生的改动。
|
|
||||||
|
|
||||||
### 13.3 静态和 SQL
|
|
||||||
|
|
||||||
- 使用 `rg` 检查 AI 页面、接口、权限、依赖和配置残留。
|
|
||||||
- 对比 MySQL、PostgreSQL 初始化脚本中的业务表和权限集合。
|
|
||||||
- 检查 MySQL 增量补丁不包含 AI 业务表删除。
|
|
||||||
- 检查菜单组件路径均对应真实 Web 页面。
|
|
||||||
|
|
||||||
### 13.4 本轮无法完成的运行态验收
|
|
||||||
|
|
||||||
由于用户选择只生成而不执行 MySQL 补丁,本轮不能真实验证:
|
|
||||||
|
|
||||||
- 业务表在 MySQL 中的实际建表结果。
|
|
||||||
- 运行态 `/getRouters` 是否返回新增菜单并移除旧菜单。
|
|
||||||
- 不同真实角色和仓库/现场授权数据下的完整端到端流程。
|
|
||||||
- 补丁执行后的 Redis 缓存失效行为。
|
|
||||||
|
|
||||||
这些项目必须在用户后续审查并应用补丁后执行,交付时不得表述为已通过。
|
|
||||||
|
|
||||||
## 14. 实施顺序
|
|
||||||
|
|
||||||
1. 保护现有未提交改动并建立验证基线。
|
|
||||||
2. 删除 AI 专属代码、配置、依赖和外链菜单种子。
|
|
||||||
3. 实现主数据、用户授权、二维码和状态机基础。
|
|
||||||
4. 实现首次入库、装填、发货、现场使用和两阶段退回。
|
|
||||||
5. 实现六类只读报表和托盘追溯。
|
|
||||||
6. 同步两套初始化脚本并生成不执行的 MySQL 增量补丁。
|
|
||||||
7. 执行后端、Web、权限、静态和 SQL 验证。
|
|
||||||
8. 交付修改清单、验证证据、AI 数据库残留和补丁应用后验收项。
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
# 业务菜单提升为一级菜单设计
|
|
||||||
|
|
||||||
## 目标
|
|
||||||
|
|
||||||
将“基础资料维护”、“业务管理”、“报表查询”从“系统管理”下提升为独立一级菜单,使业务入口与系统管理入口在侧边栏中并列展示。
|
|
||||||
|
|
||||||
## 目标层级与顺序
|
|
||||||
|
|
||||||
一级菜单按以下顺序展示:
|
|
||||||
|
|
||||||
1. 基础资料维护(`menu_id=121`)
|
|
||||||
2. 业务管理(`menu_id=122`)
|
|
||||||
3. 报表查询(`menu_id=123`)
|
|
||||||
4. 系统管理(`menu_id=1`)
|
|
||||||
5. 系统监控(`menu_id=2`)
|
|
||||||
6. 系统工具(`menu_id=3`)
|
|
||||||
|
|
||||||
对应的持久化字段为:
|
|
||||||
|
|
||||||
| 菜单 ID | 菜单名称 | `parent_id` | `order_num` |
|
|
||||||
|---|---|---:|---:|
|
|
||||||
| 121 | 基础资料维护 | 0 | 1 |
|
|
||||||
| 122 | 业务管理 | 0 | 2 |
|
|
||||||
| 123 | 报表查询 | 0 | 3 |
|
|
||||||
| 1 | 系统管理 | 0 | 4 |
|
|
||||||
| 2 | 系统监控 | 0 | 5 |
|
|
||||||
| 3 | 系统工具 | 0 | 6 |
|
|
||||||
|
|
||||||
## 架构与改动边界
|
|
||||||
|
|
||||||
项目的 Web 路由和侧边栏由后端 `/getRouters` 根据 `sys_menu` 动态生成,因此应修改菜单数据,不在前端增加拍平或重排逻辑。
|
|
||||||
|
|
||||||
本次仅调整六个目录菜单的层级和排序:
|
|
||||||
|
|
||||||
- 保持业务子菜单、组件路径、API 和权限标识不变。
|
|
||||||
- 保持角色菜单关联不变。
|
|
||||||
- 不修改 APP 端。
|
|
||||||
- 不新增依赖,不改动现有动态路由机制。
|
|
||||||
|
|
||||||
## SQL 与迁移设计
|
|
||||||
|
|
||||||
1. 同步修改 MySQL 和 PostgreSQL 初始化 SQL,使新建数据库直接得到目标层级。
|
|
||||||
2. 保留已执行的 `20260724_pallet_workflow_mysql.sql` 历史补丁,不改写已落库迁移的语义。
|
|
||||||
3. 新增一个 MySQL 增量补丁,同时支持“调整前”和“已调整”两种合法状态,保证可幂等重跑。
|
|
||||||
4. 增量补丁在第一条永久 DML 前校验六个固定 ID 的菜单身份和允许的层级状态。任一 ID 缺失、被复用或稳定字段异常时,在写入前中止。
|
|
||||||
5. 六条更新置于显式事务中,只修改 `parent_id` 和 `order_num`;执行器不得使用 `--force` 或 continue-on-error 模式。
|
|
||||||
6. 补丁末尾输出六个目录的实际层级和排序,用于人工核对。
|
|
||||||
|
|
||||||
## 缓存与运行态
|
|
||||||
|
|
||||||
数据库更新后,不使用 Redis `FLUSHALL`。本地验证通过重新登录触发现有登录缓存失效逻辑,并使用独立查询参数核对 `/getRouters` 的新层级。
|
|
||||||
|
|
||||||
## 测试与验收
|
|
||||||
|
|
||||||
- 先增加失败契约,要求 MySQL/PostgreSQL 初始化 SQL 定义上述六个一级菜单顺序。
|
|
||||||
- 增加增量补丁契约,覆盖写前校验、幂等性、显式事务、精确更新范围和事后查询。
|
|
||||||
- 运行后端 SQL 契约、业务测试、Ruff 检查、前端业务契约和生产构建。
|
|
||||||
- 数据库执行前重新创建备份,并只有在用户再次明确确认后才执行增量补丁。
|
|
||||||
- 数据库验收必须确认六个目录均为 `parent_id=0`,排序为 `1..6`,业务子菜单数量、页面组件和权限标识不变。
|
|
||||||
|
|
||||||
## 不在本次范围内
|
|
||||||
|
|
||||||
- 业务页面的功能、样式或交互调整。
|
|
||||||
- 普通角色的新授权或仓库/现场数据映射。
|
|
||||||
- 历史 AI 数据库表或其他数据清理。
|
|
||||||
- Redis 全库清理。
|
|
||||||
@@ -1,179 +0,0 @@
|
|||||||
# PDA 托盘业务操作功能补全设计
|
|
||||||
|
|
||||||
## 1. 背景与目标
|
|
||||||
|
|
||||||
当前仓库已经具备 Web 后台、FastAPI 业务接口、托盘库存状态机、数据库结构、权限模型和六类报表。`shierfeng-fastapi-app` 目前只有通用登录、首页、工作台和个人中心,没有托盘业务操作页面与对应 API 封装。
|
|
||||||
|
|
||||||
本次在不改变既有后端业务契约的前提下,补齐 uni-app PDA 操作端的现场业务功能。PDA 暂不生成 APK,先完成页面、接口对接、扫码交互、权限控制和可验证的开发运行版本。
|
|
||||||
|
|
||||||
## 2. 范围确认
|
|
||||||
|
|
||||||
### 2.1 本次包含
|
|
||||||
|
|
||||||
- 复用现有 `/login`、`/getInfo`、`/logout` 认证流程。
|
|
||||||
- 在 `shierfeng-fastapi-app` 增加五类现场操作:
|
|
||||||
- 仓库入库
|
|
||||||
- 工厂装填
|
|
||||||
- 发货出库
|
|
||||||
- 客户现场使用
|
|
||||||
- 退回仓库
|
|
||||||
- 增加 PDA 端 API 模块、扫码输入组件、业务页面、权限显示和错误/重试处理。
|
|
||||||
- 复用后端已有状态机、幂等键、数据范围、库存事务和托盘追溯,不在 PDA 前端自行计算最终库存或状态。
|
|
||||||
- 适配 PDA 扫码头的 HID 键盘输入和回车提交,并保留手工输入作为故障兜底。
|
|
||||||
- 增加 PDA 端静态契约测试和 H5/开发构建验证;不生成 APK。
|
|
||||||
- 继续使用 Web 后台维护菌种、客户、现场、产线、仓库、托盘和六类报表。
|
|
||||||
|
|
||||||
### 2.2 本次不包含
|
|
||||||
|
|
||||||
- 不打包、签名、安装或发布 APK。
|
|
||||||
- 不调用摄像头扫码,不新增原生扫码 SDK;当前以 HID 扫码枪输入为主。
|
|
||||||
- 不把基础资料维护和六类报表复制到 PDA。
|
|
||||||
- 不修改现有 FastAPI 业务接口的请求/响应契约,除非实现阶段发现有明确且可验证的 PDA 阻塞缺口。
|
|
||||||
- 不修改 `shierfeng-fastapi-frontend` 的既有 Web 业务页面,除非共享契约缺陷直接阻塞 PDA。
|
|
||||||
- 不修改 `.env.dev`、`.env.prod`、前端环境文件、用户已有 APP 改动或无关缓存。
|
|
||||||
- 不执行生产部署、服务器配置、Redis 清理、数据库迁移或培训;这些属于后续运行交付,需要单独的环境授权和验收。
|
|
||||||
- 不把管理员密码写入源码、设计文档、日志或测试固定文本。
|
|
||||||
|
|
||||||
## 3. 用户角色与权限边界
|
|
||||||
|
|
||||||
PDA 页面只展示当前用户拥有的权限,后端接口权限和仓库/现场数据范围仍是最终权威:
|
|
||||||
|
|
||||||
| 角色能力 | PDA 操作 |
|
|
||||||
|---|---|
|
|
||||||
| 仓库操作员 | 查看可访问仓库、创建/确认入库、扫描装填、创建/确认发货、确认退回 |
|
|
||||||
| 客户现场操作员 | 扫描托盘、首次选择产线、录入使用包数、发起退回 |
|
|
||||||
| 业务管理员/超级管理员 | 依据既有权限可执行全部授权操作 |
|
|
||||||
|
|
||||||
不新增固定角色,不自动给普通用户授权。仓库与客户现场的数据范围继续由现有用户-仓库、用户-现场关系决定。
|
|
||||||
|
|
||||||
## 4. 页面与 API 设计
|
|
||||||
|
|
||||||
### 4.1 PDA 页面
|
|
||||||
|
|
||||||
新增页面建议采用以下路径,沿用当前 uni-app 页面路由和 Tailwind 样式:
|
|
||||||
|
|
||||||
```text
|
|
||||||
src/pages/business/inbound/index.vue
|
|
||||||
src/pages/business/filling/index.vue
|
|
||||||
src/pages/business/shipment/index.vue
|
|
||||||
src/pages/business/usage/index.vue
|
|
||||||
src/pages/business/return/index.vue
|
|
||||||
```
|
|
||||||
|
|
||||||
工作台只增加实际权限允许的业务入口,不保留“建设中”假入口。页面加载失败、权限不足和接口异常必须给出可操作提示。
|
|
||||||
|
|
||||||
### 4.2 PDA API 封装
|
|
||||||
|
|
||||||
复用后台已有接口路径,在 `src/api/business/` 增加:
|
|
||||||
|
|
||||||
```text
|
|
||||||
inbound.js
|
|
||||||
filling.js
|
|
||||||
shipment.js
|
|
||||||
usage.js
|
|
||||||
return.js
|
|
||||||
```
|
|
||||||
|
|
||||||
每个模块覆盖对应的列表、详情、选项、扫码、创建/编辑/删除、确认或提交接口;请求字段使用后端既有 camelCase 契约,不在前端另建同义字段。
|
|
||||||
|
|
||||||
### 4.3 共享扫码组件
|
|
||||||
|
|
||||||
新增 PDA 专用扫码输入组件,职责仅限于输入采集和规范化:
|
|
||||||
|
|
||||||
- 自动聚焦可用输入框。
|
|
||||||
- 兼容 HID 扫码枪逐字符输入后回车提交。
|
|
||||||
- 去除首尾空白,拒绝空值。
|
|
||||||
- 防止同一托盘在短时间内重复追加。
|
|
||||||
- 扫码请求期间锁定相关输入,避免并发提交。
|
|
||||||
- 支持“重新扫描”和手工输入兜底。
|
|
||||||
- 不在组件内决定托盘状态、库存数量或权限结果。
|
|
||||||
|
|
||||||
## 5. 五类业务流程
|
|
||||||
|
|
||||||
### 5.1 入库
|
|
||||||
|
|
||||||
选择后端返回的可用仓库,创建草稿并连续扫描 `UNSTOCKED` 托盘;允许移除草稿明细,确认时复用业务幂等键。提交成功后以服务端结果刷新页面,不由 PDA 推算库存。
|
|
||||||
|
|
||||||
### 5.2 装填
|
|
||||||
|
|
||||||
扫描托盘并展示后端返回的仓库、状态和当前余量;选择菌种,填写批次、规格和正整数包数;提交后清理表单并重新获取托盘状态。非法状态、超容量、无仓库权限由后端拒绝并原样转为用户可读提示。
|
|
||||||
|
|
||||||
### 5.3 发货
|
|
||||||
|
|
||||||
选择来源仓库和目标客户现场,连续扫描多个可发货托盘;展示菌种、批次和剩余包数只读信息;确认前复核托盘集合,服务端负责整单锁定、库存扣减和事件追加。
|
|
||||||
|
|
||||||
### 5.4 客户现场使用
|
|
||||||
|
|
||||||
扫描托盘后展示菌种、批次、当前余量和允许操作;首次使用要求选择当前现场产线,后续使用沿用后端锁定产线;使用包数必须为正整数且不超过服务端返回余量。成功后只采用服务端返回的新余量和状态。
|
|
||||||
|
|
||||||
### 5.5 退回仓库
|
|
||||||
|
|
||||||
客户现场扫描待退回托盘,选择目标仓库并发起退回;仓库用户扫描并确认收货。申请和确认分别持有独立幂等键,页面分别保存两阶段状态,确认后以服务端返回的库存状态刷新。
|
|
||||||
|
|
||||||
## 6. 认证、密码与安全
|
|
||||||
|
|
||||||
- PDA 继续使用当前 JWT、传输加密和 `/getInfo` 权限信息。
|
|
||||||
- 前端不硬编码管理员密码;给定账号只用于经授权的本地联调验证。
|
|
||||||
- 当前登录页中的旧默认密码预填值需要改为不暴露密码的空表单或开发环境专用行为,不能把真实密码写入仓库。
|
|
||||||
- 管理员密码变更属于账号凭据写操作,须先只读核对当前认证存储,再单独确认、备份并执行,日志不得输出密码、Token 或 Cookie。
|
|
||||||
- PDA 页面隐藏不能替代后端权限校验;所有业务请求继续经过后端接口权限和数据范围检查。
|
|
||||||
|
|
||||||
## 7. 状态、幂等与错误处理
|
|
||||||
|
|
||||||
- PDA 只提交业务输入和幂等键,不提交目标库存、目标状态或版本号。
|
|
||||||
- 网络超时、响应丢失或用户重试时复用同一个业务幂等键;同键不同请求内容显示冲突,不自动生成新业务操作。
|
|
||||||
- 扫码重复、按钮重复点击和页面切换期间的旧响应由前端请求序列号/锁控制。
|
|
||||||
- 401 继续走现有会话过期处理;403、业务状态冲突、库存不足和数据范围错误必须显示后端消息并允许安全重试。
|
|
||||||
- 页面恢复或重新进入时,以详情/列表接口作为唯一权威,不能相信本地缓存的库存和状态。
|
|
||||||
|
|
||||||
## 8. 验证与交付
|
|
||||||
|
|
||||||
### 8.1 代码验证
|
|
||||||
|
|
||||||
- 为 PDA API 路径、字段映射、权限入口、扫码规范化、幂等键复用和五类页面交互增加 Node 20 契约测试。
|
|
||||||
- 使用现有后端业务测试和 Ruff 验证共享接口没有回归。
|
|
||||||
- 运行 uni-app 的 H5/开发构建或等价编译检查;不执行 `build:app`,不生成 APK。
|
|
||||||
- 对当前工作区做精确 diff 检查,保留用户已有 APP、环境、日志和缓存改动。
|
|
||||||
|
|
||||||
### 8.2 人工验收清单
|
|
||||||
|
|
||||||
1. 使用管理员和受限普通用户分别登录。
|
|
||||||
2. 验证未授权菜单不显示、直接接口请求返回 403。
|
|
||||||
3. 使用 HID 扫码枪验证五类业务的扫码、回车、重复扫码和错误重试。
|
|
||||||
4. 验证库存、剩余包数、产线绑定、退回冻结和事件追溯均以后端结果为准。
|
|
||||||
5. 验证页面刷新/断网重试不重复扣减库存。
|
|
||||||
|
|
||||||
真实服务器部署、APK 安装、客户培训和跨设备实测在本次代码补全后仍需单独安排,不能用本地构建结果替代。
|
|
||||||
|
|
||||||
## 9. 当前基线与风险
|
|
||||||
|
|
||||||
- Web/FastAPI 核心业务已存在并有业务测试;本次重点是 uni-app PDA 缺失能力。
|
|
||||||
- 当前 PDA 工程已包含通用登录、首页、工作台、个人中心,以及入库、装填、发货、现场使用、退回五类业务页面和对应 API 模块。
|
|
||||||
- 后端接口、Web 管理页面和数据库 SQL 已存在;PDA 的实际设备联调、服务器访问地址、数据库迁移和真实角色授权仍需运行环境配合。
|
|
||||||
- APK 暂不打包,因此本次交付物是源码、接口封装、页面和可验证开发版本,不包含安装包。
|
|
||||||
|
|
||||||
## 10. 需求覆盖矩阵(代码审计结果)
|
|
||||||
|
|
||||||
下表区分“代码已实现”和“真实环境已交付”,避免把静态测试或本地构建误认为部署、安装或培训完成。
|
|
||||||
|
|
||||||
| 序号 | 需求 | 当前结论 | 主要证据 |
|
|
||||||
| ---: | --- | --- | --- |
|
|
||||||
| 1 | 业务流程、功能边界、角色、交付内容和不包含事项 | 已确认 | 本设计第 1~3、8~9 节 |
|
|
||||||
| 2 | 托盘、菌种、产线、仓库、装填、发货、使用、退回字段 | 已梳理 | `module_business/entity`、SQL 脚本 |
|
|
||||||
| 3 | 后台、接口、数据库结构和基础运行环境 | 代码已完成;实际环境未部署 | `module_business`、`sql/`、前后端工程 |
|
|
||||||
| 4 | 菌种、产线、仓库、用户等基础资料维护 | 已实现 | Web `views/master`、系统用户/角色模块 |
|
|
||||||
| 5 | 托盘唯一标识、固定二维码、状态和档案 | 已实现 | `biz_pallet` 唯一约束、状态机、托盘管理页 |
|
|
||||||
| 6 | 入库登记、入库单、库存更新 | 已实现 | `inbound_controller.py`、`inbound_service.py` |
|
|
||||||
| 7 | 扫码装填菌种、批次、规格、包数并更新状态 | 已实现 | `filling_service.py`、Web/PDA 装填页 |
|
|
||||||
| 8 | 发货单、托盘扫码/选择、明细和库存扣减 | 已实现 | `shipment_service.py`、Web/PDA 发货页 |
|
|
||||||
| 9 | PDA 登录、扫码识别和读取菌种/余量 | 已实现;未打包 APK | `shierfeng-fastapi-app/src/pages/business`、PDA API |
|
|
||||||
| 10 | 客户扫码、产线绑定、使用包数、操作人和时间 | 已实现 | `usage_service.py`、使用记录模型和页面 |
|
|
||||||
| 11 | 全部/部分使用、剩余包数、退回和状态流转 | 已实现 | `pallet_state_machine.py`、使用/退回服务 |
|
|
||||||
| 12 | 六类库存、装填、发货、消耗、退回、追溯报表 | 已实现 | `report_controller.py`、Web 六类报表页 |
|
|
||||||
| 13 | 权限、操作记录、流转追溯和异常留痕 | 已实现 | 权限依赖、`Log`、`biz_pallet_event`、追溯报表 |
|
|
||||||
| 14 | Android 页面、接口、PDA 适配和 APK | 页面/API/HID 已实现;APK 按要求暂缓 | PDA H5 构建与扫码组件 |
|
|
||||||
| 15 | 后台、接口、PDA、库存、退回整体联调 | 代码级验证完成;真实设备联调未完成 | 契约测试通过;缺少真实设备/服务地址 |
|
|
||||||
| 16 | 服务器、数据库、后台/接口服务和访问地址部署 | 未完成 | 缺少目标服务器和部署授权 |
|
|
||||||
| 17 | App 安装、扫码验收和客户培训 | 未完成 | 缺少 PDA 设备及培训安排 |
|
|
||||||
|
|
||||||
登录页默认只填充用户名 `admin`;密码保持空白并由操作员手工输入,不将真实密码写入源码、测试或日志。
|
|
||||||
@@ -1,298 +0,0 @@
|
|||||||
# 测试数据批次隔离与级联清理设计
|
|
||||||
|
|
||||||
## 1. 背景
|
|
||||||
|
|
||||||
当前菌种、客户、客户现场、产线、仓库和托盘等主数据在被业务单据引用后不允许删除。该约束能保护正式业务的外键完整性、库存状态、报表口径和托盘追溯链,但也导致开发、联调和验收期间产生的测试数据无法安全清理。
|
|
||||||
|
|
||||||
本设计引入“测试数据批次”,将正式数据与测试数据从创建、查询、业务操作到报表统计全程隔离。超级管理员可在预览完整影响范围后整批清理测试数据;正式数据在任何情况下都不能通过该能力物理删除。
|
|
||||||
|
|
||||||
## 2. 目标与非目标
|
|
||||||
|
|
||||||
### 2.1 目标
|
|
||||||
|
|
||||||
- 以测试批次为边界隔离正式数据和测试数据。
|
|
||||||
- 支持授权的普通用户在指定测试批次内完成入库、装填、发货、使用和退回流程。
|
|
||||||
- 支持超级管理员将升级前已有的旧测试数据完整纳入测试批次。
|
|
||||||
- 支持关闭批次后预览影响范围,并在单个数据库事务中整批清理。
|
|
||||||
- 保留批次元数据和操作审计,但不保留已清理的测试业务明细。
|
|
||||||
- 防止前端绕过、权限误配、并发请求或部分失败导致正式数据被删或测试链路残缺。
|
|
||||||
|
|
||||||
### 2.2 非目标
|
|
||||||
|
|
||||||
- 不允许按单条主数据或单据强制级联删除。
|
|
||||||
- 不允许将正在进行的批次直接清理。
|
|
||||||
- 不用测试清理代替正式业务的停用、作废、冲销或审计流程。
|
|
||||||
- 不根据名称、编码、创建人或时间自动猜测旧数据是否为测试数据。
|
|
||||||
- 不在本次实施中直接运行生产数据库迁移或清理。
|
|
||||||
|
|
||||||
## 3. 角色与权限边界
|
|
||||||
|
|
||||||
| 能力 | 超级管理员 | 已授权测试用户 | 其他用户 |
|
|
||||||
| --- | --- | --- | --- |
|
|
||||||
| 查看测试批次管理 | 允许 | 不允许 | 不允许 |
|
|
||||||
| 创建、关闭、重新开启批次 | 允许 | 不允许 | 不允许 |
|
|
||||||
| 授权批次测试用户 | 允许 | 不允许 | 不允许 |
|
|
||||||
| 创建批次内测试主数据 | 允许 | 不允许 | 不允许 |
|
|
||||||
| 进入已授权批次执行业务 | 允许 | 允许 | 不允许 |
|
|
||||||
| 将旧数据纳入批次 | 允许 | 不允许 | 不允许 |
|
|
||||||
| 预览并整批清理 | 允许 | 不允许 | 不允许 |
|
|
||||||
| 物理删除正式数据 | 不允许 | 不允许 | 不允许 |
|
|
||||||
|
|
||||||
超级管理员以后端 `current_user.user.admin` 为最终判断,不仅依赖前端角色或菜单权限。测试批次接口可同时使用独立权限字符控制菜单展示,但权限字符被误分配给普通角色时,后端仍必须返回 403。
|
|
||||||
|
|
||||||
## 4. 数据模型
|
|
||||||
|
|
||||||
### 4.1 测试批次
|
|
||||||
|
|
||||||
新增 `biz_test_batch`,至少包含:
|
|
||||||
|
|
||||||
- `batch_id`:主键。
|
|
||||||
- `batch_code`:系统生成的唯一编码。
|
|
||||||
- `batch_name`:用于界面识别与二次确认。
|
|
||||||
- `status`:`ACTIVE`、`CLOSED`、`PURGED`。
|
|
||||||
- `create_by`、`create_time`、`update_by`、`update_time`。
|
|
||||||
- `closed_by`、`closed_at`、`purged_by`、`purged_at`。
|
|
||||||
- `purge_summary`:保留按数据类型汇总的清理数量,不保留敏感业务内容。
|
|
||||||
- `remark`:批次用途说明。
|
|
||||||
|
|
||||||
新增 `biz_test_batch_user`,保存批次与参与测试用户的关联。该关联只是批次的外层访问权;现有用户-仓库、用户-现场数据范围仍然生效。
|
|
||||||
|
|
||||||
### 4.2 业务数据标记
|
|
||||||
|
|
||||||
以下表新增可空 `test_batch_id` 和索引,并外键引用 `biz_test_batch.batch_id`:
|
|
||||||
|
|
||||||
- 主数据:`biz_strain`、`biz_customer`、`biz_customer_site`、`biz_production_line`、`biz_warehouse`、`biz_pallet`。
|
|
||||||
- 入库:`biz_inbound_order`、`biz_inbound_item`。
|
|
||||||
- 装填:`biz_filling_record`。
|
|
||||||
- 发货:`biz_shipment_order`、`biz_shipment_item`。
|
|
||||||
- 使用:`biz_usage_record`。
|
|
||||||
- 退回:`biz_return_order`、`biz_return_item`。
|
|
||||||
- 库存与追溯:`biz_pallet_inventory`、`biz_pallet_event`。
|
|
||||||
|
|
||||||
`test_batch_id IS NULL` 表示正式数据;非空表示所属测试批次。该字段不允许普通业务请求直接写入,由后端从已验证的当前模式或关联记录中派生。
|
|
||||||
|
|
||||||
`biz_user_warehouse` 和 `biz_user_site` 不重复保存 `test_batch_id`,其数据归属由所关联的仓库或现场派生。批次清理时,必须先删除指向该批次仓库和现场的用户关联。
|
|
||||||
|
|
||||||
### 4.3 一致性约束
|
|
||||||
|
|
||||||
- 正式数据只能引用正式数据。
|
|
||||||
- 测试数据只能引用同一批次的测试数据。
|
|
||||||
- 不同测试批次之间不能互相引用。
|
|
||||||
- 批次标记一旦创建不能通过通用编辑接口修改。
|
|
||||||
- 只有“纳入测试批次”专用流程可将旧的无标记数据一次性改为测试数据。
|
|
||||||
- 关联对象的批次一致性由服务层在写入前校验,数据库外键作为存在性和删除顺序的最后保护。
|
|
||||||
- 现有编码、单号和二维码唯一约束继续全局生效;测试数据使用独立编码,清理后可重新使用。
|
|
||||||
|
|
||||||
## 5. 数据模式与查询隔离
|
|
||||||
|
|
||||||
### 5.1 模式选择
|
|
||||||
|
|
||||||
Web 管理端和 PDA 操作端都需支持:
|
|
||||||
|
|
||||||
- 正式模式:不传测试批次上下文,后端只允许 `test_batch_id IS NULL` 的数据。
|
|
||||||
- 测试模式:携带当前 `batch_id`。已授权用户只能进入 `ACTIVE` 批次;超级管理员可在批次管理页以只读方式检查 `CLOSED` 批次。任何写入都要求批次为 `ACTIVE`。
|
|
||||||
|
|
||||||
前端可通过统一请求头传递当前批次,但该值只是请求上下文,不是信任根。后端必须每次验证用户授权、批次状态和数据归属。
|
|
||||||
|
|
||||||
### 5.2 隔离范围
|
|
||||||
|
|
||||||
批次条件必须应用于:
|
|
||||||
|
|
||||||
- 六类基础资料的列表、详情和选项。编码、单号和二维码的唯一性校验仍按全局数据执行,与现有数据库唯一约束保持一致。
|
|
||||||
- 入库、装填、发货、使用和退回的列表、详情、扫码、创建、修改和确认。
|
|
||||||
- 仓库、现场、产线、菌种和托盘等业务选项接口。
|
|
||||||
- 托盘库存、装填、发货、消耗、退回和追溯六类报表。
|
|
||||||
- 首页仓储运营指标、待处理数量、趋势图和状态分布。
|
|
||||||
|
|
||||||
任何缺失批次条件的查询都可能造成测试数据污染正式报表,实施时必须对所有业务 DAO 做完整盘点。
|
|
||||||
|
|
||||||
## 6. 批次生命周期
|
|
||||||
|
|
||||||
```text
|
|
||||||
ACTIVE --关闭--> CLOSED --重新开启--> ACTIVE
|
|
||||||
|
|
|
||||||
+--预览并确认清理--> PURGED
|
|
||||||
```
|
|
||||||
|
|
||||||
- `ACTIVE`:允许超级管理员创建测试主数据,允许已授权用户执行业务。
|
|
||||||
- `CLOSED`:所有测试数据只读;可查看、预览清理范围、重新开启或清理。
|
|
||||||
- `PURGED`:批次业务数据已删除;仅保留批次元数据和审计汇总,不能重新开启。
|
|
||||||
|
|
||||||
关闭、重新开启和清理都需锁定批次记录。每个测试写操作在业务数据加锁前必须重新校验批次仍为 `ACTIVE`,保证“关闭成功后无新写入”。
|
|
||||||
|
|
||||||
## 7. 新测试数据创建与业务继承
|
|
||||||
|
|
||||||
1. 超级管理员创建批次,分配参与测试的用户。
|
|
||||||
2. 超级管理员切换到该批次,创建菌种、客户、现场、产线、仓库和托盘。
|
|
||||||
3. 后端根据当前批次自动写入 `test_batch_id`,忽略或拒绝请求体中伪造的批次字段。
|
|
||||||
4. 已授权用户进入该批次,使用批次内的仓库、现场、产线、菌种和托盘执行业务。
|
|
||||||
5. 入库单、装填记录、发货单、使用记录、退回单、库存和事件由后端自动继承同一 `test_batch_id`。
|
|
||||||
6. 任一关联数据的批次不一致时,整个业务操作失败并回滚。
|
|
||||||
|
|
||||||
## 8. 旧数据纳入测试批次
|
|
||||||
|
|
||||||
### 8.1 入口
|
|
||||||
|
|
||||||
超级管理员在正式模式的基础资料和业务管理页选择旧数据后,可执行“纳入测试批次”。报表页不提供该操作,因为报表行不是独立业务实体;需从其来源主数据或单据发起。
|
|
||||||
|
|
||||||
### 8.2 关联闭包
|
|
||||||
|
|
||||||
后端必须沿实际外键与业务关联双向计算连通闭包,直到没有新关联记录。闭包至少覆盖:
|
|
||||||
|
|
||||||
- 菌种与装填记录。
|
|
||||||
- 客户、现场与产线层级。
|
|
||||||
- 仓库、入库、装填、发货和退回。
|
|
||||||
- 托盘、单据明细、库存、使用记录和追溯事件。
|
|
||||||
- 与装填周期相关的发货、使用和退回记录。
|
|
||||||
|
|
||||||
由于旧数据没有可靠的测试标记,系统无法自动识别闭包中哪些数据被用户视为“正式”。预览必须按表展示数量和关键编号;如果闭包包含需保留的正式数据,管理员必须取消,系统不允许只标记半条关联链。
|
|
||||||
|
|
||||||
### 8.3 确认与写入
|
|
||||||
|
|
||||||
- 目标批次必须为 `ACTIVE`。
|
|
||||||
- 闭包中所有数据必须尚未归属任何测试批次。
|
|
||||||
- 管理员需输入目标批次名称二次确认。
|
|
||||||
- 服务端使用不透明预览校验标识;确认时重新计算闭包,范围变化则拒绝旧确认。
|
|
||||||
- 事务内锁定批次和闭包中的根记录,然后一次性写入所有 `test_batch_id`。
|
|
||||||
- 任何一步失败都回滚,不得出现部分数据已纳入、部分数据仍为正式的状态。
|
|
||||||
|
|
||||||
## 9. 整批清理
|
|
||||||
|
|
||||||
### 9.1 前置条件
|
|
||||||
|
|
||||||
- 操作人必须是超级管理员。
|
|
||||||
- 批次必须为 `CLOSED`。
|
|
||||||
- 清理预览需展示每类主数据、单据、明细、库存和事件的数量。
|
|
||||||
- 管理员必须输入完整批次名称并通过最终确认。
|
|
||||||
- 确认请求必须携带服务端生成的一次性预览标识。
|
|
||||||
|
|
||||||
### 9.2 事务与删除顺序
|
|
||||||
|
|
||||||
清理服务在单个数据库事务内锁定批次,重新计算影响范围并校验预览标识。删除顺序必须由实际外键图生成并以回归测试固化,原则为:
|
|
||||||
|
|
||||||
1. 先删除 `biz_pallet_inventory`,解除其对托盘事件和活动装填记录的外键引用。
|
|
||||||
2. 删除 `biz_usage_record`、`biz_return_item`、`biz_shipment_item` 和 `biz_inbound_item`。
|
|
||||||
3. 删除 `biz_return_order`、`biz_shipment_order` 和 `biz_inbound_order`。
|
|
||||||
4. 删除 `biz_pallet_event`,再删除 `biz_filling_record`。
|
|
||||||
5. 删除指向测试仓库、现场的 `biz_user_warehouse` 和 `biz_user_site` 关联。
|
|
||||||
6. 先删除产线,再删除现场和客户;随后删除仓库、菌种和托盘等其他主数据。
|
|
||||||
7. 删除批次用户授权,更新批次为 `PURGED`,写入清理汇总。
|
|
||||||
|
|
||||||
实施时以 SQLAlchemy 模型和 MySQL/PostgreSQL 外键的实际编译结果为准,不依赖上述文字顺序代替自动化测试。
|
|
||||||
|
|
||||||
不对业务外键配置 `ON DELETE CASCADE`。如果任何外键、并发状态或数据库错误导致删除失败,整个事务回滚,批次保持 `CLOSED`。
|
|
||||||
|
|
||||||
### 9.3 幂等与审计
|
|
||||||
|
|
||||||
- 同一批次的并发清理只有一个可以执行,其他请求等待后读取最新状态。
|
|
||||||
- 对 `PURGED` 批次重复请求返回稳定的“已清理”结果,不重复执行删除。
|
|
||||||
- 批次记录保留清理人、清理时间和分类数量。
|
|
||||||
- 系统操作日志保留,作为审计证据;日志不记录密码、Token、Cookie 或大量业务明细。
|
|
||||||
|
|
||||||
## 10. 界面与交互
|
|
||||||
|
|
||||||
### 10.1 测试数据批次管理
|
|
||||||
|
|
||||||
在“系统管理”下新增“测试数据批次”页面,仅超级管理员可见。页面支持:
|
|
||||||
|
|
||||||
- 查看批次编码、名称、状态、创建人、参与用户和时间。
|
|
||||||
- 创建批次、编辑备注、授权或移除测试用户。
|
|
||||||
- 关闭或重新开启未清理批次。
|
|
||||||
- 查看数据汇总、清理预览和最终清理确认。
|
|
||||||
- 查看已清理批次的审计汇总。
|
|
||||||
|
|
||||||
### 10.2 模式提示
|
|
||||||
|
|
||||||
- Web 顶部和 PDA 工作台提供“正式数据 / 已授权测试批次”切换。
|
|
||||||
- 测试模式始终展示高可见的批次名称和“测试数据”标识,不得只在隐蔽的下拉框中表示。
|
|
||||||
- 切换模式后刷新当前列表、选项、首页指标和报表,并清空未提交的跨模式表单状态。
|
|
||||||
- 批次被关闭、授权被移除或会话失效时,普通测试用户退回正式模式并得到明确提示;超级管理员仍可从批次管理页查看关闭批次的只读汇总和清理预览。
|
|
||||||
|
|
||||||
### 10.3 现有删除入口
|
|
||||||
|
|
||||||
- 基础资料、业务管理和报表页不再提供物理删除入口。
|
|
||||||
- 正式主数据通过停用保留历史引用;正式业务单据按现有业务状态处理,不使用测试批次能力物理删除。
|
|
||||||
- 旧的删除 API 保留路由兼容,但统一拒绝物理删除并提示“请通过测试数据批次清理”。
|
|
||||||
- “纳入测试批次”只在正式模式下向超级管理员展示。
|
|
||||||
|
|
||||||
## 11. 后端组件与接口边界
|
|
||||||
|
|
||||||
建议新增独立的批次控制器、服务、DAO 和 VO,不将级联清理逻辑分散到六个主数据服务中。职责划分如下:
|
|
||||||
|
|
||||||
- 批次管理:创建、列表、详情、用户授权、关闭和重新开启。
|
|
||||||
- 批次上下文:解析请求模式,校验用户与批次,为查询和写入提供受信任的 `batch_id | None`。
|
|
||||||
- 批次一致性校验:根据业务输入校验所有关联数据处于同一模式和批次。
|
|
||||||
- 旧数据纳入:计算关联闭包、生成预览、校验确认并原子写入批次标记。
|
|
||||||
- 整批清理:统计影响数据、生成预览、校验确认并原子删除。
|
|
||||||
|
|
||||||
预览与执行必须分为不同接口。执行接口不接受前端传入的“要删哪些表或 ID”,只接受批次 ID、批次名称确认和一次性预览标识;实际范围始终由后端重算。
|
|
||||||
|
|
||||||
## 12. 错误处理
|
|
||||||
|
|
||||||
需向用户明确区分以下失败:
|
|
||||||
|
|
||||||
- 非超级管理员访问管理或清理接口。
|
|
||||||
- 用户未被授权访问所选测试批次。
|
|
||||||
- 批次已关闭、已清理或在操作期间状态发生变化。
|
|
||||||
- 请求将正式数据与测试数据或不同批次数据混用。
|
|
||||||
- 旧数据关联闭包包含已属于其他批次的数据。
|
|
||||||
- 预览后数据范围发生变化,一次性校验标识失效。
|
|
||||||
- 批次名称确认不匹配。
|
|
||||||
- 外键、并发或数据库错误触发整体回滚。
|
|
||||||
|
|
||||||
前端不将未知错误表示为成功,也不在失败后乐观移除列表记录。所有成功状态均以服务端提交后重新查询的结果为准。
|
|
||||||
|
|
||||||
## 13. 数据库迁移与发布
|
|
||||||
|
|
||||||
- 同步更新 MySQL 和 PostgreSQL 全量建库脚本。
|
|
||||||
- 为已有环境提供 MySQL 和 PostgreSQL 增量补丁。
|
|
||||||
- 先创建批次与授权表,再以可空字段方式增加 `test_batch_id`、索引和外键。
|
|
||||||
- 既有记录的 `test_batch_id` 保持 `NULL`,迁移不自动更新业务数据。
|
|
||||||
- 发布前必须完成数据库备份和恢复演练;应用迁移和首次旧数据纳入属于独立高风险操作,需单独确认后执行。
|
|
||||||
- 先发布后端与前端代码,确认正式模式查询不回归,再创建新测试批次或纳入旧数据。
|
|
||||||
|
|
||||||
## 14. 测试与验证
|
|
||||||
|
|
||||||
### 14.1 后端
|
|
||||||
|
|
||||||
- 批次生命周期和不合法状态转换。
|
|
||||||
- 超级管理员硬校验,包括普通用户持有误分配权限字符的情况。
|
|
||||||
- 批次用户授权与现有仓库/现场数据范围的叠加效果。
|
|
||||||
- 正式、同批次和跨批次关联校验。
|
|
||||||
- 创建主数据和五类业务时的批次自动继承。
|
|
||||||
- 主数据、业务列表、选项、扫码、首页和六类报表的模式隔离。
|
|
||||||
- 旧数据闭包的完整性、循环去重、跨批次拒绝和事务回滚。
|
|
||||||
- 关闭批次后所有写入被拒绝,重新开启后恢复。
|
|
||||||
- 清理预览计数、预览过期、确认文本、外键删除顺序、失败回滚和重复清理幂等性。
|
|
||||||
- MySQL 和 PostgreSQL 的 SQL 编译与迁移契约。
|
|
||||||
|
|
||||||
### 14.2 Web 与 PDA
|
|
||||||
|
|
||||||
- 超级管理员、已授权测试用户和未授权用户的菜单与按钮可见性。
|
|
||||||
- 正式/测试模式切换、批次标识、请求上下文和授权失效回退。
|
|
||||||
- 旧数据纳入预览、批次名称二次确认和预览过期提示。
|
|
||||||
- 批次关闭后的只读界面和清理确认。
|
|
||||||
- 现有物理删除按钮移除,直接调用旧删除 API 时的稳定拒绝提示。
|
|
||||||
- Web 生产构建、PDA H5 构建、最相关契约测试和后端业务单元测试。
|
|
||||||
|
|
||||||
## 15. 验收标准
|
|
||||||
|
|
||||||
1. 正式模式的页面、选项、首页和报表不展示任何测试数据。
|
|
||||||
2. 测试模式只展示当前批次数据,不显示正式数据或其他批次数据。
|
|
||||||
3. 授权的普通用户可完成测试业务链,但无法管理、纳入、关闭或清理批次。
|
|
||||||
4. 正式与测试数据、不同测试批次之间不能混用。
|
|
||||||
5. 超级管理员可预览并完整纳入旧测试数据,范围变化时旧确认失效。
|
|
||||||
6. `ACTIVE` 批次不能清理;`CLOSED` 批次不能新增或修改业务数据。
|
|
||||||
7. 整批清理成功后,所有相关主数据、单据、明细、库存和追溯记录消失,报表不再返回该批次数据。
|
|
||||||
8. 清理任一步失败时不删除任何数据,批次仍为 `CLOSED`。
|
|
||||||
9. 超级管理员也无法通过批次清理或旧删除 API 物理删除正式数据。
|
|
||||||
10. 已清理批次保留操作人、时间和分类数量,且日志不包含凭据或敏感信息。
|
|
||||||
|
|
||||||
## 16. 已知风险与控制
|
|
||||||
|
|
||||||
- **旧数据闭包可能过大**:旧测试数据如果复用了正式仓库、现场或托盘,关联闭包可能扩展到大量正式数据。系统必须展示完整预览并允许取消,不提供忽略关联的强制选项。
|
|
||||||
- **大批量事务时间较长**:在目标数据库上通过压力测试确定在线清理上限,并将上限写入部署配置和运维文档。在线接口必须阻止超过上限的批次,且不得通过分段提交规避原子性;超大批次由 DBA 在备份后使用受审计脚本处理。数值上限依赖目标环境,本设计不在缺少实测数据时猜测固定值。
|
|
||||||
- **请求上下文被伪造**:后端每次验证授权、批次状态和数据归属,不相信前端显示或请求头本身。
|
|
||||||
- **漏加查询条件导致统计污染**:使用统一批次上下文和 DAO 查询辅助方法,并用契约测试盘点全部业务查询。
|
|
||||||
- **仅前端隐藏不能提供安全性**:批次管理、纳入和清理均在后端强制超级管理员检查。
|
|
||||||
- **迁移与实际数据存在差异**:应用前在目标数据库执行只读外键和表结构盘点,与代码模型和迁移脚本三方对照,不假设生产结构与仓库 SQL 完全一致。
|
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
# 会议物料流转缺口补齐设计
|
|
||||||
|
|
||||||
## 目标与依据
|
|
||||||
|
|
||||||
依据 10 月 4 日会议纪要及用户要求“直接修改所缺的相关功能”,在现有基础资料维护、业务管理、报表查询三个一级模块内补齐功能,不重建业务系统。
|
|
||||||
|
|
||||||
## 不变量
|
|
||||||
|
|
||||||
- 托盘号沿用发货方录入值;生产批号、托盘号和内部溯源号互不替代。
|
|
||||||
- 新装填固定 100 包;使用按实际包数扣减;余料退回不换托盘、不换原物料批次。
|
|
||||||
- 正式数据与测试批次隔离;权限、仓库/现场数据范围、事务锁、幂等和事件流水继续在后端执行。
|
|
||||||
- 不安装依赖、不修改运行环境、不修改无关文件、不提交既有暂存内容。
|
|
||||||
- 仅准备初始化 SQL 和增量迁移;连接真实数据库执行结构变更、补数或业务写入前另行获得明确确认。
|
|
||||||
- 在当前 codex/test-data-batch-cleanup 工作区增量修改,保留已有未提交隧道功能,不另建遗漏这些修改的工作树。
|
|
||||||
|
|
||||||
## 功能设计
|
|
||||||
|
|
||||||
### 1. 报表与混批追溯
|
|
||||||
|
|
||||||
消耗报表允许产线为空,以隧道为主要查询维度。库存、消耗、退回、托盘追溯返回隧道编号/名称与内部溯源关系;按同一溯源关系展示多托盘、多批次的使用与退回明细,避免将不同业务阶段的数量重复相加。普通操作页显示业务名称,内部码仅在查询/详情中使用。
|
|
||||||
|
|
||||||
### 2. APP/PDA
|
|
||||||
|
|
||||||
对齐现有后端 tunnel-options、enter-tunnel 和 usage 接口。先扫码、选择隧道、确认入隧,再提交实际使用量;产线可选。入隧与使用独立幂等键,失败重试保持原键,改动业务输入后更新键。继续支持现有扫描头与手工输入,不新增原生 SDK。
|
|
||||||
|
|
||||||
### 3. 批次信息与标签
|
|
||||||
|
|
||||||
装填记录增加 production_date(生产日期)和 expiry_date(有效期至),日期不得倒置。历史记录允许为空并显示“未登记”,不得用装填时间伪造生产日期。PC 与 APP 新录入一致;扫描、单据详情和相关报表读同一记录。发货标签包含原托盘号、客户/现场、品种、批号、生产日期、有效期、包数以及固定二维码。
|
|
||||||
|
|
||||||
### 4. 发货与接收核对
|
|
||||||
|
|
||||||
在现有发货模块内增加接收方核对确认,不新建一级菜单。发货确认与接收确认分别留痕,接收按原发货单的托盘和物料快照处理,不能新编托盘/批号;未核对接收的物料不能投入使用。接收权限必须受目标现场范围控制。历史已发货业务通过明确迁移策略保持可用,不重扣库存。
|
|
||||||
|
|
||||||
### 5. 无二维码录入
|
|
||||||
|
|
||||||
允许在已有扫码入口输入印刷托盘号,由服务端在当前测试批次与业务数据范围内解析。实际提交使用规范二维码标识,避免同一托盘用两种输入生成不同业务身份。若托盘号与其他二维码标识冲突,明确拒绝歧义,不能随意取第一条。
|
|
||||||
|
|
||||||
### 6. 先到先用
|
|
||||||
|
|
||||||
同现场、同品种、可用库存按真实接收时间排序推荐;用户已批准“允许跳过但必须记录原因”。入隧和实际使用均由后端复核,存在严格更早候选时要求最多500字的原因,随事件/使用记录保存推荐快照并参与幂等摘要。到货时间相同或当前历史时间未知时不以托盘ID强排先后,未知时间提示人工核对。保留跨托盘、跨批次混用及余料原托退回。
|
|
||||||
|
|
||||||
## 验收
|
|
||||||
|
|
||||||
先写回归测试再实现,覆盖无产线报表、数据隔离、混批追溯、日期边界、二维码/托盘号歧义、收货权限/状态/幂等与 FIFO。PC 和 APP 运行现有契约测试及构建。最终单独列出已验证代码、待执行迁移和待实机验收,不把它们混为完成。
|
|
||||||
@@ -33,7 +33,7 @@ VITE_APP_BASE_API=http://<服务器地址>:9099 pnpm run build:h5
|
|||||||
|
|
||||||
不要把包含真实凭据的环境文件或地址配置提交到仓库。
|
不要把包含真实凭据的环境文件或地址配置提交到仓库。
|
||||||
|
|
||||||
PDA 测试模式、批次授权和失效回退规则请阅读[测试数据批次操作说明](../docs/test-data-batch-operations.md)。PDA 只允许选择后端返回的 ACTIVE 授权批次,退出登录会清除本地批次上下文。
|
PDA 测试模式、批次授权和失效回退规则请阅读[测试数据批次操作说明](../shierfeng-fastapi-backend/sql/test-data-batch-operations.md)。PDA 只允许选择后端返回的 ACTIVE 授权批次,退出登录会清除本地批次上下文。
|
||||||
|
|
||||||
### vscode
|
### vscode
|
||||||
|
|
||||||
|
|||||||
@@ -1,14 +0,0 @@
|
|||||||
2026-07-24 10:43:57.887 | 1d9a33288de348368007067748c31355 | aabb4b91b0824c1fbf6a7ec92f94ff6a | fd99c47ca6b74678afc6075d7889bf81 | 31192-34a642 | WARNING | module_admin.service.login_service:authenticate_user:133 - 密码错误
|
|
||||||
2026-07-24 10:43:57.922 | 1d9a33288de348368007067748c31355 | aabb4b91b0824c1fbf6a7ec92f94ff6a | fd99c47ca6b74678afc6075d7889bf81 | 31192-34a642 | WARNING | common.annotation.log_annotation:wrapper:194 - 密码错误
|
|
||||||
2026-07-24 11:54:28.516 | | | | 31192-34a642 | WARNING | config.get_scheduler:on_lock_lost:273 - ⚠️ Worker 31192-34a642 失去 Application 锁
|
|
||||||
2026-07-24 13:21:17.591 | b7cdd8ede375465b98a4a549e43848b9 | 2724af3784304deebebd9fe7524b91d1 | 8308eacc68f44a7c97b1fccb9e369a63 | 31192-34a642 | WARNING | module_admin.service.login_service:__check_login_captcha:170 - 验证码错误
|
|
||||||
2026-07-24 13:21:17.595 | b7cdd8ede375465b98a4a549e43848b9 | 2724af3784304deebebd9fe7524b91d1 | 8308eacc68f44a7c97b1fccb9e369a63 | 31192-34a642 | WARNING | common.annotation.log_annotation:wrapper:194 - 验证码错误
|
|
||||||
2026-07-24 13:24:25.010 | 3c489e839af64532bb8427b9f3a784e2 | c17862d307a845cb8b780c7099732b5d | a0ab771fa5fd49f186ce56fb6982217d | 31192-34a642 | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-07-24 13:43:44.788 | 7c132bfc7c9e4bf2a4d9ae17eef8f384 | 6a2a3444832d423dbe3f92eae8cb038d | b66fc5d4a0fd4b01b15bcfc6de70df82 | 96780-47e1b0 | WARNING | module_admin.service.login_service:authenticate_user:133 - 密码错误
|
|
||||||
2026-07-24 13:43:44.790 | 7c132bfc7c9e4bf2a4d9ae17eef8f384 | 6a2a3444832d423dbe3f92eae8cb038d | b66fc5d4a0fd4b01b15bcfc6de70df82 | 96780-47e1b0 | WARNING | common.annotation.log_annotation:wrapper:194 - 密码错误
|
|
||||||
2026-07-24 14:46:43.424 | 649eece74ede46d4af7f56bd57bcc835 | ef07d6d2d5cd46008de0f1377c49be97 | 3d97b0eff36746bc9bb8a271dc678052 | 96780-47e1b0 | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-07-24 14:46:43.475 | fe5401eabfb84dd99fbfb331ac51a1ce | 1ef05a750f534363bf684ade2865e6d9 | 1c5e0e9251d043e6b9a7dc215ace7539 | 96780-47e1b0 | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-07-24 14:50:10.269 | | | | 96780-47e1b0 | WARNING | config.get_scheduler:on_lock_lost:273 - ⚠️ Worker 96780-47e1b0 失去 Application 锁
|
|
||||||
2026-07-24 16:34:01.363 | 2f3106716d9446f9b0d5cf007a5de50d | 3a7efe2fa78e457f805791699ea090b4 | cb2a87b27ebf4f08a33dc280be2f568c | 43079-aa5b16 | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-07-24 16:34:01.403 | 6241aaea26e3437d9898230a1ebf368b | 201045f282ad4ce4a7f013844e2f2e79 | 87862e1ea8d547df97ff15b49dfd96b1 | 43079-aa5b16 | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-07-24 16:37:20.355 | | | | 43079-aa5b16 | WARNING | config.get_scheduler:on_lock_lost:273 - ⚠️ Worker 43079-aa5b16 失去 Application 锁
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,12 +0,0 @@
|
|||||||
2026-07-27 19:22:26.860 | | | | 9563-28d319 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-715' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.137 seconds
|
|
||||||
2026-07-27 19:22:28.196 | | | | 9563-28d319 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-934' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.224 seconds
|
|
||||||
2026-07-27 19:53:43.635 | dde8e968426247eea530614b9aaf7962 | 13896791a3544e0da6544cd313364e3d | ab93d4e318284aa4904707d00c8811a9 | 31445-f59426 | WARNING | module_admin.service.login_service:get_current_user:219 - 用户token已失效,请重新登录
|
|
||||||
2026-07-27 21:59:06.500 | | | | 2266-6d8b7b | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-166' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.122 seconds
|
|
||||||
2026-07-27 21:59:09.529 | | | | 2266-6d8b7b | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-781' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.188 seconds
|
|
||||||
2026-07-27 21:59:10.532 | | | | 2266-6d8b7b | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-961' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.107 seconds
|
|
||||||
2026-07-27 22:37:49.502 | ba37c0ab34a84c15a417b0894a5b0275 | cfef0ef55c604b44a3937e946430afe2 | 295a9d9291f94344a99ab875082f0135 | 88624-ac3813 | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-07-27 22:38:05.919 | f4c80e1bd3bd4ac38123038c7eb5b7bc | 7fb79449e2eb4397b3a6a6612b7bde55 | 045a2e6d5ae84ea7924cc5f188ba809a | 88624-ac3813 | WARNING | module_admin.service.login_service:authenticate_user:133 - 密码错误
|
|
||||||
2026-07-27 22:38:05.920 | f4c80e1bd3bd4ac38123038c7eb5b7bc | 7fb79449e2eb4397b3a6a6612b7bde55 | 045a2e6d5ae84ea7924cc5f188ba809a | 88624-ac3813 | WARNING | common.annotation.log_annotation:wrapper:194 - 密码错误
|
|
||||||
2026-07-27 23:24:36.151 | 7a712acd5f974190bce80351bc20eacf | 5f6631f93ec24ca2b4dad93d1fe867c4 | add679267064471297661d5d9159cf4f | 88624-ac3813 | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-07-27 23:24:36.153 | 133e439ee1364acabb2aedd52ba453e2 | 5c961e88abb24679a4bfb1ec1e6c66bd | 3f5a9a5b432a42ee8b3aad762e335762 | 88624-ac3813 | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-07-27 23:41:14.802 | | | | 88624-ac3813 | WARNING | config.get_scheduler:on_lock_lost:273 - ⚠️ Worker 88624-ac3813 失去 Application 锁
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,18 +0,0 @@
|
|||||||
2026-07-28 08:10:11.720 | 229d54ea88244aada095e0c05fc58a1a | dd1bcb0a656d46eea1f208e569150e0c | ccdcbe3cd8ce4f40b37cb79e472e7928 | 56150-7e6e1b | ERROR | common.annotation.log_annotation:wrapper:199 - 目标客户不存在
|
|
||||||
2026-07-28 08:13:50.386 | 7051993d7aec48d58e4d954dd744790b | 4857dd6a9fb246fc88f37929197f6788 | 36454969890f4305a894c2d02e4e3e2a | 70673-b1e410 | ERROR | exceptions.handle:service_exception_handler:52 - 托盘不存在
|
|
||||||
2026-07-28 08:31:59.122 | | | | 86964-e27516 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-181' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.242 seconds
|
|
||||||
2026-07-28 08:32:03.722 | | | | 86964-e27516 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-694' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.128 seconds
|
|
||||||
2026-07-28 08:32:04.319 | | | | 86964-e27516 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-700' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.481 seconds
|
|
||||||
2026-07-28 08:32:05.296 | | | | 86964-e27516 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-784' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.265 seconds
|
|
||||||
2026-07-28 08:42:44.842 | | | | 95441-8aaf52 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-181' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.115 seconds
|
|
||||||
2026-07-28 09:04:44.937 | 26f97f7bb14d41829e69b34333c4be57 | 0066d58cf5ad43f09bcf7902359272cb | 091aa9c1c1354e4b8f3dd956595d0701 | 95068-253e5c | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-07-28 09:07:04.035 | | | | 95068-253e5c | WARNING | config.get_scheduler:on_lock_lost:273 - ⚠️ Worker 95068-253e5c 失去 Application 锁
|
|
||||||
2026-07-28 09:31:13.873 | bef898e1c3114071ae204bf7b55d2434 | 535bdac446e44cf69975393f093acd33 | 9b09887c7b694c7f9eec55da7cd67b12 | 10849-728253 | WARNING | module_admin.service.login_service:authenticate_user:133 - 密码错误
|
|
||||||
2026-07-28 09:31:13.875 | bef898e1c3114071ae204bf7b55d2434 | 535bdac446e44cf69975393f093acd33 | 9b09887c7b694c7f9eec55da7cd67b12 | 10849-728253 | WARNING | common.annotation.log_annotation:wrapper:194 - 密码错误
|
|
||||||
2026-07-28 09:37:16.199 | | | | 17412-ad0254 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-181' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.109 seconds
|
|
||||||
2026-07-28 09:37:17.383 | | | | 17412-ad0254 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-562' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.212 seconds
|
|
||||||
2026-07-28 09:37:18.906 | | | | 17412-ad0254 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-706' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.121 seconds
|
|
||||||
2026-07-28 09:37:19.122 | | | | 17412-ad0254 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-709' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.123 seconds
|
|
||||||
2026-07-28 09:37:19.438 | | | | 17412-ad0254 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-715' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.245 seconds
|
|
||||||
2026-07-28 09:37:21.184 | | | | 17412-ad0254 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-784' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.184 seconds
|
|
||||||
2026-07-28 18:26:23.902 | | | | 78200-ccd00b | WARNING | config.get_scheduler:on_lock_lost:273 - ⚠️ Worker 78200-ccd00b 失去 Application 锁
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,12 +0,0 @@
|
|||||||
2026-07-29 15:36:23.601 | ba82151d145f493ca1c2db9ca932ff93 | d506e81abaaa431da03c8247b9acad4c | 541a8b8d6df94a37b81b747ccbfca386 | 69363-bceb28 | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-07-29 15:38:38.611 | | | | 69363-bceb28 | WARNING | config.get_scheduler:on_lock_lost:273 - ⚠️ Worker 69363-bceb28 失去 Application 锁
|
|
||||||
2026-07-29 17:09:13.477 | | | | 69363-bceb28 | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Connection closed by server.
|
|
||||||
2026-07-29 17:09:14.580 | | | | 69363-bceb28 | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Connection closed by server.
|
|
||||||
2026-07-29 17:09:15.592 | | | | 69363-bceb28 | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Connection closed by server.
|
|
||||||
2026-07-29 17:09:16.623 | | | | 69363-bceb28 | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Connection closed by server.
|
|
||||||
2026-07-29 17:09:17.635 | | | | 69363-bceb28 | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Connection closed by server.
|
|
||||||
2026-07-29 17:09:18.640 | | | | 69363-bceb28 | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Connection closed by server.
|
|
||||||
2026-07-29 17:09:19.651 | | | | 69363-bceb28 | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Connection closed by server.
|
|
||||||
2026-07-29 17:09:20.659 | | | | 69363-bceb28 | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Connection closed by server.
|
|
||||||
2026-07-29 17:09:21.668 | | | | 69363-bceb28 | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Connection closed by server.
|
|
||||||
2026-07-29 17:09:22.674 | | | | 69363-bceb28 | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Connection closed by server.
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,361 +0,0 @@
|
|||||||
2026-07-30 08:54:08.790 | | | | 51197-a0ceb2 | INFO | server:lifespan:90 - ⏰️ ShiErFeng-FastAPI开始启动
|
|
||||||
2026-07-30 08:54:08.790 | | | | 51197-a0ceb2 | INFO | utils.common_util:worship:22 -
|
|
||||||
////////////////////////////////////////////////////////////////////
|
|
||||||
// _ooOoo_ //
|
|
||||||
// o8888888o //
|
|
||||||
// 88" . "88 //
|
|
||||||
// (| ^_^ |) //
|
|
||||||
// O\ = /O //
|
|
||||||
// ____/`---'\____ //
|
|
||||||
// .' \\| |// `. //
|
|
||||||
// / \\||| : |||// \ //
|
|
||||||
// / _||||| -:- |||||- \ //
|
|
||||||
// | | \\\ - /// | | //
|
|
||||||
// | \_| ''\---/'' | | //
|
|
||||||
// \ .-\__ `-` ___/-. / //
|
|
||||||
// ___`. .' /--.--\ `. . ___ //
|
|
||||||
// ."" '< `.___\_<|>_/___.' >'"". //
|
|
||||||
// | | : `- \`.;`\ _ /`;.`/ - ` : | | //
|
|
||||||
// \ \ `-. \_ __\ /__ _/ .-` / / //
|
|
||||||
// ========`-.____`-.___\_____/___.-`____.-'======== //
|
|
||||||
// `=---=' //
|
|
||||||
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ //
|
|
||||||
// 佛祖保佑 永不宕机 永无BUG //
|
|
||||||
////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
2026-07-30 08:54:08.790 | | | | 51197-a0ceb2 | INFO | config.get_db:init_create_table:25 - 🔎 初始化数据库连接...
|
|
||||||
2026-07-30 08:54:08.929 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - SELECT DATABASE()
|
|
||||||
2026-07-30 08:54:08.929 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-07-30 08:54:08.932 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - SELECT @@sql_mode
|
|
||||||
2026-07-30 08:54:08.932 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-07-30 08:54:08.933 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - SELECT @@lower_case_table_names
|
|
||||||
2026-07-30 08:54:08.933 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-07-30 08:54:08.934 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - BEGIN (implicit)
|
|
||||||
2026-07-30 08:54:08.934 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`sys_config`
|
|
||||||
2026-07-30 08:54:08.934 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-07-30 08:54:09.045 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`sys_dict_type`
|
|
||||||
2026-07-30 08:54:09.045 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-07-30 08:54:09.056 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`sys_dict_data`
|
|
||||||
2026-07-30 08:54:09.056 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-07-30 08:54:09.106 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`sys_job`
|
|
||||||
2026-07-30 08:54:09.106 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-07-30 08:54:09.110 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`sys_job_log`
|
|
||||||
2026-07-30 08:54:09.110 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-07-30 08:54:09.113 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`sys_logininfor`
|
|
||||||
2026-07-30 08:54:09.113 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-07-30 08:54:09.116 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`sys_oper_log`
|
|
||||||
2026-07-30 08:54:09.116 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-07-30 08:54:09.119 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`sys_dept`
|
|
||||||
2026-07-30 08:54:09.120 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-07-30 08:54:09.124 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`sys_user`
|
|
||||||
2026-07-30 08:54:09.124 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-07-30 08:54:09.134 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`sys_user_role`
|
|
||||||
2026-07-30 08:54:09.134 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-07-30 08:54:09.138 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`sys_user_post`
|
|
||||||
2026-07-30 08:54:09.139 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-07-30 08:54:09.140 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`sys_menu`
|
|
||||||
2026-07-30 08:54:09.140 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-07-30 08:54:09.142 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`sys_post`
|
|
||||||
2026-07-30 08:54:09.142 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-07-30 08:54:09.144 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`sys_role`
|
|
||||||
2026-07-30 08:54:09.144 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-07-30 08:54:09.146 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`sys_role_dept`
|
|
||||||
2026-07-30 08:54:09.146 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-07-30 08:54:09.148 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`sys_role_menu`
|
|
||||||
2026-07-30 08:54:09.148 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-07-30 08:54:09.150 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`sys_notice`
|
|
||||||
2026-07-30 08:54:09.150 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-07-30 08:54:09.152 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`biz_strain`
|
|
||||||
2026-07-30 08:54:09.152 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-07-30 08:54:09.153 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`biz_warehouse`
|
|
||||||
2026-07-30 08:54:09.153 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-07-30 08:54:09.156 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`biz_customer`
|
|
||||||
2026-07-30 08:54:09.156 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-07-30 08:54:09.164 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`biz_customer_site`
|
|
||||||
2026-07-30 08:54:09.164 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-07-30 08:54:09.175 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`biz_production_line`
|
|
||||||
2026-07-30 08:54:09.175 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-07-30 08:54:09.177 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`biz_pallet`
|
|
||||||
2026-07-30 08:54:09.177 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-07-30 08:54:09.178 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`biz_user_warehouse`
|
|
||||||
2026-07-30 08:54:09.178 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-07-30 08:54:09.179 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`biz_user_site`
|
|
||||||
2026-07-30 08:54:09.180 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-07-30 08:54:09.181 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`biz_inbound_order`
|
|
||||||
2026-07-30 08:54:09.181 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-07-30 08:54:09.183 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`biz_inbound_item`
|
|
||||||
2026-07-30 08:54:09.183 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-07-30 08:54:09.184 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`biz_filling_record`
|
|
||||||
2026-07-30 08:54:09.184 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-07-30 08:54:09.185 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`biz_shipment_order`
|
|
||||||
2026-07-30 08:54:09.185 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-07-30 08:54:09.186 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`biz_shipment_item`
|
|
||||||
2026-07-30 08:54:09.187 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-07-30 08:54:09.188 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`biz_usage_record`
|
|
||||||
2026-07-30 08:54:09.188 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-07-30 08:54:09.190 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`biz_return_order`
|
|
||||||
2026-07-30 08:54:09.190 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-07-30 08:54:09.191 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`biz_return_item`
|
|
||||||
2026-07-30 08:54:09.191 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-07-30 08:54:09.192 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`biz_pallet_inventory`
|
|
||||||
2026-07-30 08:54:09.192 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-07-30 08:54:09.193 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`biz_pallet_event`
|
|
||||||
2026-07-30 08:54:09.193 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-07-30 08:54:09.194 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`gen_table`
|
|
||||||
2026-07-30 08:54:09.195 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-07-30 08:54:09.195 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`gen_table_column`
|
|
||||||
2026-07-30 08:54:09.195 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-07-30 08:54:09.196 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - COMMIT
|
|
||||||
2026-07-30 08:54:09.198 | | | | 51197-a0ceb2 | INFO | config.get_db:init_create_table:28 - ✅️ 数据库连接成功
|
|
||||||
2026-07-30 08:54:09.198 | | | | 51197-a0ceb2 | INFO | config.get_redis:check_redis_connection:57 - 🔎 开始连接redis...
|
|
||||||
2026-07-30 08:54:09.199 | | | | 51197-a0ceb2 | INFO | config.get_redis:check_redis_connection:63 - ✅️ redis连接成功
|
|
||||||
2026-07-30 08:54:09.202 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - BEGIN (implicit)
|
|
||||||
2026-07-30 08:54:09.214 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - SELECT sys_dict_type.dict_id, sys_dict_type.dict_name, sys_dict_type.dict_type, sys_dict_type.status, sys_dict_type.create_by, sys_dict_type.create_time, sys_dict_type.update_by, sys_dict_type.update_time, sys_dict_type.remark
|
|
||||||
FROM sys_dict_type
|
|
||||||
2026-07-30 08:54:09.214 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [generated in 0.00034s] ()
|
|
||||||
2026-07-30 08:54:09.225 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - SELECT DISTINCT sys_dict_data.dict_code, sys_dict_data.dict_sort, sys_dict_data.dict_label, sys_dict_data.dict_value, sys_dict_data.dict_type, sys_dict_data.css_class, sys_dict_data.list_class, sys_dict_data.is_default, sys_dict_data.status, sys_dict_data.create_by, sys_dict_data.create_time, sys_dict_data.update_by, sys_dict_data.update_time, sys_dict_data.remark
|
|
||||||
FROM sys_dict_type LEFT OUTER JOIN sys_dict_data ON sys_dict_type.dict_type = sys_dict_data.dict_type AND sys_dict_data.status = %s
|
|
||||||
WHERE sys_dict_type.dict_type = %s AND sys_dict_type.status = %s ORDER BY sys_dict_data.dict_sort
|
|
||||||
2026-07-30 08:54:09.225 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [generated in 0.00023s] ('0', 'sys_user_sex', '0')
|
|
||||||
2026-07-30 08:54:09.242 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - SELECT DISTINCT sys_dict_data.dict_code, sys_dict_data.dict_sort, sys_dict_data.dict_label, sys_dict_data.dict_value, sys_dict_data.dict_type, sys_dict_data.css_class, sys_dict_data.list_class, sys_dict_data.is_default, sys_dict_data.status, sys_dict_data.create_by, sys_dict_data.create_time, sys_dict_data.update_by, sys_dict_data.update_time, sys_dict_data.remark
|
|
||||||
FROM sys_dict_type LEFT OUTER JOIN sys_dict_data ON sys_dict_type.dict_type = sys_dict_data.dict_type AND sys_dict_data.status = %s
|
|
||||||
WHERE sys_dict_type.dict_type = %s AND sys_dict_type.status = %s ORDER BY sys_dict_data.dict_sort
|
|
||||||
2026-07-30 08:54:09.242 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [cached since 0.01676s ago] ('0', 'sys_show_hide', '0')
|
|
||||||
2026-07-30 08:54:09.244 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - SELECT DISTINCT sys_dict_data.dict_code, sys_dict_data.dict_sort, sys_dict_data.dict_label, sys_dict_data.dict_value, sys_dict_data.dict_type, sys_dict_data.css_class, sys_dict_data.list_class, sys_dict_data.is_default, sys_dict_data.status, sys_dict_data.create_by, sys_dict_data.create_time, sys_dict_data.update_by, sys_dict_data.update_time, sys_dict_data.remark
|
|
||||||
FROM sys_dict_type LEFT OUTER JOIN sys_dict_data ON sys_dict_type.dict_type = sys_dict_data.dict_type AND sys_dict_data.status = %s
|
|
||||||
WHERE sys_dict_type.dict_type = %s AND sys_dict_type.status = %s ORDER BY sys_dict_data.dict_sort
|
|
||||||
2026-07-30 08:54:09.244 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [cached since 0.01874s ago] ('0', 'sys_normal_disable', '0')
|
|
||||||
2026-07-30 08:54:09.246 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - SELECT DISTINCT sys_dict_data.dict_code, sys_dict_data.dict_sort, sys_dict_data.dict_label, sys_dict_data.dict_value, sys_dict_data.dict_type, sys_dict_data.css_class, sys_dict_data.list_class, sys_dict_data.is_default, sys_dict_data.status, sys_dict_data.create_by, sys_dict_data.create_time, sys_dict_data.update_by, sys_dict_data.update_time, sys_dict_data.remark
|
|
||||||
FROM sys_dict_type LEFT OUTER JOIN sys_dict_data ON sys_dict_type.dict_type = sys_dict_data.dict_type AND sys_dict_data.status = %s
|
|
||||||
WHERE sys_dict_type.dict_type = %s AND sys_dict_type.status = %s ORDER BY sys_dict_data.dict_sort
|
|
||||||
2026-07-30 08:54:09.247 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [cached since 0.02152s ago] ('0', 'sys_job_status', '0')
|
|
||||||
2026-07-30 08:54:09.253 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - SELECT DISTINCT sys_dict_data.dict_code, sys_dict_data.dict_sort, sys_dict_data.dict_label, sys_dict_data.dict_value, sys_dict_data.dict_type, sys_dict_data.css_class, sys_dict_data.list_class, sys_dict_data.is_default, sys_dict_data.status, sys_dict_data.create_by, sys_dict_data.create_time, sys_dict_data.update_by, sys_dict_data.update_time, sys_dict_data.remark
|
|
||||||
FROM sys_dict_type LEFT OUTER JOIN sys_dict_data ON sys_dict_type.dict_type = sys_dict_data.dict_type AND sys_dict_data.status = %s
|
|
||||||
WHERE sys_dict_type.dict_type = %s AND sys_dict_type.status = %s ORDER BY sys_dict_data.dict_sort
|
|
||||||
2026-07-30 08:54:09.254 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [cached since 0.02857s ago] ('0', 'sys_job_group', '0')
|
|
||||||
2026-07-30 08:54:09.256 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - SELECT DISTINCT sys_dict_data.dict_code, sys_dict_data.dict_sort, sys_dict_data.dict_label, sys_dict_data.dict_value, sys_dict_data.dict_type, sys_dict_data.css_class, sys_dict_data.list_class, sys_dict_data.is_default, sys_dict_data.status, sys_dict_data.create_by, sys_dict_data.create_time, sys_dict_data.update_by, sys_dict_data.update_time, sys_dict_data.remark
|
|
||||||
FROM sys_dict_type LEFT OUTER JOIN sys_dict_data ON sys_dict_type.dict_type = sys_dict_data.dict_type AND sys_dict_data.status = %s
|
|
||||||
WHERE sys_dict_type.dict_type = %s AND sys_dict_type.status = %s ORDER BY sys_dict_data.dict_sort
|
|
||||||
2026-07-30 08:54:09.256 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [cached since 0.0311s ago] ('0', 'sys_job_executor', '0')
|
|
||||||
2026-07-30 08:54:09.258 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - SELECT DISTINCT sys_dict_data.dict_code, sys_dict_data.dict_sort, sys_dict_data.dict_label, sys_dict_data.dict_value, sys_dict_data.dict_type, sys_dict_data.css_class, sys_dict_data.list_class, sys_dict_data.is_default, sys_dict_data.status, sys_dict_data.create_by, sys_dict_data.create_time, sys_dict_data.update_by, sys_dict_data.update_time, sys_dict_data.remark
|
|
||||||
FROM sys_dict_type LEFT OUTER JOIN sys_dict_data ON sys_dict_type.dict_type = sys_dict_data.dict_type AND sys_dict_data.status = %s
|
|
||||||
WHERE sys_dict_type.dict_type = %s AND sys_dict_type.status = %s ORDER BY sys_dict_data.dict_sort
|
|
||||||
2026-07-30 08:54:09.259 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [cached since 0.03358s ago] ('0', 'sys_yes_no', '0')
|
|
||||||
2026-07-30 08:54:09.261 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - SELECT DISTINCT sys_dict_data.dict_code, sys_dict_data.dict_sort, sys_dict_data.dict_label, sys_dict_data.dict_value, sys_dict_data.dict_type, sys_dict_data.css_class, sys_dict_data.list_class, sys_dict_data.is_default, sys_dict_data.status, sys_dict_data.create_by, sys_dict_data.create_time, sys_dict_data.update_by, sys_dict_data.update_time, sys_dict_data.remark
|
|
||||||
FROM sys_dict_type LEFT OUTER JOIN sys_dict_data ON sys_dict_type.dict_type = sys_dict_data.dict_type AND sys_dict_data.status = %s
|
|
||||||
WHERE sys_dict_type.dict_type = %s AND sys_dict_type.status = %s ORDER BY sys_dict_data.dict_sort
|
|
||||||
2026-07-30 08:54:09.262 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [cached since 0.0365s ago] ('0', 'sys_notice_type', '0')
|
|
||||||
2026-07-30 08:54:09.263 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - SELECT DISTINCT sys_dict_data.dict_code, sys_dict_data.dict_sort, sys_dict_data.dict_label, sys_dict_data.dict_value, sys_dict_data.dict_type, sys_dict_data.css_class, sys_dict_data.list_class, sys_dict_data.is_default, sys_dict_data.status, sys_dict_data.create_by, sys_dict_data.create_time, sys_dict_data.update_by, sys_dict_data.update_time, sys_dict_data.remark
|
|
||||||
FROM sys_dict_type LEFT OUTER JOIN sys_dict_data ON sys_dict_type.dict_type = sys_dict_data.dict_type AND sys_dict_data.status = %s
|
|
||||||
WHERE sys_dict_type.dict_type = %s AND sys_dict_type.status = %s ORDER BY sys_dict_data.dict_sort
|
|
||||||
2026-07-30 08:54:09.263 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [cached since 0.03816s ago] ('0', 'sys_notice_status', '0')
|
|
||||||
2026-07-30 08:54:09.265 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - SELECT DISTINCT sys_dict_data.dict_code, sys_dict_data.dict_sort, sys_dict_data.dict_label, sys_dict_data.dict_value, sys_dict_data.dict_type, sys_dict_data.css_class, sys_dict_data.list_class, sys_dict_data.is_default, sys_dict_data.status, sys_dict_data.create_by, sys_dict_data.create_time, sys_dict_data.update_by, sys_dict_data.update_time, sys_dict_data.remark
|
|
||||||
FROM sys_dict_type LEFT OUTER JOIN sys_dict_data ON sys_dict_type.dict_type = sys_dict_data.dict_type AND sys_dict_data.status = %s
|
|
||||||
WHERE sys_dict_type.dict_type = %s AND sys_dict_type.status = %s ORDER BY sys_dict_data.dict_sort
|
|
||||||
2026-07-30 08:54:09.265 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [cached since 0.04043s ago] ('0', 'sys_oper_type', '0')
|
|
||||||
2026-07-30 08:54:09.268 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - SELECT DISTINCT sys_dict_data.dict_code, sys_dict_data.dict_sort, sys_dict_data.dict_label, sys_dict_data.dict_value, sys_dict_data.dict_type, sys_dict_data.css_class, sys_dict_data.list_class, sys_dict_data.is_default, sys_dict_data.status, sys_dict_data.create_by, sys_dict_data.create_time, sys_dict_data.update_by, sys_dict_data.update_time, sys_dict_data.remark
|
|
||||||
FROM sys_dict_type LEFT OUTER JOIN sys_dict_data ON sys_dict_type.dict_type = sys_dict_data.dict_type AND sys_dict_data.status = %s
|
|
||||||
WHERE sys_dict_type.dict_type = %s AND sys_dict_type.status = %s ORDER BY sys_dict_data.dict_sort
|
|
||||||
2026-07-30 08:54:09.268 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [cached since 0.04316s ago] ('0', 'sys_common_status', '0')
|
|
||||||
2026-07-30 08:54:09.270 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - ROLLBACK
|
|
||||||
2026-07-30 08:54:09.272 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - BEGIN (implicit)
|
|
||||||
2026-07-30 08:54:09.273 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - SELECT DISTINCT sys_config.config_id, sys_config.config_name, sys_config.config_key, sys_config.config_value, sys_config.config_type, sys_config.create_by, sys_config.create_time, sys_config.update_by, sys_config.update_time, sys_config.remark
|
|
||||||
FROM sys_config
|
|
||||||
WHERE true = 1 ORDER BY sys_config.config_id
|
|
||||||
2026-07-30 08:54:09.273 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [generated in 0.00017s] ()
|
|
||||||
2026-07-30 08:54:09.281 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - ROLLBACK
|
|
||||||
2026-07-30 08:54:09.282 | | | | 51197-a0ceb2 | INFO | config.get_scheduler:init_system_scheduler:210 - 🔎 Worker 51197-a0ceb2 尝试获取 Application 锁...
|
|
||||||
2026-07-30 08:54:09.284 | | | | 51197-a0ceb2 | INFO | config.get_scheduler:_start_scheduler_as_leader:235 - 🎯 Worker 51197-a0ceb2 持有 Application 锁,开始启动定时任务...
|
|
||||||
2026-07-30 08:54:09.319 | | | | 51197-a0ceb2 | INFO | apscheduler.schedulers.base:start:214 - Scheduler started
|
|
||||||
2026-07-30 08:54:09.358 | | | | 51197-a0ceb2 | INFO | config.get_scheduler:_start_scheduler_as_leader:261 - ✅️ 系统初始定时任务加载成功
|
|
||||||
2026-07-30 08:54:09.859 | | | | 51197-a0ceb2 | INFO | server:lifespan:103 - 🚀 ShiErFeng-FastAPI启动成功
|
|
||||||
2026-07-30 08:54:09.862 | | | | 51197-a0ceb2 | INFO | server:lifespan:115 - 💻 应用地址:
|
|
||||||
🏠 Local: http://127.0.0.1:9099
|
|
||||||
📡 Network: http://172.20.10.3:9099
|
|
||||||
📡 Network: http://192.168.200.252:9099
|
|
||||||
📡 Network: http://172.16.224.1:9099
|
|
||||||
📡 Network: http://192.168.216.1:9099
|
|
||||||
2026-07-30 08:54:09.863 | | | | 51197-a0ceb2 | INFO | server:lifespan:122 - 📄 Swagger文档:
|
|
||||||
🏠 Local: http://127.0.0.1:9099/docs
|
|
||||||
📡 Network: http://172.20.10.3:9099/docs
|
|
||||||
📡 Network: http://192.168.200.252:9099/docs
|
|
||||||
📡 Network: http://172.16.224.1:9099/docs
|
|
||||||
📡 Network: http://192.168.216.1:9099/docs
|
|
||||||
2026-07-30 08:54:09.863 | | | | 51197-a0ceb2 | INFO | server:lifespan:129 - 📚 ReDoc文档:
|
|
||||||
🏠 Local: http://127.0.0.1:9099/redoc
|
|
||||||
📡 Network: http://172.20.10.3:9099/redoc
|
|
||||||
📡 Network: http://192.168.200.252:9099/redoc
|
|
||||||
📡 Network: http://172.16.224.1:9099/redoc
|
|
||||||
📡 Network: http://192.168.216.1:9099/redoc
|
|
||||||
2026-07-30 08:56:33.325 | 1fc0bad7a4354b69aaf1b06f3bfd8436 | 25981bc77a454fc99cc035f1c6f7adef | 245fcb8df11649b185d4004e7b79d880 | 51197-a0ceb2 | INFO | module_admin.controller.transport_crypto_controller:get_transport_frontend_config:36 - 获取成功
|
|
||||||
2026-07-30 08:56:33.394 | bfad49b558984683a4ade6137eba9178 | d4237587f18d479ba147465837c3df34 | f1a9d395abb447318978c489a80b8f71 | 51197-a0ceb2 | INFO | module_admin.controller.captcha_controller:get_captcha_image:40 - 编号为b3c1bb97-cb96-41bd-8c90-363fad1074b2的会话获取图片验证码成功
|
|
||||||
2026-07-30 08:56:39.584 | 7fb34cd4949e4cfb984275581129a297 | 8598652a81c74b7fb42cd50ad78ee0d4 | dcf730eeb72d44ab97f4f5c00aec8090 | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - BEGIN (implicit)
|
|
||||||
2026-07-30 08:56:39.592 | 7fb34cd4949e4cfb984275581129a297 | 8598652a81c74b7fb42cd50ad78ee0d4 | dcf730eeb72d44ab97f4f5c00aec8090 | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - SELECT DISTINCT sys_user.user_id, sys_user.dept_id, sys_user.user_name, sys_user.nick_name, sys_user.user_type, sys_user.email, sys_user.phonenumber, sys_user.sex, sys_user.avatar, sys_user.password, sys_user.status, sys_user.del_flag, sys_user.login_ip, sys_user.login_date, sys_user.pwd_update_date, sys_user.create_by, sys_user.create_time, sys_user.update_by, sys_user.update_time, sys_user.remark, sys_dept.dept_id AS dept_id_1, sys_dept.parent_id, sys_dept.ancestors, sys_dept.dept_name, sys_dept.order_num, sys_dept.leader, sys_dept.phone, sys_dept.email AS email_1, sys_dept.status AS status_1, sys_dept.del_flag AS del_flag_1, sys_dept.create_by AS create_by_1, sys_dept.create_time AS create_time_1, sys_dept.update_by AS update_by_1, sys_dept.update_time AS update_time_1
|
|
||||||
FROM sys_user LEFT OUTER JOIN sys_dept ON sys_user.dept_id = sys_dept.dept_id AND sys_dept.status = %s AND sys_dept.del_flag = %s
|
|
||||||
WHERE sys_user.user_name = %s AND sys_user.del_flag = %s
|
|
||||||
2026-07-30 08:56:39.592 | 7fb34cd4949e4cfb984275581129a297 | 8598652a81c74b7fb42cd50ad78ee0d4 | dcf730eeb72d44ab97f4f5c00aec8090 | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [generated in 0.00080s] ('0', '0', 'admin', '0')
|
|
||||||
2026-07-30 08:56:39.697 | 7fb34cd4949e4cfb984275581129a297 | 8598652a81c74b7fb42cd50ad78ee0d4 | dcf730eeb72d44ab97f4f5c00aec8090 | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - SELECT DISTINCT sys_post.post_id, sys_post.post_code, sys_post.post_name, sys_post.post_sort, sys_post.status, sys_post.create_by, sys_post.create_time, sys_post.update_by, sys_post.update_time, sys_post.remark
|
|
||||||
FROM sys_post
|
|
||||||
WHERE true = 1 ORDER BY sys_post.post_sort
|
|
||||||
2026-07-30 08:56:39.697 | 7fb34cd4949e4cfb984275581129a297 | 8598652a81c74b7fb42cd50ad78ee0d4 | dcf730eeb72d44ab97f4f5c00aec8090 | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [generated in 0.00036s] ()
|
|
||||||
2026-07-30 08:56:39.703 | 7fb34cd4949e4cfb984275581129a297 | 8598652a81c74b7fb42cd50ad78ee0d4 | dcf730eeb72d44ab97f4f5c00aec8090 | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - SELECT sys_role.role_id, sys_role.role_name, sys_role.role_key, sys_role.role_sort, sys_role.data_scope, sys_role.menu_check_strictly, sys_role.dept_check_strictly, sys_role.status, sys_role.del_flag, sys_role.create_by, sys_role.create_time, sys_role.update_by, sys_role.update_time, sys_role.remark
|
|
||||||
FROM sys_role
|
|
||||||
WHERE sys_role.role_id != %s AND sys_role.status = %s AND sys_role.del_flag = %s
|
|
||||||
2026-07-30 08:56:39.704 | 7fb34cd4949e4cfb984275581129a297 | 8598652a81c74b7fb42cd50ad78ee0d4 | dcf730eeb72d44ab97f4f5c00aec8090 | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [generated in 0.00035s] (1, '0', '0')
|
|
||||||
2026-07-30 08:56:39.711 | 7fb34cd4949e4cfb984275581129a297 | 8598652a81c74b7fb42cd50ad78ee0d4 | dcf730eeb72d44ab97f4f5c00aec8090 | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - SELECT DISTINCT sys_user.user_id, sys_user.dept_id, sys_user.user_name, sys_user.nick_name, sys_user.user_type, sys_user.email, sys_user.phonenumber, sys_user.sex, sys_user.avatar, sys_user.password, sys_user.status, sys_user.del_flag, sys_user.login_ip, sys_user.login_date, sys_user.pwd_update_date, sys_user.create_by, sys_user.create_time, sys_user.update_by, sys_user.update_time, sys_user.remark
|
|
||||||
FROM sys_user
|
|
||||||
WHERE sys_user.del_flag = %s AND sys_user.user_id = %s
|
|
||||||
2026-07-30 08:56:39.711 | 7fb34cd4949e4cfb984275581129a297 | 8598652a81c74b7fb42cd50ad78ee0d4 | dcf730eeb72d44ab97f4f5c00aec8090 | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [generated in 0.00022s] ('0', 1)
|
|
||||||
2026-07-30 08:56:39.713 | 7fb34cd4949e4cfb984275581129a297 | 8598652a81c74b7fb42cd50ad78ee0d4 | dcf730eeb72d44ab97f4f5c00aec8090 | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - SELECT DISTINCT sys_dept.dept_id, sys_dept.parent_id, sys_dept.ancestors, sys_dept.dept_name, sys_dept.order_num, sys_dept.leader, sys_dept.phone, sys_dept.email, sys_dept.status, sys_dept.del_flag, sys_dept.create_by, sys_dept.create_time, sys_dept.update_by, sys_dept.update_time
|
|
||||||
FROM sys_user INNER JOIN sys_dept ON sys_user.dept_id = sys_dept.dept_id AND sys_dept.status = %s AND sys_dept.del_flag = %s
|
|
||||||
WHERE sys_user.del_flag = %s AND sys_user.user_id = %s
|
|
||||||
2026-07-30 08:56:39.713 | 7fb34cd4949e4cfb984275581129a297 | 8598652a81c74b7fb42cd50ad78ee0d4 | dcf730eeb72d44ab97f4f5c00aec8090 | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [generated in 0.00027s] ('0', '0', '0', 1)
|
|
||||||
2026-07-30 08:56:39.715 | 7fb34cd4949e4cfb984275581129a297 | 8598652a81c74b7fb42cd50ad78ee0d4 | dcf730eeb72d44ab97f4f5c00aec8090 | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - SELECT DISTINCT sys_role.role_id, sys_role.role_name, sys_role.role_key, sys_role.role_sort, sys_role.data_scope, sys_role.menu_check_strictly, sys_role.dept_check_strictly, sys_role.status, sys_role.del_flag, sys_role.create_by, sys_role.create_time, sys_role.update_by, sys_role.update_time, sys_role.remark
|
|
||||||
FROM sys_user LEFT OUTER JOIN sys_user_role ON sys_user.user_id = sys_user_role.user_id INNER JOIN sys_role ON sys_user_role.role_id = sys_role.role_id AND sys_role.status = %s AND sys_role.del_flag = %s
|
|
||||||
WHERE sys_user.del_flag = %s AND sys_user.user_id = %s
|
|
||||||
2026-07-30 08:56:39.715 | 7fb34cd4949e4cfb984275581129a297 | 8598652a81c74b7fb42cd50ad78ee0d4 | dcf730eeb72d44ab97f4f5c00aec8090 | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [generated in 0.00030s] ('0', '0', '0', 1)
|
|
||||||
2026-07-30 08:56:39.721 | 7fb34cd4949e4cfb984275581129a297 | 8598652a81c74b7fb42cd50ad78ee0d4 | dcf730eeb72d44ab97f4f5c00aec8090 | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - SELECT DISTINCT sys_post.post_id, sys_post.post_code, sys_post.post_name, sys_post.post_sort, sys_post.status, sys_post.create_by, sys_post.create_time, sys_post.update_by, sys_post.update_time, sys_post.remark
|
|
||||||
FROM sys_user LEFT OUTER JOIN sys_user_post ON sys_user.user_id = sys_user_post.user_id INNER JOIN sys_post ON sys_user_post.post_id = sys_post.post_id AND sys_post.status = %s
|
|
||||||
WHERE sys_user.del_flag = %s AND sys_user.user_id = %s
|
|
||||||
2026-07-30 08:56:39.721 | 7fb34cd4949e4cfb984275581129a297 | 8598652a81c74b7fb42cd50ad78ee0d4 | dcf730eeb72d44ab97f4f5c00aec8090 | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [generated in 0.00021s] ('0', '0', 1)
|
|
||||||
2026-07-30 08:56:39.724 | 7fb34cd4949e4cfb984275581129a297 | 8598652a81c74b7fb42cd50ad78ee0d4 | dcf730eeb72d44ab97f4f5c00aec8090 | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - SELECT DISTINCT sys_menu.menu_id, sys_menu.menu_name, sys_menu.parent_id, sys_menu.order_num, sys_menu.path, sys_menu.component, sys_menu.query, sys_menu.route_name, sys_menu.is_frame, sys_menu.is_cache, sys_menu.menu_type, sys_menu.visible, sys_menu.status, sys_menu.perms, sys_menu.icon, sys_menu.create_by, sys_menu.create_time, sys_menu.update_by, sys_menu.update_time, sys_menu.remark
|
|
||||||
FROM sys_user LEFT OUTER JOIN sys_user_role ON sys_user.user_id = sys_user_role.user_id LEFT OUTER JOIN sys_role ON sys_user_role.role_id = sys_role.role_id AND sys_role.status = %s AND sys_role.del_flag = %s LEFT OUTER JOIN sys_role_menu ON sys_role.role_id = sys_role_menu.role_id INNER JOIN sys_menu ON sys_role_menu.menu_id = sys_menu.menu_id AND sys_menu.status = %s
|
|
||||||
WHERE sys_user.del_flag = %s AND sys_user.user_id = %s
|
|
||||||
2026-07-30 08:56:39.724 | 7fb34cd4949e4cfb984275581129a297 | 8598652a81c74b7fb42cd50ad78ee0d4 | dcf730eeb72d44ab97f4f5c00aec8090 | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [generated in 0.00020s] ('0', '0', '0', '0', 1)
|
|
||||||
2026-07-30 08:56:39.776 | 7fb34cd4949e4cfb984275581129a297 | 8598652a81c74b7fb42cd50ad78ee0d4 | dcf730eeb72d44ab97f4f5c00aec8090 | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - UPDATE sys_user SET login_date=%s WHERE sys_user.user_id = %s
|
|
||||||
2026-07-30 08:56:39.777 | 7fb34cd4949e4cfb984275581129a297 | 8598652a81c74b7fb42cd50ad78ee0d4 | dcf730eeb72d44ab97f4f5c00aec8090 | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [generated in 0.00030s] (datetime.datetime(2026, 7, 30, 8, 56, 39, 688190), 1)
|
|
||||||
2026-07-30 08:56:39.801 | 7fb34cd4949e4cfb984275581129a297 | 8598652a81c74b7fb42cd50ad78ee0d4 | dcf730eeb72d44ab97f4f5c00aec8090 | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - COMMIT
|
|
||||||
2026-07-30 08:56:39.809 | 7fb34cd4949e4cfb984275581129a297 | 8598652a81c74b7fb42cd50ad78ee0d4 | dcf730eeb72d44ab97f4f5c00aec8090 | 51197-a0ceb2 | INFO | module_admin.controller.login_controller:login:83 - 登录成功
|
|
||||||
2026-07-30 08:56:39.829 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - BEGIN (implicit)
|
|
||||||
2026-07-30 08:56:39.831 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - INSERT INTO sys_logininfor (user_name, ipaddr, login_location, browser, os, status, msg, login_time) VALUES (%s, %s, %s, %s, %s, %s, %s, %s)
|
|
||||||
2026-07-30 08:56:39.831 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [generated in 0.00033s] ('admin', '127.0.0.1', '内网IP', 'Chrome 148', 'Mac OS X 10', '0', '登录成功', datetime.datetime(2026, 7, 30, 8, 56, 39, 543738))
|
|
||||||
2026-07-30 08:56:39.841 | | | | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - COMMIT
|
|
||||||
2026-07-30 08:56:39.853 | 2f0ad31927ec4184bf203698b084e7b6 | 8a7b18162639442b92b73fd8cc02b3c8 | 8b1a6fa5689d49529b3fa4afc8d72d17 | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - BEGIN (implicit)
|
|
||||||
2026-07-30 08:56:39.854 | 2f0ad31927ec4184bf203698b084e7b6 | 8a7b18162639442b92b73fd8cc02b3c8 | 8b1a6fa5689d49529b3fa4afc8d72d17 | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - SELECT DISTINCT sys_user.user_id, sys_user.dept_id, sys_user.user_name, sys_user.nick_name, sys_user.user_type, sys_user.email, sys_user.phonenumber, sys_user.sex, sys_user.avatar, sys_user.password, sys_user.status, sys_user.del_flag, sys_user.login_ip, sys_user.login_date, sys_user.pwd_update_date, sys_user.create_by, sys_user.create_time, sys_user.update_by, sys_user.update_time, sys_user.remark
|
|
||||||
FROM sys_user
|
|
||||||
WHERE sys_user.status = %s AND sys_user.del_flag = %s AND sys_user.user_id = %s
|
|
||||||
2026-07-30 08:56:39.854 | 2f0ad31927ec4184bf203698b084e7b6 | 8a7b18162639442b92b73fd8cc02b3c8 | 8b1a6fa5689d49529b3fa4afc8d72d17 | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [generated in 0.00022s] ('0', '0', 1)
|
|
||||||
2026-07-30 08:56:39.856 | 2f0ad31927ec4184bf203698b084e7b6 | 8a7b18162639442b92b73fd8cc02b3c8 | 8b1a6fa5689d49529b3fa4afc8d72d17 | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - SELECT DISTINCT sys_dept.dept_id, sys_dept.parent_id, sys_dept.ancestors, sys_dept.dept_name, sys_dept.order_num, sys_dept.leader, sys_dept.phone, sys_dept.email, sys_dept.status, sys_dept.del_flag, sys_dept.create_by, sys_dept.create_time, sys_dept.update_by, sys_dept.update_time
|
|
||||||
FROM sys_user INNER JOIN sys_dept ON sys_user.dept_id = sys_dept.dept_id AND sys_dept.status = %s AND sys_dept.del_flag = %s
|
|
||||||
WHERE sys_user.status = %s AND sys_user.del_flag = %s AND sys_user.user_id = %s
|
|
||||||
2026-07-30 08:56:39.856 | 2f0ad31927ec4184bf203698b084e7b6 | 8a7b18162639442b92b73fd8cc02b3c8 | 8b1a6fa5689d49529b3fa4afc8d72d17 | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [generated in 0.00022s] ('0', '0', '0', '0', 1)
|
|
||||||
2026-07-30 08:56:39.858 | 2f0ad31927ec4184bf203698b084e7b6 | 8a7b18162639442b92b73fd8cc02b3c8 | 8b1a6fa5689d49529b3fa4afc8d72d17 | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - SELECT DISTINCT sys_role.role_id, sys_role.role_name, sys_role.role_key, sys_role.role_sort, sys_role.data_scope, sys_role.menu_check_strictly, sys_role.dept_check_strictly, sys_role.status, sys_role.del_flag, sys_role.create_by, sys_role.create_time, sys_role.update_by, sys_role.update_time, sys_role.remark
|
|
||||||
FROM sys_user LEFT OUTER JOIN sys_user_role ON sys_user.user_id = sys_user_role.user_id INNER JOIN sys_role ON sys_user_role.role_id = sys_role.role_id AND sys_role.status = %s AND sys_role.del_flag = %s
|
|
||||||
WHERE sys_user.status = %s AND sys_user.del_flag = %s AND sys_user.user_id = %s
|
|
||||||
2026-07-30 08:56:39.858 | 2f0ad31927ec4184bf203698b084e7b6 | 8a7b18162639442b92b73fd8cc02b3c8 | 8b1a6fa5689d49529b3fa4afc8d72d17 | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [generated in 0.00032s] ('0', '0', '0', '0', 1)
|
|
||||||
2026-07-30 08:56:39.860 | 2f0ad31927ec4184bf203698b084e7b6 | 8a7b18162639442b92b73fd8cc02b3c8 | 8b1a6fa5689d49529b3fa4afc8d72d17 | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - SELECT DISTINCT sys_post.post_id, sys_post.post_code, sys_post.post_name, sys_post.post_sort, sys_post.status, sys_post.create_by, sys_post.create_time, sys_post.update_by, sys_post.update_time, sys_post.remark
|
|
||||||
FROM sys_user LEFT OUTER JOIN sys_user_post ON sys_user.user_id = sys_user_post.user_id INNER JOIN sys_post ON sys_user_post.post_id = sys_post.post_id AND sys_post.status = %s
|
|
||||||
WHERE sys_user.status = %s AND sys_user.del_flag = %s AND sys_user.user_id = %s
|
|
||||||
2026-07-30 08:56:39.860 | 2f0ad31927ec4184bf203698b084e7b6 | 8a7b18162639442b92b73fd8cc02b3c8 | 8b1a6fa5689d49529b3fa4afc8d72d17 | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [generated in 0.00047s] ('0', '0', '0', 1)
|
|
||||||
2026-07-30 08:56:39.861 | 2f0ad31927ec4184bf203698b084e7b6 | 8a7b18162639442b92b73fd8cc02b3c8 | 8b1a6fa5689d49529b3fa4afc8d72d17 | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - SELECT DISTINCT sys_menu.menu_id, sys_menu.menu_name, sys_menu.parent_id, sys_menu.order_num, sys_menu.path, sys_menu.component, sys_menu.query, sys_menu.route_name, sys_menu.is_frame, sys_menu.is_cache, sys_menu.menu_type, sys_menu.visible, sys_menu.status, sys_menu.perms, sys_menu.icon, sys_menu.create_by, sys_menu.create_time, sys_menu.update_by, sys_menu.update_time, sys_menu.remark
|
|
||||||
FROM sys_menu
|
|
||||||
WHERE sys_menu.status = %s
|
|
||||||
2026-07-30 08:56:39.862 | 2f0ad31927ec4184bf203698b084e7b6 | 8a7b18162639442b92b73fd8cc02b3c8 | 8b1a6fa5689d49529b3fa4afc8d72d17 | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [generated in 0.00018s] ('0',)
|
|
||||||
2026-07-30 08:56:39.870 | 2f0ad31927ec4184bf203698b084e7b6 | 8a7b18162639442b92b73fd8cc02b3c8 | 8b1a6fa5689d49529b3fa4afc8d72d17 | 51197-a0ceb2 | INFO | module_admin.controller.login_controller:get_login_user_info:102 - 获取成功
|
|
||||||
2026-07-30 08:56:39.875 | 2f0ad31927ec4184bf203698b084e7b6 | 8a7b18162639442b92b73fd8cc02b3c8 | 8b1a6fa5689d49529b3fa4afc8d72d17 | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - ROLLBACK
|
|
||||||
2026-07-30 08:56:39.884 | c59674632b5245d3b80cce50f1bcbc43 | 88721ed8c10c4919a9cc97ea4a145fe5 | d887966ed6bd4cf5a6fb78c2a83b309c | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - BEGIN (implicit)
|
|
||||||
2026-07-30 08:56:39.884 | c59674632b5245d3b80cce50f1bcbc43 | 88721ed8c10c4919a9cc97ea4a145fe5 | d887966ed6bd4cf5a6fb78c2a83b309c | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - SELECT DISTINCT sys_user.user_id, sys_user.dept_id, sys_user.user_name, sys_user.nick_name, sys_user.user_type, sys_user.email, sys_user.phonenumber, sys_user.sex, sys_user.avatar, sys_user.password, sys_user.status, sys_user.del_flag, sys_user.login_ip, sys_user.login_date, sys_user.pwd_update_date, sys_user.create_by, sys_user.create_time, sys_user.update_by, sys_user.update_time, sys_user.remark
|
|
||||||
FROM sys_user
|
|
||||||
WHERE sys_user.status = %s AND sys_user.del_flag = %s AND sys_user.user_id = %s
|
|
||||||
2026-07-30 08:56:39.884 | c59674632b5245d3b80cce50f1bcbc43 | 88721ed8c10c4919a9cc97ea4a145fe5 | d887966ed6bd4cf5a6fb78c2a83b309c | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [cached since 0.03077s ago] ('0', '0', 1)
|
|
||||||
2026-07-30 08:56:39.885 | c59674632b5245d3b80cce50f1bcbc43 | 88721ed8c10c4919a9cc97ea4a145fe5 | d887966ed6bd4cf5a6fb78c2a83b309c | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - SELECT DISTINCT sys_dept.dept_id, sys_dept.parent_id, sys_dept.ancestors, sys_dept.dept_name, sys_dept.order_num, sys_dept.leader, sys_dept.phone, sys_dept.email, sys_dept.status, sys_dept.del_flag, sys_dept.create_by, sys_dept.create_time, sys_dept.update_by, sys_dept.update_time
|
|
||||||
FROM sys_user INNER JOIN sys_dept ON sys_user.dept_id = sys_dept.dept_id AND sys_dept.status = %s AND sys_dept.del_flag = %s
|
|
||||||
WHERE sys_user.status = %s AND sys_user.del_flag = %s AND sys_user.user_id = %s
|
|
||||||
2026-07-30 08:56:39.885 | c59674632b5245d3b80cce50f1bcbc43 | 88721ed8c10c4919a9cc97ea4a145fe5 | d887966ed6bd4cf5a6fb78c2a83b309c | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [cached since 0.02923s ago] ('0', '0', '0', '0', 1)
|
|
||||||
2026-07-30 08:56:39.886 | c59674632b5245d3b80cce50f1bcbc43 | 88721ed8c10c4919a9cc97ea4a145fe5 | d887966ed6bd4cf5a6fb78c2a83b309c | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - SELECT DISTINCT sys_role.role_id, sys_role.role_name, sys_role.role_key, sys_role.role_sort, sys_role.data_scope, sys_role.menu_check_strictly, sys_role.dept_check_strictly, sys_role.status, sys_role.del_flag, sys_role.create_by, sys_role.create_time, sys_role.update_by, sys_role.update_time, sys_role.remark
|
|
||||||
FROM sys_user LEFT OUTER JOIN sys_user_role ON sys_user.user_id = sys_user_role.user_id INNER JOIN sys_role ON sys_user_role.role_id = sys_role.role_id AND sys_role.status = %s AND sys_role.del_flag = %s
|
|
||||||
WHERE sys_user.status = %s AND sys_user.del_flag = %s AND sys_user.user_id = %s
|
|
||||||
2026-07-30 08:56:39.887 | c59674632b5245d3b80cce50f1bcbc43 | 88721ed8c10c4919a9cc97ea4a145fe5 | d887966ed6bd4cf5a6fb78c2a83b309c | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [cached since 0.02875s ago] ('0', '0', '0', '0', 1)
|
|
||||||
2026-07-30 08:56:39.888 | c59674632b5245d3b80cce50f1bcbc43 | 88721ed8c10c4919a9cc97ea4a145fe5 | d887966ed6bd4cf5a6fb78c2a83b309c | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - SELECT DISTINCT sys_post.post_id, sys_post.post_code, sys_post.post_name, sys_post.post_sort, sys_post.status, sys_post.create_by, sys_post.create_time, sys_post.update_by, sys_post.update_time, sys_post.remark
|
|
||||||
FROM sys_user LEFT OUTER JOIN sys_user_post ON sys_user.user_id = sys_user_post.user_id INNER JOIN sys_post ON sys_user_post.post_id = sys_post.post_id AND sys_post.status = %s
|
|
||||||
WHERE sys_user.status = %s AND sys_user.del_flag = %s AND sys_user.user_id = %s
|
|
||||||
2026-07-30 08:56:39.888 | c59674632b5245d3b80cce50f1bcbc43 | 88721ed8c10c4919a9cc97ea4a145fe5 | d887966ed6bd4cf5a6fb78c2a83b309c | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [cached since 0.0281s ago] ('0', '0', '0', 1)
|
|
||||||
2026-07-30 08:56:39.889 | c59674632b5245d3b80cce50f1bcbc43 | 88721ed8c10c4919a9cc97ea4a145fe5 | d887966ed6bd4cf5a6fb78c2a83b309c | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - SELECT DISTINCT sys_menu.menu_id, sys_menu.menu_name, sys_menu.parent_id, sys_menu.order_num, sys_menu.path, sys_menu.component, sys_menu.query, sys_menu.route_name, sys_menu.is_frame, sys_menu.is_cache, sys_menu.menu_type, sys_menu.visible, sys_menu.status, sys_menu.perms, sys_menu.icon, sys_menu.create_by, sys_menu.create_time, sys_menu.update_by, sys_menu.update_time, sys_menu.remark
|
|
||||||
FROM sys_menu
|
|
||||||
WHERE sys_menu.status = %s
|
|
||||||
2026-07-30 08:56:39.889 | c59674632b5245d3b80cce50f1bcbc43 | 88721ed8c10c4919a9cc97ea4a145fe5 | d887966ed6bd4cf5a6fb78c2a83b309c | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [cached since 0.02751s ago] ('0',)
|
|
||||||
2026-07-30 08:56:39.897 | c59674632b5245d3b80cce50f1bcbc43 | 88721ed8c10c4919a9cc97ea4a145fe5 | d887966ed6bd4cf5a6fb78c2a83b309c | 51197-a0ceb2 | INFO | module_admin.controller.login_controller:get_login_user_routers:119 - 获取成功
|
|
||||||
2026-07-30 08:56:39.897 | c59674632b5245d3b80cce50f1bcbc43 | 88721ed8c10c4919a9cc97ea4a145fe5 | d887966ed6bd4cf5a6fb78c2a83b309c | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - SELECT DISTINCT sys_user.user_id, sys_user.dept_id, sys_user.user_name, sys_user.nick_name, sys_user.user_type, sys_user.email, sys_user.phonenumber, sys_user.sex, sys_user.avatar, sys_user.password, sys_user.status, sys_user.del_flag, sys_user.login_ip, sys_user.login_date, sys_user.pwd_update_date, sys_user.create_by, sys_user.create_time, sys_user.update_by, sys_user.update_time, sys_user.remark
|
|
||||||
FROM sys_user
|
|
||||||
WHERE sys_user.status = %s AND sys_user.del_flag = %s AND sys_user.user_id = %s
|
|
||||||
2026-07-30 08:56:39.897 | c59674632b5245d3b80cce50f1bcbc43 | 88721ed8c10c4919a9cc97ea4a145fe5 | d887966ed6bd4cf5a6fb78c2a83b309c | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [cached since 0.04374s ago] ('0', '0', 1)
|
|
||||||
2026-07-30 08:56:39.898 | c59674632b5245d3b80cce50f1bcbc43 | 88721ed8c10c4919a9cc97ea4a145fe5 | d887966ed6bd4cf5a6fb78c2a83b309c | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - SELECT DISTINCT sys_dept.dept_id, sys_dept.parent_id, sys_dept.ancestors, sys_dept.dept_name, sys_dept.order_num, sys_dept.leader, sys_dept.phone, sys_dept.email, sys_dept.status, sys_dept.del_flag, sys_dept.create_by, sys_dept.create_time, sys_dept.update_by, sys_dept.update_time
|
|
||||||
FROM sys_user INNER JOIN sys_dept ON sys_user.dept_id = sys_dept.dept_id AND sys_dept.status = %s AND sys_dept.del_flag = %s
|
|
||||||
WHERE sys_user.status = %s AND sys_user.del_flag = %s AND sys_user.user_id = %s
|
|
||||||
2026-07-30 08:56:39.899 | c59674632b5245d3b80cce50f1bcbc43 | 88721ed8c10c4919a9cc97ea4a145fe5 | d887966ed6bd4cf5a6fb78c2a83b309c | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [cached since 0.04225s ago] ('0', '0', '0', '0', 1)
|
|
||||||
2026-07-30 08:56:39.899 | c59674632b5245d3b80cce50f1bcbc43 | 88721ed8c10c4919a9cc97ea4a145fe5 | d887966ed6bd4cf5a6fb78c2a83b309c | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - SELECT DISTINCT sys_role.role_id, sys_role.role_name, sys_role.role_key, sys_role.role_sort, sys_role.data_scope, sys_role.menu_check_strictly, sys_role.dept_check_strictly, sys_role.status, sys_role.del_flag, sys_role.create_by, sys_role.create_time, sys_role.update_by, sys_role.update_time, sys_role.remark
|
|
||||||
FROM sys_user LEFT OUTER JOIN sys_user_role ON sys_user.user_id = sys_user_role.user_id INNER JOIN sys_role ON sys_user_role.role_id = sys_role.role_id AND sys_role.status = %s AND sys_role.del_flag = %s
|
|
||||||
WHERE sys_user.status = %s AND sys_user.del_flag = %s AND sys_user.user_id = %s
|
|
||||||
2026-07-30 08:56:39.900 | c59674632b5245d3b80cce50f1bcbc43 | 88721ed8c10c4919a9cc97ea4a145fe5 | d887966ed6bd4cf5a6fb78c2a83b309c | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [cached since 0.04159s ago] ('0', '0', '0', '0', 1)
|
|
||||||
2026-07-30 08:56:39.900 | c59674632b5245d3b80cce50f1bcbc43 | 88721ed8c10c4919a9cc97ea4a145fe5 | d887966ed6bd4cf5a6fb78c2a83b309c | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - SELECT DISTINCT sys_post.post_id, sys_post.post_code, sys_post.post_name, sys_post.post_sort, sys_post.status, sys_post.create_by, sys_post.create_time, sys_post.update_by, sys_post.update_time, sys_post.remark
|
|
||||||
FROM sys_user LEFT OUTER JOIN sys_user_post ON sys_user.user_id = sys_user_post.user_id INNER JOIN sys_post ON sys_user_post.post_id = sys_post.post_id AND sys_post.status = %s
|
|
||||||
WHERE sys_user.status = %s AND sys_user.del_flag = %s AND sys_user.user_id = %s
|
|
||||||
2026-07-30 08:56:39.901 | c59674632b5245d3b80cce50f1bcbc43 | 88721ed8c10c4919a9cc97ea4a145fe5 | d887966ed6bd4cf5a6fb78c2a83b309c | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [cached since 0.04097s ago] ('0', '0', '0', 1)
|
|
||||||
2026-07-30 08:56:39.901 | c59674632b5245d3b80cce50f1bcbc43 | 88721ed8c10c4919a9cc97ea4a145fe5 | d887966ed6bd4cf5a6fb78c2a83b309c | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - SELECT DISTINCT sys_menu.menu_id, sys_menu.menu_name, sys_menu.parent_id, sys_menu.order_num, sys_menu.path, sys_menu.component, sys_menu.query, sys_menu.route_name, sys_menu.is_frame, sys_menu.is_cache, sys_menu.menu_type, sys_menu.visible, sys_menu.status, sys_menu.perms, sys_menu.icon, sys_menu.create_by, sys_menu.create_time, sys_menu.update_by, sys_menu.update_time, sys_menu.remark
|
|
||||||
FROM sys_menu
|
|
||||||
WHERE sys_menu.status = %s
|
|
||||||
2026-07-30 08:56:39.901 | c59674632b5245d3b80cce50f1bcbc43 | 88721ed8c10c4919a9cc97ea4a145fe5 | d887966ed6bd4cf5a6fb78c2a83b309c | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [cached since 0.04002s ago] ('0',)
|
|
||||||
2026-07-30 08:56:39.912 | c59674632b5245d3b80cce50f1bcbc43 | 88721ed8c10c4919a9cc97ea4a145fe5 | d887966ed6bd4cf5a6fb78c2a83b309c | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - ROLLBACK
|
|
||||||
2026-07-30 08:56:43.132 | 2072084357cd4163a4021c7f923a88be | debb00fbb44247a1bbd507824323c178 | a8aed83966a74772a169bbc31527d40d | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - BEGIN (implicit)
|
|
||||||
2026-07-30 08:56:43.135 | 2072084357cd4163a4021c7f923a88be | debb00fbb44247a1bbd507824323c178 | a8aed83966a74772a169bbc31527d40d | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - SELECT DISTINCT sys_user.user_id, sys_user.dept_id, sys_user.user_name, sys_user.nick_name, sys_user.user_type, sys_user.email, sys_user.phonenumber, sys_user.sex, sys_user.avatar, sys_user.password, sys_user.status, sys_user.del_flag, sys_user.login_ip, sys_user.login_date, sys_user.pwd_update_date, sys_user.create_by, sys_user.create_time, sys_user.update_by, sys_user.update_time, sys_user.remark
|
|
||||||
FROM sys_user
|
|
||||||
WHERE sys_user.status = %s AND sys_user.del_flag = %s AND sys_user.user_id = %s
|
|
||||||
2026-07-30 08:56:43.135 | 2072084357cd4163a4021c7f923a88be | debb00fbb44247a1bbd507824323c178 | a8aed83966a74772a169bbc31527d40d | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [cached since 3.281s ago] ('0', '0', 1)
|
|
||||||
2026-07-30 08:56:43.146 | 2072084357cd4163a4021c7f923a88be | debb00fbb44247a1bbd507824323c178 | a8aed83966a74772a169bbc31527d40d | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - SELECT DISTINCT sys_dept.dept_id, sys_dept.parent_id, sys_dept.ancestors, sys_dept.dept_name, sys_dept.order_num, sys_dept.leader, sys_dept.phone, sys_dept.email, sys_dept.status, sys_dept.del_flag, sys_dept.create_by, sys_dept.create_time, sys_dept.update_by, sys_dept.update_time
|
|
||||||
FROM sys_user INNER JOIN sys_dept ON sys_user.dept_id = sys_dept.dept_id AND sys_dept.status = %s AND sys_dept.del_flag = %s
|
|
||||||
WHERE sys_user.status = %s AND sys_user.del_flag = %s AND sys_user.user_id = %s
|
|
||||||
2026-07-30 08:56:43.146 | 2072084357cd4163a4021c7f923a88be | debb00fbb44247a1bbd507824323c178 | a8aed83966a74772a169bbc31527d40d | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [cached since 3.29s ago] ('0', '0', '0', '0', 1)
|
|
||||||
2026-07-30 08:56:43.148 | 2072084357cd4163a4021c7f923a88be | debb00fbb44247a1bbd507824323c178 | a8aed83966a74772a169bbc31527d40d | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - SELECT DISTINCT sys_role.role_id, sys_role.role_name, sys_role.role_key, sys_role.role_sort, sys_role.data_scope, sys_role.menu_check_strictly, sys_role.dept_check_strictly, sys_role.status, sys_role.del_flag, sys_role.create_by, sys_role.create_time, sys_role.update_by, sys_role.update_time, sys_role.remark
|
|
||||||
FROM sys_user LEFT OUTER JOIN sys_user_role ON sys_user.user_id = sys_user_role.user_id INNER JOIN sys_role ON sys_user_role.role_id = sys_role.role_id AND sys_role.status = %s AND sys_role.del_flag = %s
|
|
||||||
WHERE sys_user.status = %s AND sys_user.del_flag = %s AND sys_user.user_id = %s
|
|
||||||
2026-07-30 08:56:43.149 | 2072084357cd4163a4021c7f923a88be | debb00fbb44247a1bbd507824323c178 | a8aed83966a74772a169bbc31527d40d | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [cached since 3.29s ago] ('0', '0', '0', '0', 1)
|
|
||||||
2026-07-30 08:56:43.152 | 2072084357cd4163a4021c7f923a88be | debb00fbb44247a1bbd507824323c178 | a8aed83966a74772a169bbc31527d40d | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - SELECT DISTINCT sys_post.post_id, sys_post.post_code, sys_post.post_name, sys_post.post_sort, sys_post.status, sys_post.create_by, sys_post.create_time, sys_post.update_by, sys_post.update_time, sys_post.remark
|
|
||||||
FROM sys_user LEFT OUTER JOIN sys_user_post ON sys_user.user_id = sys_user_post.user_id INNER JOIN sys_post ON sys_user_post.post_id = sys_post.post_id AND sys_post.status = %s
|
|
||||||
WHERE sys_user.status = %s AND sys_user.del_flag = %s AND sys_user.user_id = %s
|
|
||||||
2026-07-30 08:56:43.153 | 2072084357cd4163a4021c7f923a88be | debb00fbb44247a1bbd507824323c178 | a8aed83966a74772a169bbc31527d40d | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [cached since 3.293s ago] ('0', '0', '0', 1)
|
|
||||||
2026-07-30 08:56:43.154 | 2072084357cd4163a4021c7f923a88be | debb00fbb44247a1bbd507824323c178 | a8aed83966a74772a169bbc31527d40d | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - SELECT DISTINCT sys_menu.menu_id, sys_menu.menu_name, sys_menu.parent_id, sys_menu.order_num, sys_menu.path, sys_menu.component, sys_menu.query, sys_menu.route_name, sys_menu.is_frame, sys_menu.is_cache, sys_menu.menu_type, sys_menu.visible, sys_menu.status, sys_menu.perms, sys_menu.icon, sys_menu.create_by, sys_menu.create_time, sys_menu.update_by, sys_menu.update_time, sys_menu.remark
|
|
||||||
FROM sys_menu
|
|
||||||
WHERE sys_menu.status = %s
|
|
||||||
2026-07-30 08:56:43.154 | 2072084357cd4163a4021c7f923a88be | debb00fbb44247a1bbd507824323c178 | a8aed83966a74772a169bbc31527d40d | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [cached since 3.292s ago] ('0',)
|
|
||||||
2026-07-30 08:56:43.174 | 88e47b1b379f4026863c49dd18f8c4ff | d6fd37f27caa44178590041a898b10fd | ce6272b341e540e7b802dc4d08e04dbe | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - BEGIN (implicit)
|
|
||||||
2026-07-30 08:56:43.175 | 88e47b1b379f4026863c49dd18f8c4ff | d6fd37f27caa44178590041a898b10fd | ce6272b341e540e7b802dc4d08e04dbe | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - SELECT DISTINCT sys_user.user_id, sys_user.dept_id, sys_user.user_name, sys_user.nick_name, sys_user.user_type, sys_user.email, sys_user.phonenumber, sys_user.sex, sys_user.avatar, sys_user.password, sys_user.status, sys_user.del_flag, sys_user.login_ip, sys_user.login_date, sys_user.pwd_update_date, sys_user.create_by, sys_user.create_time, sys_user.update_by, sys_user.update_time, sys_user.remark
|
|
||||||
FROM sys_user
|
|
||||||
WHERE sys_user.status = %s AND sys_user.del_flag = %s AND sys_user.user_id = %s
|
|
||||||
2026-07-30 08:56:43.175 | 88e47b1b379f4026863c49dd18f8c4ff | d6fd37f27caa44178590041a898b10fd | ce6272b341e540e7b802dc4d08e04dbe | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [cached since 3.321s ago] ('0', '0', 1)
|
|
||||||
2026-07-30 08:56:43.182 | 88e47b1b379f4026863c49dd18f8c4ff | d6fd37f27caa44178590041a898b10fd | ce6272b341e540e7b802dc4d08e04dbe | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - SELECT DISTINCT sys_dept.dept_id, sys_dept.parent_id, sys_dept.ancestors, sys_dept.dept_name, sys_dept.order_num, sys_dept.leader, sys_dept.phone, sys_dept.email, sys_dept.status, sys_dept.del_flag, sys_dept.create_by, sys_dept.create_time, sys_dept.update_by, sys_dept.update_time
|
|
||||||
FROM sys_user INNER JOIN sys_dept ON sys_user.dept_id = sys_dept.dept_id AND sys_dept.status = %s AND sys_dept.del_flag = %s
|
|
||||||
WHERE sys_user.status = %s AND sys_user.del_flag = %s AND sys_user.user_id = %s
|
|
||||||
2026-07-30 08:56:43.182 | 88e47b1b379f4026863c49dd18f8c4ff | d6fd37f27caa44178590041a898b10fd | ce6272b341e540e7b802dc4d08e04dbe | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [cached since 3.325s ago] ('0', '0', '0', '0', 1)
|
|
||||||
2026-07-30 08:56:43.185 | 88e47b1b379f4026863c49dd18f8c4ff | d6fd37f27caa44178590041a898b10fd | ce6272b341e540e7b802dc4d08e04dbe | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - SELECT DISTINCT sys_role.role_id, sys_role.role_name, sys_role.role_key, sys_role.role_sort, sys_role.data_scope, sys_role.menu_check_strictly, sys_role.dept_check_strictly, sys_role.status, sys_role.del_flag, sys_role.create_by, sys_role.create_time, sys_role.update_by, sys_role.update_time, sys_role.remark
|
|
||||||
FROM sys_user LEFT OUTER JOIN sys_user_role ON sys_user.user_id = sys_user_role.user_id INNER JOIN sys_role ON sys_user_role.role_id = sys_role.role_id AND sys_role.status = %s AND sys_role.del_flag = %s
|
|
||||||
WHERE sys_user.status = %s AND sys_user.del_flag = %s AND sys_user.user_id = %s
|
|
||||||
2026-07-30 08:56:43.185 | 88e47b1b379f4026863c49dd18f8c4ff | d6fd37f27caa44178590041a898b10fd | ce6272b341e540e7b802dc4d08e04dbe | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [cached since 3.327s ago] ('0', '0', '0', '0', 1)
|
|
||||||
2026-07-30 08:56:43.189 | 88e47b1b379f4026863c49dd18f8c4ff | d6fd37f27caa44178590041a898b10fd | ce6272b341e540e7b802dc4d08e04dbe | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - SELECT DISTINCT sys_post.post_id, sys_post.post_code, sys_post.post_name, sys_post.post_sort, sys_post.status, sys_post.create_by, sys_post.create_time, sys_post.update_by, sys_post.update_time, sys_post.remark
|
|
||||||
FROM sys_user LEFT OUTER JOIN sys_user_post ON sys_user.user_id = sys_user_post.user_id INNER JOIN sys_post ON sys_user_post.post_id = sys_post.post_id AND sys_post.status = %s
|
|
||||||
WHERE sys_user.status = %s AND sys_user.del_flag = %s AND sys_user.user_id = %s
|
|
||||||
2026-07-30 08:56:43.189 | 88e47b1b379f4026863c49dd18f8c4ff | d6fd37f27caa44178590041a898b10fd | ce6272b341e540e7b802dc4d08e04dbe | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [cached since 3.329s ago] ('0', '0', '0', 1)
|
|
||||||
2026-07-30 08:56:43.193 | 88e47b1b379f4026863c49dd18f8c4ff | d6fd37f27caa44178590041a898b10fd | ce6272b341e540e7b802dc4d08e04dbe | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - SELECT DISTINCT sys_menu.menu_id, sys_menu.menu_name, sys_menu.parent_id, sys_menu.order_num, sys_menu.path, sys_menu.component, sys_menu.query, sys_menu.route_name, sys_menu.is_frame, sys_menu.is_cache, sys_menu.menu_type, sys_menu.visible, sys_menu.status, sys_menu.perms, sys_menu.icon, sys_menu.create_by, sys_menu.create_time, sys_menu.update_by, sys_menu.update_time, sys_menu.remark
|
|
||||||
FROM sys_menu
|
|
||||||
WHERE sys_menu.status = %s
|
|
||||||
2026-07-30 08:56:43.194 | 88e47b1b379f4026863c49dd18f8c4ff | d6fd37f27caa44178590041a898b10fd | ce6272b341e540e7b802dc4d08e04dbe | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [cached since 3.332s ago] ('0',)
|
|
||||||
2026-07-30 08:56:43.195 | 2072084357cd4163a4021c7f923a88be | debb00fbb44247a1bbd507824323c178 | a8aed83966a74772a169bbc31527d40d | 51197-a0ceb2 | INFO | module_admin.controller.dict_controller:query_system_dict_type_data:231 - 获取成功
|
|
||||||
2026-07-30 08:56:43.196 | 2072084357cd4163a4021c7f923a88be | debb00fbb44247a1bbd507824323c178 | a8aed83966a74772a169bbc31527d40d | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - ROLLBACK
|
|
||||||
2026-07-30 08:56:43.225 | 88e47b1b379f4026863c49dd18f8c4ff | d6fd37f27caa44178590041a898b10fd | ce6272b341e540e7b802dc4d08e04dbe | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - SELECT count(%s) AS count_1
|
|
||||||
FROM (SELECT biz_customer.customer_id AS customer_id, biz_customer.customer_code AS customer_code, biz_customer.customer_name AS customer_name, biz_customer.status AS status, biz_customer.create_by AS create_by, biz_customer.create_time AS create_time, biz_customer.update_by AS update_by, biz_customer.update_time AS update_time, biz_customer.remark AS remark
|
|
||||||
FROM biz_customer ORDER BY biz_customer.customer_id) AS anon_1
|
|
||||||
2026-07-30 08:56:43.225 | 88e47b1b379f4026863c49dd18f8c4ff | d6fd37f27caa44178590041a898b10fd | ce6272b341e540e7b802dc4d08e04dbe | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [generated in 0.00034s] ('*',)
|
|
||||||
2026-07-30 08:56:43.248 | 88e47b1b379f4026863c49dd18f8c4ff | d6fd37f27caa44178590041a898b10fd | ce6272b341e540e7b802dc4d08e04dbe | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - SELECT biz_customer.customer_id, biz_customer.customer_code, biz_customer.customer_name, biz_customer.status, biz_customer.create_by, biz_customer.create_time, biz_customer.update_by, biz_customer.update_time, biz_customer.remark
|
|
||||||
FROM biz_customer ORDER BY biz_customer.customer_id
|
|
||||||
LIMIT %s, %s
|
|
||||||
2026-07-30 08:56:43.249 | 88e47b1b379f4026863c49dd18f8c4ff | d6fd37f27caa44178590041a898b10fd | ce6272b341e540e7b802dc4d08e04dbe | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [generated in 0.00038s] (0, 10)
|
|
||||||
2026-07-30 08:56:43.253 | 88e47b1b379f4026863c49dd18f8c4ff | d6fd37f27caa44178590041a898b10fd | ce6272b341e540e7b802dc4d08e04dbe | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - SELECT biz_customer.customer_id, NOT (EXISTS (SELECT biz_customer_site.customer_id
|
|
||||||
FROM biz_customer_site
|
|
||||||
WHERE biz_customer_site.customer_id = biz_customer.customer_id)) AS can_remove
|
|
||||||
FROM biz_customer
|
|
||||||
WHERE biz_customer.customer_id IN (%s)
|
|
||||||
2026-07-30 08:56:43.253 | 88e47b1b379f4026863c49dd18f8c4ff | d6fd37f27caa44178590041a898b10fd | ce6272b341e540e7b802dc4d08e04dbe | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - [generated in 0.00022s] (1,)
|
|
||||||
2026-07-30 08:56:43.257 | 88e47b1b379f4026863c49dd18f8c4ff | d6fd37f27caa44178590041a898b10fd | ce6272b341e540e7b802dc4d08e04dbe | 51197-a0ceb2 | INFO | sqlalchemy.log:log:210 - ROLLBACK
|
|
||||||
2026-07-30 10:33:19.497 | | | | 51197-a0ceb2 | INFO | config.get_redis:close_redis_pool:85 - ✅️ 关闭redis连接成功
|
|
||||||
2026-07-30 10:33:19.623 | | | | 51197-a0ceb2 | INFO | config.get_scheduler:close_system_scheduler:768 - ✅️ 关闭定时任务成功
|
|
||||||
2026-07-30 10:33:19.663 | | | | 51197-a0ceb2 | INFO | apscheduler.schedulers.base:shutdown:245 - Scheduler has been shut down
|
|
||||||
2026-07-30 10:33:19.678 | | | | 51197-a0ceb2 | INFO | config.get_scheduler:close_system_scheduler:774 - 🔓 Worker 51197-a0ceb2 释放 Application 锁
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
2026-09-08 09:31:10.852 | 4a0e864e82e443da9c89861ec60c43fc | 8be36ac205ac4a8c96a3b0258bd70371 | 45c89ab6d001431fbbe18e062c1bc02e | 86891-fa4c89 | WARNING | module_admin.service.login_service:authenticate_user:133 - 密码错误
|
|
||||||
2026-09-08 09:31:10.853 | 4a0e864e82e443da9c89861ec60c43fc | 8be36ac205ac4a8c96a3b0258bd70371 | 45c89ab6d001431fbbe18e062c1bc02e | 86891-fa4c89 | WARNING | common.annotation.log_annotation:wrapper:194 - 密码错误
|
|
||||||
2026-09-08 09:31:35.913 | 41b0840e366c4d60876ef440e9d3a616 | 6fff687eff1744139e2362ac04a6abe1 | a8b9e7362b304a29a4e7e2cf51e0e14c | 86891-fa4c89 | WARNING | module_admin.service.login_service:authenticate_user:133 - 密码错误
|
|
||||||
2026-09-08 09:31:35.914 | 41b0840e366c4d60876ef440e9d3a616 | 6fff687eff1744139e2362ac04a6abe1 | a8b9e7362b304a29a4e7e2cf51e0e14c | 86891-fa4c89 | WARNING | common.annotation.log_annotation:wrapper:194 - 密码错误
|
|
||||||
2026-09-08 09:31:57.942 | a78d32c8f2dd4c7eb48ab92c69dff9b9 | cefe35c338ec4115bc3b6f7b08d202e5 | e93299bc6d5f48e9a289091d87fdb91d | 86891-fa4c89 | WARNING | module_admin.service.login_service:authenticate_user:133 - 密码错误
|
|
||||||
2026-09-08 09:31:57.942 | a78d32c8f2dd4c7eb48ab92c69dff9b9 | cefe35c338ec4115bc3b6f7b08d202e5 | e93299bc6d5f48e9a289091d87fdb91d | 86891-fa4c89 | WARNING | common.annotation.log_annotation:wrapper:194 - 密码错误
|
|
||||||
2026-09-08 09:32:03.301 | feaa7e4575d74f039da746f49891b4bf | a2d815e08db34aeda7e4a5132d5f73da | 9a84bc412f1d49958898326d45739a5c | 86891-fa4c89 | WARNING | module_admin.service.login_service:authenticate_user:133 - 密码错误
|
|
||||||
2026-09-08 09:32:03.301 | feaa7e4575d74f039da746f49891b4bf | a2d815e08db34aeda7e4a5132d5f73da | 9a84bc412f1d49958898326d45739a5c | 86891-fa4c89 | WARNING | common.annotation.log_annotation:wrapper:194 - 密码错误
|
|
||||||
2026-09-08 09:32:20.283 | df9eafc80c5244ff9901a55d53a58823 | 8f0eebcc5cab48dcb92fdd86791e3dc9 | 23141ae01b6f4465b73552cf3b76285e | 86891-fa4c89 | WARNING | module_admin.service.login_service:authenticate_user:133 - 密码错误
|
|
||||||
2026-09-08 09:32:20.283 | df9eafc80c5244ff9901a55d53a58823 | 8f0eebcc5cab48dcb92fdd86791e3dc9 | 23141ae01b6f4465b73552cf3b76285e | 86891-fa4c89 | WARNING | common.annotation.log_annotation:wrapper:194 - 密码错误
|
|
||||||
2026-09-08 09:33:44.237 | 3232c6325e25403face166b05a50ea6d | 5d97c5d9fa8a483c88844945f96f2abf | 0c655608465d48ee9a91d00d04dfeef1 | 86891-fa4c89 | WARNING | module_admin.service.login_service:authenticate_user:131 - 10分钟内密码已输错超过5次,账号已锁定,请10分钟后再试
|
|
||||||
2026-09-08 09:33:44.237 | 3232c6325e25403face166b05a50ea6d | 5d97c5d9fa8a483c88844945f96f2abf | 0c655608465d48ee9a91d00d04dfeef1 | 86891-fa4c89 | WARNING | common.annotation.log_annotation:wrapper:194 - 10分钟内密码已输错超过5次,账号已锁定,请10分钟后再试
|
|
||||||
2026-09-08 09:43:05.394 | 76da09b8dd334316b61da417da08da14 | a07f33410d484a6f863bd75cbdcc2e58 | b205e85a01fc4dd59fdb41220e8a74ad | 97705-7dd75f | WARNING | module_admin.service.login_service:authenticate_user:133 - 密码错误
|
|
||||||
2026-09-08 09:43:05.396 | 76da09b8dd334316b61da417da08da14 | a07f33410d484a6f863bd75cbdcc2e58 | b205e85a01fc4dd59fdb41220e8a74ad | 97705-7dd75f | WARNING | common.annotation.log_annotation:wrapper:194 - 密码错误
|
|
||||||
2026-09-08 09:45:19.110 | 2a2e0e37b49141dfa394d325675cd3e4 | a74d0a7286d84df3964ba99b10818cde | e88791d055004c05bc39673c0d9070ce | 99663-42a9bb | WARNING | module_admin.service.login_service:authenticate_user:106 - 打印User:
|
|
||||||
2026-09-08 09:45:19.174 | 2a2e0e37b49141dfa394d325675cd3e4 | a74d0a7286d84df3964ba99b10818cde | e88791d055004c05bc39673c0d9070ce | 99663-42a9bb | WARNING | module_admin.service.login_service:authenticate_user:134 - 密码错误
|
|
||||||
2026-09-08 09:45:19.175 | 2a2e0e37b49141dfa394d325675cd3e4 | a74d0a7286d84df3964ba99b10818cde | e88791d055004c05bc39673c0d9070ce | 99663-42a9bb | WARNING | common.annotation.log_annotation:wrapper:194 - 密码错误
|
|
||||||
2026-09-08 09:46:01.929 | 5dda020c2c98487f8a98a5624d0401ac | e44ed95c0b514d96b435764c3f528d4a | acda009ebce04a1b83e25b0e36422740 | 99663-42a9bb | WARNING | module_admin.service.login_service:authenticate_user:106 - 打印User:
|
|
||||||
2026-09-08 09:46:02.049 | 5dda020c2c98487f8a98a5624d0401ac | e44ed95c0b514d96b435764c3f528d4a | acda009ebce04a1b83e25b0e36422740 | 99663-42a9bb | WARNING | module_admin.service.login_service:authenticate_user:134 - 密码错误
|
|
||||||
2026-09-08 09:46:02.049 | 5dda020c2c98487f8a98a5624d0401ac | e44ed95c0b514d96b435764c3f528d4a | acda009ebce04a1b83e25b0e36422740 | 99663-42a9bb | WARNING | common.annotation.log_annotation:wrapper:194 - 密码错误
|
|
||||||
2026-09-08 09:46:19.891 | a6a394cb5668413690189afe3c250a63 | dc00c0aae6754e0dbf3822a40b90dc71 | 2caa6121dbd94b00ac22d4efc4e5521c | 762-88ef6b | WARNING | module_admin.service.login_service:authenticate_user:106 - 打印User:
|
|
||||||
2026-09-08 09:46:19.954 | a6a394cb5668413690189afe3c250a63 | dc00c0aae6754e0dbf3822a40b90dc71 | 2caa6121dbd94b00ac22d4efc4e5521c | 762-88ef6b | WARNING | module_admin.service.login_service:authenticate_user:134 - 密码错误
|
|
||||||
2026-09-08 09:46:19.954 | a6a394cb5668413690189afe3c250a63 | dc00c0aae6754e0dbf3822a40b90dc71 | 2caa6121dbd94b00ac22d4efc4e5521c | 762-88ef6b | WARNING | common.annotation.log_annotation:wrapper:194 - 密码错误
|
|
||||||
2026-09-08 09:47:40.658 | 197a839f4c034617a8d6f1720ce7b48d | cadd09ded1be4cf7827f86b1159be46e | 11f4eaef577a482f95f2e6916a334d1f | 1883-8961ac | WARNING | module_admin.service.login_service:authenticate_user:110 - 打印User:False
|
|
||||||
2026-09-08 09:47:40.663 | 197a839f4c034617a8d6f1720ce7b48d | cadd09ded1be4cf7827f86b1159be46e | 11f4eaef577a482f95f2e6916a334d1f | 1883-8961ac | WARNING | module_admin.service.login_service:authenticate_user:134 - 密码错误
|
|
||||||
2026-09-08 09:47:40.663 | 197a839f4c034617a8d6f1720ce7b48d | cadd09ded1be4cf7827f86b1159be46e | 11f4eaef577a482f95f2e6916a334d1f | 1883-8961ac | WARNING | common.annotation.log_annotation:wrapper:194 - 密码错误
|
|
||||||
2026-09-08 09:49:41.408 | d244797fc5474512bfdb20cd57f4cb5d | 0f8d631d412e4f3893a239f5cb218f4e | 385f13d04cdf472c876be0c7819d8eb8 | 3558-fc817e | WARNING | module_admin.service.login_service:authenticate_user:110 - 打印User:$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2
|
|
||||||
2026-09-08 09:49:41.477 | d244797fc5474512bfdb20cd57f4cb5d | 0f8d631d412e4f3893a239f5cb218f4e | 385f13d04cdf472c876be0c7819d8eb8 | 3558-fc817e | WARNING | module_admin.service.login_service:authenticate_user:111 - 打印User:False
|
|
||||||
2026-09-08 09:49:41.483 | d244797fc5474512bfdb20cd57f4cb5d | 0f8d631d412e4f3893a239f5cb218f4e | 385f13d04cdf472c876be0c7819d8eb8 | 3558-fc817e | WARNING | module_admin.service.login_service:authenticate_user:133 - 10分钟内密码已输错超过5次,账号已锁定,请10分钟后再试
|
|
||||||
2026-09-08 09:49:41.483 | d244797fc5474512bfdb20cd57f4cb5d | 0f8d631d412e4f3893a239f5cb218f4e | 385f13d04cdf472c876be0c7819d8eb8 | 3558-fc817e | WARNING | common.annotation.log_annotation:wrapper:194 - 10分钟内密码已输错超过5次,账号已锁定,请10分钟后再试
|
|
||||||
2026-09-08 09:52:59.797 | c2d235e1926a433faf9d2e44e68e5205 | 3b3a3cbd149a4c8cac6f10cfff1ff041 | 61341adb49ad4c21907dc997c97f0984 | 3558-fc817e | WARNING | module_admin.service.login_service:authenticate_user:110 - 打印User:$2b$12$QTkKWxAZEyduNaCEpgmvxe3kJy.Zy2Y6iIkBT101.nWjxzuqkQ9yC
|
|
||||||
2026-09-08 09:53:00.023 | c2d235e1926a433faf9d2e44e68e5205 | 3b3a3cbd149a4c8cac6f10cfff1ff041 | 61341adb49ad4c21907dc997c97f0984 | 3558-fc817e | WARNING | module_admin.service.login_service:authenticate_user:111 - 打印User:False
|
|
||||||
2026-09-08 09:53:00.027 | c2d235e1926a433faf9d2e44e68e5205 | 3b3a3cbd149a4c8cac6f10cfff1ff041 | 61341adb49ad4c21907dc997c97f0984 | 3558-fc817e | WARNING | module_admin.service.login_service:authenticate_user:135 - 密码错误
|
|
||||||
2026-09-08 09:53:00.027 | c2d235e1926a433faf9d2e44e68e5205 | 3b3a3cbd149a4c8cac6f10cfff1ff041 | 61341adb49ad4c21907dc997c97f0984 | 3558-fc817e | WARNING | common.annotation.log_annotation:wrapper:194 - 密码错误
|
|
||||||
2026-09-08 09:53:12.040 | e2febe456a7c4028ae7e9a86379dd885 | 5b5cc16af6b144b1af5bf78621c5ab7b | 154e72f88ab9497dacbb2d28865d2365 | 3558-fc817e | WARNING | module_admin.service.login_service:authenticate_user:110 - 打印User:$2b$12$QTkKWxAZEyduNaCEpgmvxe3kJy.Zy2Y6iIkBT101.nWjxzuqkQ9yC
|
|
||||||
2026-09-08 09:53:12.272 | e2febe456a7c4028ae7e9a86379dd885 | 5b5cc16af6b144b1af5bf78621c5ab7b | 154e72f88ab9497dacbb2d28865d2365 | 3558-fc817e | WARNING | module_admin.service.login_service:authenticate_user:111 - 打印User:False
|
|
||||||
2026-09-08 09:53:12.279 | e2febe456a7c4028ae7e9a86379dd885 | 5b5cc16af6b144b1af5bf78621c5ab7b | 154e72f88ab9497dacbb2d28865d2365 | 3558-fc817e | WARNING | module_admin.service.login_service:authenticate_user:135 - 密码错误
|
|
||||||
2026-09-08 09:53:12.279 | e2febe456a7c4028ae7e9a86379dd885 | 5b5cc16af6b144b1af5bf78621c5ab7b | 154e72f88ab9497dacbb2d28865d2365 | 3558-fc817e | WARNING | common.annotation.log_annotation:wrapper:194 - 密码错误
|
|
||||||
2026-09-08 10:02:17.309 | 4dff445a48874cbfa71fdb73a712344f | e3cb92a6ae934d4a9050cd37ea22c21b | 61a7365813cd44ddaf03e00244106b94 | 13164-331d3d | WARNING | module_admin.service.login_service:__check_login_captcha:169 - 验证码已失效
|
|
||||||
2026-09-08 10:02:17.318 | 4dff445a48874cbfa71fdb73a712344f | e3cb92a6ae934d4a9050cd37ea22c21b | 61a7365813cd44ddaf03e00244106b94 | 13164-331d3d | WARNING | common.annotation.log_annotation:wrapper:194 - 验证码已失效
|
|
||||||
2026-09-08 10:02:37.330 | | | | 13164-331d3d | WARNING | config.get_scheduler:on_lock_lost:273 - ⚠️ Worker 13164-331d3d 失去 Application 锁
|
|
||||||
2026-09-08 10:04:37.515 | ad29073730144887898e61af9ba2d503 | ad849aa8feb8447aa95b3e9a00bb0e57 | 4d9d4aa2051743f5af843f48ee24594c | 16837-6e0019 | WARNING | module_admin.service.login_service:__check_login_captcha:169 - 验证码已失效
|
|
||||||
2026-09-08 10:04:37.516 | ad29073730144887898e61af9ba2d503 | ad849aa8feb8447aa95b3e9a00bb0e57 | 4d9d4aa2051743f5af843f48ee24594c | 16837-6e0019 | WARNING | common.annotation.log_annotation:wrapper:194 - 验证码已失效
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,47 +0,0 @@
|
|||||||
2026-09-20 08:22:12.316 | 4b4acc43447940e486d90eeba4da9c71 | e22ee9a9ff254df399d3403d82f69a08 | 5f669b5bb9cd452db091cdb2d1e2210b | 16993-cd71f0 | WARNING | module_admin.service.login_service:get_current_user:221 - 用户token已失效,请重新登录
|
|
||||||
2026-09-20 09:06:25.361 | a2ac86d4114e4def8802b7aa3941066c | 3241d5676148416ab0195bec1b4001f8 | 6fd87b380d6740b29fd0d1c832003d80 | 16993-cd71f0 | WARNING | module_admin.service.login_service:__check_login_captcha:169 - 验证码已失效
|
|
||||||
2026-09-20 09:06:25.363 | a2ac86d4114e4def8802b7aa3941066c | 3241d5676148416ab0195bec1b4001f8 | 6fd87b380d6740b29fd0d1c832003d80 | 16993-cd71f0 | WARNING | common.annotation.log_annotation:wrapper:194 - 验证码已失效
|
|
||||||
2026-09-20 09:34:16.698 | 602fe7743cd84835b412b37a95e173e0 | 2b5b354671e54d75a4af3414e5f08106 | eca7b264a68a42a7bb615f2bbfefbf71 | 16993-cd71f0 | WARNING | module_admin.service.login_service:__check_login_captcha:172 - 验证码错误
|
|
||||||
2026-09-20 09:34:16.700 | 602fe7743cd84835b412b37a95e173e0 | 2b5b354671e54d75a4af3414e5f08106 | eca7b264a68a42a7bb615f2bbfefbf71 | 16993-cd71f0 | WARNING | common.annotation.log_annotation:wrapper:194 - 验证码错误
|
|
||||||
2026-09-20 09:43:58.641 | fd31026c195d49cd982213a6905a9b43 | d263be394fbd4a99976ee4ad4950083d | ef70780d15ca47e880f92e840ed4bcf8 | 16993-cd71f0 | WARNING | module_admin.service.login_service:get_current_user:279 - 用户token已失效,请重新登录
|
|
||||||
2026-09-20 10:04:28.898 | d66dbb9a7a9d4a03bb7db6f3f10e2bd1 | dfa2aaa12fbb45f4a2f47abf766dccc4 | 6c07441d3dfd473e8397b7c5fa6baac5 | 16993-cd71f0 | ERROR | common.annotation.log_annotation:wrapper:199 - 新增用户admin失败,登录账号已存在
|
|
||||||
2026-09-20 10:04:32.035 | 1d12b62bcc9b41c191fe086905a49beb | b1fdb9fba55447d8976b3ed8c2bc0280 | 2f4a44c679a34d8781a45191abfa7987 | 16993-cd71f0 | ERROR | common.annotation.log_annotation:wrapper:199 - 新增用户admin1失败,邮箱账号已存在
|
|
||||||
2026-09-20 10:04:43.176 | e3982edb2a9a474aba72beef8bf68e9f | ab43381480ee4fda9808645d08c25635 | 537175b887df487eb1b7e6739de1c9da | 16993-cd71f0 | ERROR | common.annotation.log_annotation:wrapper:199 - 新增用户shierfeng失败,邮箱账号已存在
|
|
||||||
2026-09-20 10:05:45.737 | a2482c9df9f649259d08e3642bdf0488 | e66b674fdac647e4b0ef9c54851001d9 | 5de9f2b06af74d5396289bb3ea8ec2b8 | 16993-cd71f0 | ERROR | common.annotation.log_annotation:wrapper:199 - 新密码不能与旧密码相同
|
|
||||||
2026-09-20 11:42:14.773 | | | | 31890-bb233f | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-784' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.136 seconds
|
|
||||||
2026-09-20 11:42:16.249 | | | | 31890-bb233f | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-964' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.105 seconds
|
|
||||||
2026-09-20 12:17:22.659 | | | | 57933-537a04 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-13' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.113 seconds
|
|
||||||
2026-09-20 12:17:29.067 | | | | 58127-ed7958 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-964' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.105 seconds
|
|
||||||
2026-09-20 12:46:48.547 | 5d5c50d3b58b455aa80a68c91a1a5b62 | ae9e09d7e564480ebeb91e41fdcd4b6d | 77fe7828932949f894e7c4cd8887646b | 16993-cd71f0 | WARNING | module_admin.service.login_service:__check_login_captcha:169 - 验证码已失效
|
|
||||||
2026-09-20 12:46:48.549 | 5d5c50d3b58b455aa80a68c91a1a5b62 | ae9e09d7e564480ebeb91e41fdcd4b6d | 77fe7828932949f894e7c4cd8887646b | 16993-cd71f0 | WARNING | common.annotation.log_annotation:wrapper:194 - 验证码已失效
|
|
||||||
2026-09-20 13:18:52.359 | dd3c9b48716a4a58b31b4625f20634aa | 13c18f6b346d4cdf99632eb435cf2d87 | 21419c5c356d438a8e159b3010860caa | 16993-cd71f0 | WARNING | module_admin.service.login_service:get_current_user:279 - 用户token已失效,请重新登录
|
|
||||||
2026-09-20 17:47:23.214 | | | | 58041-740809 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-181' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.177 seconds
|
|
||||||
2026-09-20 17:47:23.620 | | | | 58041-740809 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-247' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.109 seconds
|
|
||||||
2026-09-20 17:47:23.869 | | | | 58041-740809 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-283' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.121 seconds
|
|
||||||
2026-09-20 17:49:35.457 | | | | 60128-363e41 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-784' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.110 seconds
|
|
||||||
2026-09-20 17:50:37.968 | | | | 61359-b363d2 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-784' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.113 seconds
|
|
||||||
2026-09-20 17:53:57.014 | | | | 64317-1bf7cd | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-76' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.129 seconds
|
|
||||||
2026-09-20 17:53:57.604 | | | | 64317-1bf7cd | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-181' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.175 seconds
|
|
||||||
2026-09-20 17:54:02.489 | | | | 64317-1bf7cd | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-964' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.124 seconds
|
|
||||||
2026-09-20 18:02:59.450 | | | | 72520-28953b | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-181' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.164 seconds
|
|
||||||
2026-09-20 18:03:00.429 | | | | 72520-28953b | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-289' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.137 seconds
|
|
||||||
2026-09-20 18:03:05.635 | | | | 72520-28953b | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-784' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.283 seconds
|
|
||||||
2026-09-20 18:03:07.372 | | | | 72520-28953b | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-964' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.139 seconds
|
|
||||||
2026-09-20 18:09:24.200 | | | | 80215-4e32b1 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-253' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.158 seconds
|
|
||||||
2026-09-20 18:09:28.242 | | | | 80215-4e32b1 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-772' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.105 seconds
|
|
||||||
2026-09-20 18:09:29.458 | | | | 80215-4e32b1 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-994' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.106 seconds
|
|
||||||
2026-09-20 18:14:10.968 | | | | 84308-7ecd65 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-676' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.120 seconds
|
|
||||||
2026-09-20 18:14:13.598 | | | | 84308-7ecd65 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-979' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.114 seconds
|
|
||||||
2026-09-20 18:20:04.515 | | | | 87818-33a210 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-979' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.109 seconds
|
|
||||||
2026-09-20 18:29:21.351 | | | | 92649-eff25d | WARNING | module_admin.service.login_service:authenticate_user:110 - 打印User:$2b$12$sJ2mSJgH2GsXKAfijj1/yu.6Pks28OyfkpLSii0DKf5nsXfi6O2t6
|
|
||||||
2026-09-20 18:29:21.590 | | | | 92649-eff25d | WARNING | module_admin.service.login_service:authenticate_user:111 - 打印User:False
|
|
||||||
2026-09-20 18:29:21.591 | | | | 92649-eff25d | WARNING | module_admin.service.login_service:authenticate_user:135 - 密码错误
|
|
||||||
2026-09-20 18:29:48.210 | | | | 93061-767fb0 | WARNING | module_admin.service.login_service:authenticate_user:110 - 打印User:$2b$12$gXCowPRYJUknyms/qz3KEOjHNaFdlszai/ptNLG8kca3C1daZ9xey
|
|
||||||
2026-09-20 18:29:48.429 | | | | 93061-767fb0 | WARNING | module_admin.service.login_service:authenticate_user:111 - 打印User:False
|
|
||||||
2026-09-20 18:29:48.430 | | | | 93061-767fb0 | WARNING | module_admin.service.login_service:authenticate_user:135 - 密码错误
|
|
||||||
2026-09-20 18:30:16.941 | | | | 93497-f06833 | WARNING | module_admin.service.login_service:authenticate_user:133 - 密码错误
|
|
||||||
2026-09-20 18:30:31.597 | | | | 93971-584c3b | WARNING | module_admin.service.login_service:authenticate_user:133 - 密码错误
|
|
||||||
2026-09-20 18:30:56.162 | | | | 94357-625365 | WARNING | module_admin.service.login_service:authenticate_user:133 - 密码错误
|
|
||||||
2026-09-20 18:59:56.301 | | | | 16082-90d8eb | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-652' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.134 seconds
|
|
||||||
2026-09-20 20:59:08.538 | | | | 94089-caeb0d | WARNING | config.get_scheduler:on_lock_lost:273 - ⚠️ Worker 94089-caeb0d 失去 Application 锁
|
|
||||||
2026-09-20 21:25:50.212 | cb2c7654e5b94cde929029eaf4b267ee | 6fe2f1d9479d4b3c8a77a4f50f788af9 | 69c6ef438e3f45e298848ceef5c322c5 | 94089-caeb0d | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,32 +0,0 @@
|
|||||||
2026-09-21 18:40:56.930 | | | | 61855-bf03aa | ERROR | sqlalchemy.pool.base:_close_connection:376 - Exception closing connection <AdaptedConnection <asyncmy.connection.Connection object at 0x116e83310>>
|
|
||||||
Traceback (most recent call last):
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/pool/base.py", line 374, in _close_connection
|
|
||||||
self._dialect.do_close(connection)
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/engine/default.py", line 721, in do_close
|
|
||||||
dbapi_connection.close()
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/dialects/mysql/asyncmy.py", line 114, in close
|
|
||||||
self.await_(self._connection.ensure_closed())
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only
|
|
||||||
return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn
|
|
||||||
value = await result
|
|
||||||
File "asyncmy/connection.pyx", line 367, in ensure_closed
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/streams.py", line 343, in wait_closed
|
|
||||||
await self._protocol._get_close_waiter(self)
|
|
||||||
BrokenPipeError: [Errno 32] Broken pipe
|
|
||||||
2026-09-21 18:40:57.080 | | | | 61855-bf03aa | ERROR | sqlalchemy.pool.base:_close_connection:376 - Exception closing connection <AdaptedConnection <asyncmy.connection.Connection object at 0x116c77e80>>
|
|
||||||
Traceback (most recent call last):
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/pool/base.py", line 374, in _close_connection
|
|
||||||
self._dialect.do_close(connection)
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/engine/default.py", line 721, in do_close
|
|
||||||
dbapi_connection.close()
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/dialects/mysql/asyncmy.py", line 114, in close
|
|
||||||
self.await_(self._connection.ensure_closed())
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only
|
|
||||||
return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn
|
|
||||||
value = await result
|
|
||||||
File "asyncmy/connection.pyx", line 367, in ensure_closed
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/streams.py", line 343, in wait_closed
|
|
||||||
await self._protocol._get_close_waiter(self)
|
|
||||||
BrokenPipeError: [Errno 32] Broken pipe
|
|
||||||
@@ -1,193 +0,0 @@
|
|||||||
2026-09-21 10:13:52.818 | | | | 61855-bf03aa | INFO | server:lifespan:90 - ⏰️ ShiErFeng-FastAPI开始启动
|
|
||||||
2026-09-21 10:13:52.819 | | | | 61855-bf03aa | INFO | utils.common_util:worship:22 -
|
|
||||||
////////////////////////////////////////////////////////////////////
|
|
||||||
// _ooOoo_ //
|
|
||||||
// o8888888o //
|
|
||||||
// 88" . "88 //
|
|
||||||
// (| ^_^ |) //
|
|
||||||
// O\ = /O //
|
|
||||||
// ____/`---'\____ //
|
|
||||||
// .' \\| |// `. //
|
|
||||||
// / \\||| : |||// \ //
|
|
||||||
// / _||||| -:- |||||- \ //
|
|
||||||
// | | \\\ - /// | | //
|
|
||||||
// | \_| ''\---/'' | | //
|
|
||||||
// \ .-\__ `-` ___/-. / //
|
|
||||||
// ___`. .' /--.--\ `. . ___ //
|
|
||||||
// ."" '< `.___\_<|>_/___.' >'"". //
|
|
||||||
// | | : `- \`.;`\ _ /`;.`/ - ` : | | //
|
|
||||||
// \ \ `-. \_ __\ /__ _/ .-` / / //
|
|
||||||
// ========`-.____`-.___\_____/___.-`____.-'======== //
|
|
||||||
// `=---=' //
|
|
||||||
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ //
|
|
||||||
// 佛祖保佑 永不宕机 永无BUG //
|
|
||||||
////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
2026-09-21 10:13:52.821 | | | | 61855-bf03aa | INFO | config.get_db:init_create_table:25 - 🔎 初始化数据库连接...
|
|
||||||
2026-09-21 10:13:52.895 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - SELECT DATABASE()
|
|
||||||
2026-09-21 10:13:52.895 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-09-21 10:13:52.897 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - SELECT @@sql_mode
|
|
||||||
2026-09-21 10:13:52.898 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-09-21 10:13:52.899 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - SELECT @@lower_case_table_names
|
|
||||||
2026-09-21 10:13:52.899 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-09-21 10:13:52.901 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - BEGIN (implicit)
|
|
||||||
2026-09-21 10:13:52.901 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`sys_config`
|
|
||||||
2026-09-21 10:13:52.901 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-09-21 10:13:52.965 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`sys_dict_type`
|
|
||||||
2026-09-21 10:13:52.965 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-09-21 10:13:52.969 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`sys_dict_data`
|
|
||||||
2026-09-21 10:13:52.969 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-09-21 10:13:52.971 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`sys_job`
|
|
||||||
2026-09-21 10:13:52.972 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-09-21 10:13:52.973 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`sys_job_log`
|
|
||||||
2026-09-21 10:13:52.973 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-09-21 10:13:52.976 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`sys_logininfor`
|
|
||||||
2026-09-21 10:13:52.976 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-09-21 10:13:52.976 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`sys_oper_log`
|
|
||||||
2026-09-21 10:13:52.977 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-09-21 10:13:52.978 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`sys_dept`
|
|
||||||
2026-09-21 10:13:52.978 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-09-21 10:13:52.984 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`sys_user`
|
|
||||||
2026-09-21 10:13:52.984 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-09-21 10:13:52.986 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`sys_user_role`
|
|
||||||
2026-09-21 10:13:52.986 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-09-21 10:13:52.987 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`sys_user_post`
|
|
||||||
2026-09-21 10:13:52.987 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-09-21 10:13:52.988 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`sys_menu`
|
|
||||||
2026-09-21 10:13:52.989 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-09-21 10:13:52.991 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`sys_post`
|
|
||||||
2026-09-21 10:13:52.991 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-09-21 10:13:52.992 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`sys_role`
|
|
||||||
2026-09-21 10:13:52.992 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-09-21 10:13:52.994 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`sys_role_dept`
|
|
||||||
2026-09-21 10:13:52.994 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-09-21 10:13:52.995 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`sys_role_menu`
|
|
||||||
2026-09-21 10:13:52.995 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-09-21 10:13:52.997 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`sys_notice`
|
|
||||||
2026-09-21 10:13:52.997 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-09-21 10:13:52.997 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`biz_strain`
|
|
||||||
2026-09-21 10:13:52.998 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-09-21 10:13:52.999 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`biz_warehouse`
|
|
||||||
2026-09-21 10:13:52.999 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-09-21 10:13:53.001 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`biz_customer`
|
|
||||||
2026-09-21 10:13:53.001 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-09-21 10:13:53.002 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`biz_customer_site`
|
|
||||||
2026-09-21 10:13:53.002 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-09-21 10:13:53.003 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`biz_production_line`
|
|
||||||
2026-09-21 10:13:53.003 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-09-21 10:13:53.004 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`biz_pallet`
|
|
||||||
2026-09-21 10:13:53.004 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-09-21 10:13:53.005 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`biz_user_warehouse`
|
|
||||||
2026-09-21 10:13:53.005 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-09-21 10:13:53.006 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`biz_user_site`
|
|
||||||
2026-09-21 10:13:53.006 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-09-21 10:13:53.007 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`biz_inbound_order`
|
|
||||||
2026-09-21 10:13:53.007 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-09-21 10:13:53.008 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`biz_inbound_item`
|
|
||||||
2026-09-21 10:13:53.008 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-09-21 10:13:53.009 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`biz_filling_record`
|
|
||||||
2026-09-21 10:13:53.009 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-09-21 10:13:53.011 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`biz_shipment_order`
|
|
||||||
2026-09-21 10:13:53.011 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-09-21 10:13:53.013 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`biz_shipment_item`
|
|
||||||
2026-09-21 10:13:53.013 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-09-21 10:13:53.014 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`biz_usage_record`
|
|
||||||
2026-09-21 10:13:53.015 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-09-21 10:13:53.016 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`biz_return_order`
|
|
||||||
2026-09-21 10:13:53.016 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-09-21 10:13:53.017 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`biz_return_item`
|
|
||||||
2026-09-21 10:13:53.017 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-09-21 10:13:53.019 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`biz_pallet_inventory`
|
|
||||||
2026-09-21 10:13:53.019 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-09-21 10:13:53.020 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`biz_pallet_event`
|
|
||||||
2026-09-21 10:13:53.020 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-09-21 10:13:53.022 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`gen_table`
|
|
||||||
2026-09-21 10:13:53.022 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-09-21 10:13:53.023 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - DESCRIBE `shierfeng-fastapi`.`gen_table_column`
|
|
||||||
2026-09-21 10:13:53.023 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - [raw sql] ()
|
|
||||||
2026-09-21 10:13:53.024 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - COMMIT
|
|
||||||
2026-09-21 10:13:53.025 | | | | 61855-bf03aa | INFO | config.get_db:init_create_table:28 - ✅️ 数据库连接成功
|
|
||||||
2026-09-21 10:13:53.025 | | | | 61855-bf03aa | INFO | config.get_redis:check_redis_connection:57 - 🔎 开始连接redis...
|
|
||||||
2026-09-21 10:13:53.027 | | | | 61855-bf03aa | INFO | config.get_redis:check_redis_connection:63 - ✅️ redis连接成功
|
|
||||||
2026-09-21 10:13:53.031 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - BEGIN (implicit)
|
|
||||||
2026-09-21 10:13:53.050 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - SELECT sys_dict_type.dict_id, sys_dict_type.dict_name, sys_dict_type.dict_type, sys_dict_type.status, sys_dict_type.create_by, sys_dict_type.create_time, sys_dict_type.update_by, sys_dict_type.update_time, sys_dict_type.remark
|
|
||||||
FROM sys_dict_type
|
|
||||||
2026-09-21 10:13:53.050 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - [generated in 0.00032s] ()
|
|
||||||
2026-09-21 10:13:53.058 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - SELECT DISTINCT sys_dict_data.dict_code, sys_dict_data.dict_sort, sys_dict_data.dict_label, sys_dict_data.dict_value, sys_dict_data.dict_type, sys_dict_data.css_class, sys_dict_data.list_class, sys_dict_data.is_default, sys_dict_data.status, sys_dict_data.create_by, sys_dict_data.create_time, sys_dict_data.update_by, sys_dict_data.update_time, sys_dict_data.remark
|
|
||||||
FROM sys_dict_type LEFT OUTER JOIN sys_dict_data ON sys_dict_type.dict_type = sys_dict_data.dict_type AND sys_dict_data.status = %s
|
|
||||||
WHERE sys_dict_type.dict_type = %s AND sys_dict_type.status = %s ORDER BY sys_dict_data.dict_sort
|
|
||||||
2026-09-21 10:13:53.058 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - [generated in 0.00030s] ('0', 'sys_user_sex', '0')
|
|
||||||
2026-09-21 10:13:53.062 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - SELECT DISTINCT sys_dict_data.dict_code, sys_dict_data.dict_sort, sys_dict_data.dict_label, sys_dict_data.dict_value, sys_dict_data.dict_type, sys_dict_data.css_class, sys_dict_data.list_class, sys_dict_data.is_default, sys_dict_data.status, sys_dict_data.create_by, sys_dict_data.create_time, sys_dict_data.update_by, sys_dict_data.update_time, sys_dict_data.remark
|
|
||||||
FROM sys_dict_type LEFT OUTER JOIN sys_dict_data ON sys_dict_type.dict_type = sys_dict_data.dict_type AND sys_dict_data.status = %s
|
|
||||||
WHERE sys_dict_type.dict_type = %s AND sys_dict_type.status = %s ORDER BY sys_dict_data.dict_sort
|
|
||||||
2026-09-21 10:13:53.063 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - [cached since 0.004945s ago] ('0', 'sys_show_hide', '0')
|
|
||||||
2026-09-21 10:13:53.065 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - SELECT DISTINCT sys_dict_data.dict_code, sys_dict_data.dict_sort, sys_dict_data.dict_label, sys_dict_data.dict_value, sys_dict_data.dict_type, sys_dict_data.css_class, sys_dict_data.list_class, sys_dict_data.is_default, sys_dict_data.status, sys_dict_data.create_by, sys_dict_data.create_time, sys_dict_data.update_by, sys_dict_data.update_time, sys_dict_data.remark
|
|
||||||
FROM sys_dict_type LEFT OUTER JOIN sys_dict_data ON sys_dict_type.dict_type = sys_dict_data.dict_type AND sys_dict_data.status = %s
|
|
||||||
WHERE sys_dict_type.dict_type = %s AND sys_dict_type.status = %s ORDER BY sys_dict_data.dict_sort
|
|
||||||
2026-09-21 10:13:53.066 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - [cached since 0.007828s ago] ('0', 'sys_normal_disable', '0')
|
|
||||||
2026-09-21 10:13:53.071 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - SELECT DISTINCT sys_dict_data.dict_code, sys_dict_data.dict_sort, sys_dict_data.dict_label, sys_dict_data.dict_value, sys_dict_data.dict_type, sys_dict_data.css_class, sys_dict_data.list_class, sys_dict_data.is_default, sys_dict_data.status, sys_dict_data.create_by, sys_dict_data.create_time, sys_dict_data.update_by, sys_dict_data.update_time, sys_dict_data.remark
|
|
||||||
FROM sys_dict_type LEFT OUTER JOIN sys_dict_data ON sys_dict_type.dict_type = sys_dict_data.dict_type AND sys_dict_data.status = %s
|
|
||||||
WHERE sys_dict_type.dict_type = %s AND sys_dict_type.status = %s ORDER BY sys_dict_data.dict_sort
|
|
||||||
2026-09-21 10:13:53.071 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - [cached since 0.01375s ago] ('0', 'sys_job_status', '0')
|
|
||||||
2026-09-21 10:13:53.074 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - SELECT DISTINCT sys_dict_data.dict_code, sys_dict_data.dict_sort, sys_dict_data.dict_label, sys_dict_data.dict_value, sys_dict_data.dict_type, sys_dict_data.css_class, sys_dict_data.list_class, sys_dict_data.is_default, sys_dict_data.status, sys_dict_data.create_by, sys_dict_data.create_time, sys_dict_data.update_by, sys_dict_data.update_time, sys_dict_data.remark
|
|
||||||
FROM sys_dict_type LEFT OUTER JOIN sys_dict_data ON sys_dict_type.dict_type = sys_dict_data.dict_type AND sys_dict_data.status = %s
|
|
||||||
WHERE sys_dict_type.dict_type = %s AND sys_dict_type.status = %s ORDER BY sys_dict_data.dict_sort
|
|
||||||
2026-09-21 10:13:53.074 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - [cached since 0.01605s ago] ('0', 'sys_job_group', '0')
|
|
||||||
2026-09-21 10:13:53.079 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - SELECT DISTINCT sys_dict_data.dict_code, sys_dict_data.dict_sort, sys_dict_data.dict_label, sys_dict_data.dict_value, sys_dict_data.dict_type, sys_dict_data.css_class, sys_dict_data.list_class, sys_dict_data.is_default, sys_dict_data.status, sys_dict_data.create_by, sys_dict_data.create_time, sys_dict_data.update_by, sys_dict_data.update_time, sys_dict_data.remark
|
|
||||||
FROM sys_dict_type LEFT OUTER JOIN sys_dict_data ON sys_dict_type.dict_type = sys_dict_data.dict_type AND sys_dict_data.status = %s
|
|
||||||
WHERE sys_dict_type.dict_type = %s AND sys_dict_type.status = %s ORDER BY sys_dict_data.dict_sort
|
|
||||||
2026-09-21 10:13:53.079 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - [cached since 0.02133s ago] ('0', 'sys_job_executor', '0')
|
|
||||||
2026-09-21 10:13:53.082 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - SELECT DISTINCT sys_dict_data.dict_code, sys_dict_data.dict_sort, sys_dict_data.dict_label, sys_dict_data.dict_value, sys_dict_data.dict_type, sys_dict_data.css_class, sys_dict_data.list_class, sys_dict_data.is_default, sys_dict_data.status, sys_dict_data.create_by, sys_dict_data.create_time, sys_dict_data.update_by, sys_dict_data.update_time, sys_dict_data.remark
|
|
||||||
FROM sys_dict_type LEFT OUTER JOIN sys_dict_data ON sys_dict_type.dict_type = sys_dict_data.dict_type AND sys_dict_data.status = %s
|
|
||||||
WHERE sys_dict_type.dict_type = %s AND sys_dict_type.status = %s ORDER BY sys_dict_data.dict_sort
|
|
||||||
2026-09-21 10:13:53.082 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - [cached since 0.02433s ago] ('0', 'sys_yes_no', '0')
|
|
||||||
2026-09-21 10:13:53.084 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - SELECT DISTINCT sys_dict_data.dict_code, sys_dict_data.dict_sort, sys_dict_data.dict_label, sys_dict_data.dict_value, sys_dict_data.dict_type, sys_dict_data.css_class, sys_dict_data.list_class, sys_dict_data.is_default, sys_dict_data.status, sys_dict_data.create_by, sys_dict_data.create_time, sys_dict_data.update_by, sys_dict_data.update_time, sys_dict_data.remark
|
|
||||||
FROM sys_dict_type LEFT OUTER JOIN sys_dict_data ON sys_dict_type.dict_type = sys_dict_data.dict_type AND sys_dict_data.status = %s
|
|
||||||
WHERE sys_dict_type.dict_type = %s AND sys_dict_type.status = %s ORDER BY sys_dict_data.dict_sort
|
|
||||||
2026-09-21 10:13:53.084 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - [cached since 0.02646s ago] ('0', 'sys_notice_type', '0')
|
|
||||||
2026-09-21 10:13:53.087 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - SELECT DISTINCT sys_dict_data.dict_code, sys_dict_data.dict_sort, sys_dict_data.dict_label, sys_dict_data.dict_value, sys_dict_data.dict_type, sys_dict_data.css_class, sys_dict_data.list_class, sys_dict_data.is_default, sys_dict_data.status, sys_dict_data.create_by, sys_dict_data.create_time, sys_dict_data.update_by, sys_dict_data.update_time, sys_dict_data.remark
|
|
||||||
FROM sys_dict_type LEFT OUTER JOIN sys_dict_data ON sys_dict_type.dict_type = sys_dict_data.dict_type AND sys_dict_data.status = %s
|
|
||||||
WHERE sys_dict_type.dict_type = %s AND sys_dict_type.status = %s ORDER BY sys_dict_data.dict_sort
|
|
||||||
2026-09-21 10:13:53.087 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - [cached since 0.02908s ago] ('0', 'sys_notice_status', '0')
|
|
||||||
2026-09-21 10:13:53.090 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - SELECT DISTINCT sys_dict_data.dict_code, sys_dict_data.dict_sort, sys_dict_data.dict_label, sys_dict_data.dict_value, sys_dict_data.dict_type, sys_dict_data.css_class, sys_dict_data.list_class, sys_dict_data.is_default, sys_dict_data.status, sys_dict_data.create_by, sys_dict_data.create_time, sys_dict_data.update_by, sys_dict_data.update_time, sys_dict_data.remark
|
|
||||||
FROM sys_dict_type LEFT OUTER JOIN sys_dict_data ON sys_dict_type.dict_type = sys_dict_data.dict_type AND sys_dict_data.status = %s
|
|
||||||
WHERE sys_dict_type.dict_type = %s AND sys_dict_type.status = %s ORDER BY sys_dict_data.dict_sort
|
|
||||||
2026-09-21 10:13:53.090 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - [cached since 0.03221s ago] ('0', 'sys_oper_type', '0')
|
|
||||||
2026-09-21 10:13:53.093 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - SELECT DISTINCT sys_dict_data.dict_code, sys_dict_data.dict_sort, sys_dict_data.dict_label, sys_dict_data.dict_value, sys_dict_data.dict_type, sys_dict_data.css_class, sys_dict_data.list_class, sys_dict_data.is_default, sys_dict_data.status, sys_dict_data.create_by, sys_dict_data.create_time, sys_dict_data.update_by, sys_dict_data.update_time, sys_dict_data.remark
|
|
||||||
FROM sys_dict_type LEFT OUTER JOIN sys_dict_data ON sys_dict_type.dict_type = sys_dict_data.dict_type AND sys_dict_data.status = %s
|
|
||||||
WHERE sys_dict_type.dict_type = %s AND sys_dict_type.status = %s ORDER BY sys_dict_data.dict_sort
|
|
||||||
2026-09-21 10:13:53.094 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - [cached since 0.03604s ago] ('0', 'sys_common_status', '0')
|
|
||||||
2026-09-21 10:13:53.096 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - ROLLBACK
|
|
||||||
2026-09-21 10:13:53.101 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - BEGIN (implicit)
|
|
||||||
2026-09-21 10:13:53.102 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - SELECT DISTINCT sys_config.config_id, sys_config.config_name, sys_config.config_key, sys_config.config_value, sys_config.config_type, sys_config.create_by, sys_config.create_time, sys_config.update_by, sys_config.update_time, sys_config.remark
|
|
||||||
FROM sys_config
|
|
||||||
WHERE true = 1 ORDER BY sys_config.config_id
|
|
||||||
2026-09-21 10:13:53.102 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - [generated in 0.00022s] ()
|
|
||||||
2026-09-21 10:13:53.111 | | | | 61855-bf03aa | INFO | sqlalchemy.log:log:210 - ROLLBACK
|
|
||||||
2026-09-21 10:13:53.112 | | | | 61855-bf03aa | INFO | config.get_scheduler:init_system_scheduler:210 - 🔎 Worker 61855-bf03aa 尝试获取 Application 锁...
|
|
||||||
2026-09-21 10:13:53.114 | | | | 61855-bf03aa | INFO | config.get_scheduler:_start_scheduler_as_leader:235 - 🎯 Worker 61855-bf03aa 持有 Application 锁,开始启动定时任务...
|
|
||||||
2026-09-21 10:13:53.142 | | | | 61855-bf03aa | INFO | apscheduler.schedulers.base:start:214 - Scheduler started
|
|
||||||
2026-09-21 10:13:53.253 | | | | 61855-bf03aa | INFO | config.get_scheduler:_start_scheduler_as_leader:261 - ✅️ 系统初始定时任务加载成功
|
|
||||||
2026-09-21 10:13:53.755 | | | | 61855-bf03aa | INFO | server:lifespan:103 - 🚀 ShiErFeng-FastAPI启动成功
|
|
||||||
2026-09-21 10:13:53.759 | | | | 61855-bf03aa | INFO | server:lifespan:115 - 💻 应用地址:
|
|
||||||
🏠 Local: http://127.0.0.1:9099
|
|
||||||
📡 Network: http://172.16.146.99:9099
|
|
||||||
📡 Network: http://172.16.142.109:9099
|
|
||||||
📡 Network: http://172.16.224.1:9099
|
|
||||||
📡 Network: http://192.168.216.1:9099
|
|
||||||
2026-09-21 10:13:53.759 | | | | 61855-bf03aa | INFO | server:lifespan:122 - 📄 Swagger文档:
|
|
||||||
🏠 Local: http://127.0.0.1:9099/docs
|
|
||||||
📡 Network: http://172.16.146.99:9099/docs
|
|
||||||
📡 Network: http://172.16.142.109:9099/docs
|
|
||||||
📡 Network: http://172.16.224.1:9099/docs
|
|
||||||
📡 Network: http://192.168.216.1:9099/docs
|
|
||||||
2026-09-21 10:13:53.759 | | | | 61855-bf03aa | INFO | server:lifespan:129 - 📚 ReDoc文档:
|
|
||||||
🏠 Local: http://127.0.0.1:9099/redoc
|
|
||||||
📡 Network: http://172.16.146.99:9099/redoc
|
|
||||||
📡 Network: http://172.16.142.109:9099/redoc
|
|
||||||
📡 Network: http://172.16.224.1:9099/redoc
|
|
||||||
📡 Network: http://192.168.216.1:9099/redoc
|
|
||||||
2026-09-21 18:40:56.795 | | | | 61855-bf03aa | INFO | config.get_redis:close_redis_pool:85 - ✅️ 关闭redis连接成功
|
|
||||||
2026-09-21 18:40:57.041 | | | | 61855-bf03aa | INFO | config.get_scheduler:close_system_scheduler:768 - ✅️ 关闭定时任务成功
|
|
||||||
2026-09-21 18:40:57.051 | | | | 61855-bf03aa | INFO | apscheduler.schedulers.base:shutdown:245 - Scheduler has been shut down
|
|
||||||
2026-09-21 18:40:57.077 | | | | 61855-bf03aa | INFO | config.get_scheduler:close_system_scheduler:774 - 🔓 Worker 61855-bf03aa 释放 Application 锁
|
|
||||||
@@ -1,865 +0,0 @@
|
|||||||
2026-09-22 10:18:42.014 | c67f56d9e06b4ff9b0df0307b310acf1 | e7bf03f3985b4cd1a17c53316ccc1c57 | 16a71940dde04f61b06084ef747adb35 | 76540-54b2cc | WARNING | common.annotation.log_annotation:wrapper:194 - 存在下级部门,不允许删除
|
|
||||||
2026-09-22 10:19:35.435 | ebc19a67e42a40ec9174d89fe47588f9 | 3d7efb2b710d4595b0de10b34865f905 | 4250cfd7ec8e42a2ad031f9b8a643a79 | 76540-54b2cc | WARNING | common.annotation.log_annotation:wrapper:194 - 部门存在用户,不允许删除
|
|
||||||
2026-09-22 10:19:41.831 | f8c6319564384ee9a8959686a5b1bc19 | 6a2dc693410d4cb788b16f9d4f95056c | 984b4a1ddd574fdbaf75b54ea37fb207 | 76540-54b2cc | WARNING | common.annotation.log_annotation:wrapper:194 - 部门存在用户,不允许删除
|
|
||||||
2026-09-22 11:08:34.493 | 75f92b597fe6486d9f9c68073eedff31 | 1984201c0f604cf38bc4167d3d8de2bf | c14edb9c8ce84ad4a4bb9000b0ff96e3 | 76540-54b2cc | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-22 13:09:15.676 | 90cdba067fdc471393e87d456603cf92 | 1cf6c85fa12f4f52af203f8e4eff32bf | 566753bee664495580fa822c1f551794 | 76540-54b2cc | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-22 13:42:34.457 | | | | 86619-9b6b60 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-964' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.110 seconds
|
|
||||||
2026-09-22 18:11:19.770 | | | | 12973-c0e2e4 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-4' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.143 seconds
|
|
||||||
2026-09-22 18:32:32.062 | | | | 35168-f5f084 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-4' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.105 seconds
|
|
||||||
2026-09-22 19:27:26.746 | | | | 57152-6a64c1 | WARNING | config.get_scheduler:on_lock_lost:273 - ⚠️ Worker 57152-6a64c1 失去 Application 锁
|
|
||||||
2026-09-22 22:24:38.614 | | | | 24817-caa44a | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-4' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.118 seconds
|
|
||||||
2026-09-22 22:24:38.636 | | | | 24819-8b91d3 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-10' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.109 seconds
|
|
||||||
2026-09-22 22:24:38.728 | | | | 24821-323481 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-10' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.177 seconds
|
|
||||||
2026-09-22 22:24:38.827 | | | | 24820-cd85d4 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-19' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.172 seconds
|
|
||||||
2026-09-22 22:24:38.888 | | | | 24818-25445c | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-19' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.250 seconds
|
|
||||||
2026-09-22 22:52:36.300 | | | | 61048-169acd | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-4' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.102 seconds
|
|
||||||
2026-09-22 23:10:59.657 | | | | 78383-c16ef2 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-1' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 2.626 seconds
|
|
||||||
2026-09-22 23:11:09.832 | | | | 78383-c16ef2 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-4' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 9.292 seconds
|
|
||||||
2026-09-22 23:11:10.264 | | | | 78383-c16ef2 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-7' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.235 seconds
|
|
||||||
2026-09-22 23:11:10.486 | | | | 78383-c16ef2 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-10' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.129 seconds
|
|
||||||
2026-09-22 23:11:11.481 | | | | 78383-c16ef2 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-16' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.580 seconds
|
|
||||||
2026-09-22 23:11:12.091 | | | | 78383-c16ef2 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-19' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.259 seconds
|
|
||||||
2026-09-22 23:11:13.035 | | | | 78383-c16ef2 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-22' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.856 seconds
|
|
||||||
2026-09-22 23:11:13.520 | | | | 78383-c16ef2 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-28' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.141 seconds
|
|
||||||
2026-09-22 23:11:14.010 | | | | 78383-c16ef2 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-31' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.185 seconds
|
|
||||||
2026-09-22 23:11:16.736 | | | | 78383-c16ef2 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-43' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.183 seconds
|
|
||||||
2026-09-22 23:11:17.795 | | | | 78383-c16ef2 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-61' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.250 seconds
|
|
||||||
2026-09-22 23:11:18.541 | | | | 78383-c16ef2 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-64' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.124 seconds
|
|
||||||
2026-09-22 23:11:19.391 | | | | 78383-c16ef2 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-67' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.514 seconds
|
|
||||||
2026-09-22 23:11:19.736 | | | | 78383-c16ef2 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-70' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.231 seconds
|
|
||||||
2026-09-22 23:11:20.331 | | | | 78383-c16ef2 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-73' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.501 seconds
|
|
||||||
2026-09-22 23:11:20.756 | | | | 78383-c16ef2 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-76' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.374 seconds
|
|
||||||
2026-09-22 23:11:21.218 | | | | 78383-c16ef2 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task finished name='Task-83' coro=<Queue.join() done, defined at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/queues.py:207> result=None created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/tasks.py:636> took 0.124 seconds
|
|
||||||
2026-09-22 23:11:21.631 | | | | 78383-c16ef2 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-88' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.214 seconds
|
|
||||||
2026-09-22 23:11:21.804 | | | | 78383-c16ef2 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task finished name='Task-90' coro=<BaseEventLoop.shutdown_default_executor() done, defined at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:560> result=None created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/tasks.py:636> took 0.136 seconds
|
|
||||||
2026-09-22 23:11:22.566 | | | | 78383-c16ef2 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-97' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.228 seconds
|
|
||||||
2026-09-22 23:11:23.001 | | | | 78383-c16ef2 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-100' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.185 seconds
|
|
||||||
2026-09-22 23:16:20.261 | | | | 82428-c58b46 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-1' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.530 seconds
|
|
||||||
2026-09-22 23:16:23.668 | | | | 82428-c58b46 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-4' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 3.320 seconds
|
|
||||||
2026-09-22 23:16:23.843 | | | | 82428-c58b46 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-7' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.133 seconds
|
|
||||||
2026-09-22 23:16:24.175 | | | | 82428-c58b46 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-10' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.143 seconds
|
|
||||||
2026-09-22 23:16:24.731 | | | | 82428-c58b46 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-16' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.293 seconds
|
|
||||||
2026-09-22 23:16:25.522 | | | | 82428-c58b46 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-22' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.408 seconds
|
|
||||||
2026-09-22 23:16:26.308 | | | | 82428-c58b46 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-31' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.385 seconds
|
|
||||||
2026-09-22 23:16:26.748 | | | | 82428-c58b46 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-34' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.308 seconds
|
|
||||||
2026-09-22 23:16:26.940 | | | | 82428-c58b46 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-37' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.121 seconds
|
|
||||||
2026-09-22 23:16:29.047 | | | | 82428-c58b46 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-46' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.126 seconds
|
|
||||||
2026-09-22 23:16:29.532 | | | | 82428-c58b46 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-49' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.331 seconds
|
|
||||||
2026-09-22 23:16:29.798 | | | | 82428-c58b46 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-52' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.227 seconds
|
|
||||||
2026-09-22 23:16:30.739 | | | | 82428-c58b46 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-67' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.550 seconds
|
|
||||||
2026-09-22 23:16:31.033 | | | | 82428-c58b46 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-70' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.274 seconds
|
|
||||||
2026-09-22 23:16:31.477 | | | | 82428-c58b46 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-73' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.384 seconds
|
|
||||||
2026-09-22 23:16:32.285 | | | | 82428-c58b46 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-76' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.432 seconds
|
|
||||||
2026-09-22 23:25:04.359 | | | | 89690-6ac0a0 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-1' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.418 seconds
|
|
||||||
2026-09-22 23:25:06.115 | | | | 89690-6ac0a0 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-4' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 1.584 seconds
|
|
||||||
2026-09-22 23:25:06.804 | | | | 89690-6ac0a0 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-7' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.361 seconds
|
|
||||||
2026-09-22 23:25:08.052 | | | | 89690-6ac0a0 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-10' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.753 seconds
|
|
||||||
2026-09-22 23:25:08.726 | | | | 89690-6ac0a0 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-13' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.494 seconds
|
|
||||||
2026-09-22 23:25:09.823 | | | | 89690-6ac0a0 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-16' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.894 seconds
|
|
||||||
2026-09-22 23:25:10.286 | | | | 89690-6ac0a0 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-28' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.128 seconds
|
|
||||||
2026-09-22 23:25:11.132 | | | | 89690-6ac0a0 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-34' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.243 seconds
|
|
||||||
2026-09-22 23:25:11.455 | | | | 89690-6ac0a0 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-37' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.173 seconds
|
|
||||||
2026-09-22 23:25:11.868 | | | | 89690-6ac0a0 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-40' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.294 seconds
|
|
||||||
2026-09-22 23:25:12.118 | | | | 89690-6ac0a0 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-40' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.132 seconds
|
|
||||||
2026-09-22 23:25:14.498 | | | | 89690-6ac0a0 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-43' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.285 seconds
|
|
||||||
2026-09-22 23:25:14.974 | | | | 89690-6ac0a0 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-52' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.149 seconds
|
|
||||||
2026-09-22 23:25:15.334 | | | | 89690-6ac0a0 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-55' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.110 seconds
|
|
||||||
2026-09-22 23:25:16.807 | | | | 89690-6ac0a0 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-67' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.847 seconds
|
|
||||||
2026-09-22 23:25:17.285 | | | | 89690-6ac0a0 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-70' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.196 seconds
|
|
||||||
2026-09-22 23:25:18.869 | | | | 89690-6ac0a0 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-73' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 1.346 seconds
|
|
||||||
2026-09-22 23:25:19.708 | | | | 89690-6ac0a0 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-76' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.444 seconds
|
|
||||||
2026-09-22 23:25:19.920 | | | | 89690-6ac0a0 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-79' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.110 seconds
|
|
||||||
2026-09-22 23:25:20.493 | | | | 89690-6ac0a0 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-82' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.347 seconds
|
|
||||||
2026-09-22 23:25:21.245 | | | | 89690-6ac0a0 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-94' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.195 seconds
|
|
||||||
2026-09-22 23:25:21.859 | | | | 89690-6ac0a0 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-100' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.277 seconds
|
|
||||||
2026-09-22 23:29:25.904 | | | | 92873-630804 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-1' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.632 seconds
|
|
||||||
2026-09-22 23:29:27.988 | | | | 92873-630804 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-4' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 1.939 seconds
|
|
||||||
2026-09-22 23:29:28.432 | | | | 92873-630804 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-10' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.114 seconds
|
|
||||||
2026-09-22 23:29:28.753 | | | | 92873-630804 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-13' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.238 seconds
|
|
||||||
2026-09-22 23:29:29.126 | | | | 92873-630804 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-16' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.270 seconds
|
|
||||||
2026-09-22 23:29:29.634 | | | | 92873-630804 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-22' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.332 seconds
|
|
||||||
2026-09-22 23:29:30.338 | | | | 92873-630804 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-25' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.607 seconds
|
|
||||||
2026-09-22 23:29:30.898 | | | | 92873-630804 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-28' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.103 seconds
|
|
||||||
2026-09-22 23:29:31.035 | | | | 92873-630804 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task finished name='Task-29' coro=<Queue.join() done, defined at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/queues.py:207> result=None created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/tasks.py:636> took 0.109 seconds
|
|
||||||
2026-09-22 23:29:31.424 | | | | 92873-630804 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-31' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.206 seconds
|
|
||||||
2026-09-22 23:29:31.628 | | | | 92873-630804 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-34' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.176 seconds
|
|
||||||
2026-09-22 23:29:32.035 | | | | 92873-630804 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-34' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.108 seconds
|
|
||||||
2026-09-22 23:29:32.521 | | | | 92873-630804 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-34' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.359 seconds
|
|
||||||
2026-09-22 23:29:32.865 | | | | 92873-630804 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-37' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.137 seconds
|
|
||||||
2026-09-22 23:29:33.269 | | | | 92873-630804 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-37' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.172 seconds
|
|
||||||
2026-09-22 23:29:33.756 | | | | 92873-630804 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-40' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.319 seconds
|
|
||||||
2026-09-22 23:29:36.375 | | | | 92873-630804 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-43' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.355 seconds
|
|
||||||
2026-09-22 23:29:36.876 | | | | 92873-630804 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task finished name='Task-45' coro=<BaseEventLoop.shutdown_default_executor() done, defined at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:560> result=None created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/tasks.py:636> took 0.119 seconds
|
|
||||||
2026-09-22 23:29:37.417 | | | | 92873-630804 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-49' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.197 seconds
|
|
||||||
2026-09-22 23:29:37.693 | | | | 92873-630804 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-52' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.243 seconds
|
|
||||||
2026-09-22 23:29:38.113 | | | | 92873-630804 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-55' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.146 seconds
|
|
||||||
2026-09-22 23:29:38.457 | | | | 92873-630804 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-58' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.111 seconds
|
|
||||||
2026-09-22 23:29:38.835 | | | | 92873-630804 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-64' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.180 seconds
|
|
||||||
2026-09-22 23:29:39.085 | | | | 92873-630804 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-67' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.190 seconds
|
|
||||||
2026-09-22 23:29:39.817 | | | | 92873-630804 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-70' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.421 seconds
|
|
||||||
2026-09-22 23:29:40.668 | | | | 92873-630804 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-73' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.836 seconds
|
|
||||||
2026-09-22 23:29:40.874 | | | | 92873-630804 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Handle _run_until_complete_cb(<Future finis...events.py:429>) at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:184 created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:103> took 0.105 seconds
|
|
||||||
2026-09-22 23:29:41.871 | | | | 92873-630804 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-76' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.329 seconds
|
|
||||||
2026-09-22 23:29:42.082 | | | | 92873-630804 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Handle _run_until_complete_cb(<Task finishe.../tasks.py:636>) at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:184 created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/events.py:80> took 0.172 seconds
|
|
||||||
2026-09-22 23:29:42.258 | | | | 92873-630804 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-79' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.152 seconds
|
|
||||||
2026-09-22 23:29:43.444 | | | | 92873-630804 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-85' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.621 seconds
|
|
||||||
2026-09-22 23:29:44.050 | | | | 92873-630804 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-91' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.344 seconds
|
|
||||||
2026-09-22 23:29:44.843 | | | | 92873-630804 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-97' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.610 seconds
|
|
||||||
2026-09-22 23:29:45.132 | | | | 92873-630804 | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-100' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.175 seconds
|
|
||||||
2026-09-22 23:33:02.354 | | | | 95504-09fcce | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-1' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.154 seconds
|
|
||||||
2026-09-22 23:33:02.683 | | | | 95504-09fcce | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-4' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.167 seconds
|
|
||||||
2026-09-22 23:33:03.250 | | | | 95504-09fcce | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-7' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.350 seconds
|
|
||||||
2026-09-22 23:33:06.726 | | | | 95504-09fcce | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-10' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 3.057 seconds
|
|
||||||
2026-09-22 23:33:06.969 | | | | 95504-09fcce | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-13' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.198 seconds
|
|
||||||
2026-09-22 23:33:07.345 | | | | 95504-09fcce | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-16' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.319 seconds
|
|
||||||
2026-09-22 23:33:08.435 | | | | 95504-09fcce | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-19' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 1.044 seconds
|
|
||||||
2026-09-22 23:33:09.165 | | | | 95504-09fcce | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-22' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.627 seconds
|
|
||||||
2026-09-22 23:33:09.402 | | | | 95504-09fcce | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-25' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.193 seconds
|
|
||||||
2026-09-22 23:33:09.847 | | | | 95504-09fcce | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-28' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.392 seconds
|
|
||||||
2026-09-22 23:33:10.270 | | | | 95504-09fcce | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-31' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.277 seconds
|
|
||||||
2026-09-22 23:33:14.225 | | | | 95504-09fcce | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-40' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.313 seconds
|
|
||||||
2026-09-22 23:33:14.518 | | | | 95504-09fcce | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-43' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.231 seconds
|
|
||||||
2026-09-22 23:33:14.899 | | | | 95504-09fcce | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-46' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.145 seconds
|
|
||||||
2026-09-22 23:33:15.434 | | | | 95504-09fcce | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-49' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.337 seconds
|
|
||||||
2026-09-22 23:33:15.651 | | | | 95504-09fcce | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-52' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.135 seconds
|
|
||||||
2026-09-22 23:33:16.085 | | | | 95504-09fcce | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-52' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.347 seconds
|
|
||||||
2026-09-22 23:33:16.906 | | | | 95504-09fcce | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-55' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.604 seconds
|
|
||||||
2026-09-22 23:33:17.133 | | | | 95504-09fcce | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-55' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.116 seconds
|
|
||||||
2026-09-22 23:33:17.304 | | | | 95504-09fcce | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-58' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.108 seconds
|
|
||||||
2026-09-22 23:33:17.742 | | | | 95504-09fcce | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-58' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.407 seconds
|
|
||||||
2026-09-22 23:33:18.396 | | | | 95504-09fcce | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-61' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.501 seconds
|
|
||||||
2026-09-22 23:33:18.668 | | | | 95504-09fcce | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-64' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.175 seconds
|
|
||||||
2026-09-22 23:33:21.458 | | | | 95504-09fcce | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-67' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 2.651 seconds
|
|
||||||
2026-09-22 23:33:21.857 | | | | 95504-09fcce | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-70' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.249 seconds
|
|
||||||
2026-09-22 23:33:22.116 | | | | 95504-09fcce | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-76' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.123 seconds
|
|
||||||
2026-09-22 23:33:23.120 | | | | 95504-09fcce | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-97' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.134 seconds
|
|
||||||
2026-09-22 23:33:23.589 | | | | 95504-09fcce | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-109' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.124 seconds
|
|
||||||
2026-09-22 23:36:23.014 | | | | 98313-a0269c | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-1' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.116 seconds
|
|
||||||
2026-09-22 23:36:24.009 | | | | 98313-a0269c | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-10' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.716 seconds
|
|
||||||
2026-09-22 23:36:24.730 | | | | 98313-a0269c | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-13' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.417 seconds
|
|
||||||
2026-09-22 23:36:25.937 | | | | 98313-a0269c | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-16' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.938 seconds
|
|
||||||
2026-09-22 23:36:28.981 | | | | 98313-a0269c | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-19' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 2.588 seconds
|
|
||||||
2026-09-22 23:36:29.927 | | | | 98313-a0269c | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-22' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.554 seconds
|
|
||||||
2026-09-22 23:36:30.572 | | | | 98313-a0269c | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-25' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.514 seconds
|
|
||||||
2026-09-22 23:36:31.068 | | | | 98313-a0269c | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-28' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.207 seconds
|
|
||||||
2026-09-22 23:36:31.776 | | | | 98313-a0269c | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-31' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.128 seconds
|
|
||||||
2026-09-22 23:36:35.399 | | | | 98313-a0269c | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-37' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.587 seconds
|
|
||||||
2026-09-22 23:36:36.087 | | | | 98313-a0269c | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-40' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.317 seconds
|
|
||||||
2026-09-22 23:36:37.078 | | | | 98313-a0269c | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-43' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.785 seconds
|
|
||||||
2026-09-22 23:36:37.558 | | | | 98313-a0269c | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-46' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.296 seconds
|
|
||||||
2026-09-22 23:36:38.141 | | | | 98313-a0269c | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-52' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.220 seconds
|
|
||||||
2026-09-22 23:36:38.527 | | | | 98313-a0269c | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-55' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.271 seconds
|
|
||||||
2026-09-22 23:36:39.076 | | | | 98313-a0269c | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-58' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.468 seconds
|
|
||||||
2026-09-22 23:36:40.540 | | | | 98313-a0269c | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-61' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.841 seconds
|
|
||||||
2026-09-22 23:36:40.842 | | | | 98313-a0269c | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-64' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.249 seconds
|
|
||||||
2026-09-22 23:36:46.647 | | | | 98313-a0269c | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-67' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 4.703 seconds
|
|
||||||
2026-09-22 23:36:47.157 | | | | 98313-a0269c | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-79' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.108 seconds
|
|
||||||
2026-09-22 23:46:00.259 | | | | 12467-333dad | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-46' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.100 seconds
|
|
||||||
2026-09-22 23:47:35.249 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Connection closed by server.
|
|
||||||
2026-09-22 23:47:36.377 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:47:37.380 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:47:38.384 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:47:39.386 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:47:40.391 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:47:41.395 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:47:42.401 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:47:43.405 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:47:44.409 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:47:45.410 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:47:46.412 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:47:47.413 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:47:48.416 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:47:49.418 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:47:50.421 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:47:51.425 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:47:52.430 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:47:53.433 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:47:54.435 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:47:55.438 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:47:56.440 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:47:57.451 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:47:58.456 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:47:59.458 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:48:00.461 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:48:01.464 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:48:02.467 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:48:03.470 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:48:04.474 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:48:05.481 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:48:06.489 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:48:07.493 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:48:08.500 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:48:09.504 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:48:10.506 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:48:11.512 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:48:12.518 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:48:13.521 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:48:14.526 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:48:15.531 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:48:16.534 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:48:17.539 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:48:18.545 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:48:19.566 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:48:20.573 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:48:21.593 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:48:22.599 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:48:23.603 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:48:24.606 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:48:25.610 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:48:26.613 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:48:27.620 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:48:28.625 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:48:29.628 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:48:30.632 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:48:31.636 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:48:32.640 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:48:33.645 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:48:34.648 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:48:35.651 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:48:36.655 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:48:37.658 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:48:38.663 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:48:39.666 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:48:40.686 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:48:41.697 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:48:42.699 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:48:43.702 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:48:44.705 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:48:45.707 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:48:46.710 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:48:47.713 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:48:48.718 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:48:49.723 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:48:50.728 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:48:51.737 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:48:52.750 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:48:53.757 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:48:54.763 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:48:55.766 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:48:56.770 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:48:57.774 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:48:58.778 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:48:59.780 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:49:00.785 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:49:01.788 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:49:02.790 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:49:03.794 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:49:04.797 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:49:05.800 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:49:06.804 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:49:07.809 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:49:08.811 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:49:09.815 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:49:10.818 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:49:11.822 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:49:12.824 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:49:13.827 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:49:14.829 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:49:15.831 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:49:16.834 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:49:17.838 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:49:18.841 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:49:19.845 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:49:20.848 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:49:21.851 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:49:22.855 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:49:23.859 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:49:24.863 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:49:25.867 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:49:26.871 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:49:27.875 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:49:28.879 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:49:29.882 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:49:30.887 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:49:31.889 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:49:32.892 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:49:33.896 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:49:34.901 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:49:35.907 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:49:36.912 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:49:37.915 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:49:38.922 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:49:40.026 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:49:41.030 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:49:42.064 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:49:43.094 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:49:44.123 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:49:45.201 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:49:46.251 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:49:47.265 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:49:48.411 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:49:49.416 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:49:50.421 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:49:51.441 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:49:52.485 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:49:53.488 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:49:54.491 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:49:55.536 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:49:56.543 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:49:57.548 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:49:58.552 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:49:59.556 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:50:00.563 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:50:01.569 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:50:02.576 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:50:03.757 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:50:04.780 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:50:05.786 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:50:06.792 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:50:07.798 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:50:08.805 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:50:09.811 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:50:10.816 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:50:11.823 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:50:12.832 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:50:13.835 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:50:14.841 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:50:15.847 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:50:16.851 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:50:17.856 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:50:18.861 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:50:19.866 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:50:20.873 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:50:21.880 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:50:22.889 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:50:23.897 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:50:24.904 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:50:25.911 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:50:26.916 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:50:27.920 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:50:28.925 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:50:29.929 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:50:30.934 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:50:31.937 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:50:32.941 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:50:33.945 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:50:34.953 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:50:35.959 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:50:36.965 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:50:37.972 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:50:38.978 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:50:39.981 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:50:40.986 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:50:41.989 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:50:42.992 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:50:43.995 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:50:44.999 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:50:46.002 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:50:47.005 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:50:48.008 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:50:49.012 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:50:50.015 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:50:51.019 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:50:52.021 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:50:53.024 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:50:54.028 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:50:55.029 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:50:56.032 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:50:57.036 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:50:58.038 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:50:59.041 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:51:00.045 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:51:01.047 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:51:02.049 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-22 23:51:03.051 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:00:03.571 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:00:04.574 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:00:05.579 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:00:06.583 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:00:07.587 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:00:08.591 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:00:09.595 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:00:10.602 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:00:11.608 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:00:12.613 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:00:13.614 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:00:14.617 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:00:15.621 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:00:16.623 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:00:17.625 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:11:11.971 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:11:13.078 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:11:14.081 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:11:15.085 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:11:16.088 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:11:17.092 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:11:18.092 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:11:19.095 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:11:20.098 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:11:21.100 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:11:22.113 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:11:23.116 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:11:24.117 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:27:40.574 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:27:41.686 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:27:42.690 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:27:43.694 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:27:44.698 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:44:00.591 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:44:01.596 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:44:02.600 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:44:03.604 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:44:04.607 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:44:05.609 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:50:03.587 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:50:04.590 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:50:05.594 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:50:06.597 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:50:07.598 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:50:08.600 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:50:09.603 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:50:10.606 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:50:11.609 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:50:12.611 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:50:13.615 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:50:14.635 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:50:15.647 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:50:16.650 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:50:17.651 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:50:18.654 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:50:19.657 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:50:20.658 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:50:21.661 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:50:22.662 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:50:23.665 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:50:24.668 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:50:25.670 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:50:26.672 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:50:27.674 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:50:28.677 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:50:29.681 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 00:50:30.684 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 01:05:50.591 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 01:05:51.593 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 01:05:52.595 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 01:05:53.599 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 01:05:54.601 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 01:05:55.603 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 01:23:03.608 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 01:23:04.611 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 01:23:05.614 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 01:23:06.618 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 01:23:07.620 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 01:23:08.623 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 01:40:49.623 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 01:40:50.710 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 01:40:51.712 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 01:40:52.716 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 01:40:53.718 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 01:40:54.721 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 01:51:03.636 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 01:51:04.641 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 01:51:05.645 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 01:51:06.649 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 01:51:07.653 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 01:51:08.658 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 01:51:09.661 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 02:06:48.621 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 02:06:49.722 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 02:06:50.726 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 02:06:51.730 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 02:06:52.736 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 02:23:48.707 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 02:23:49.725 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 02:23:50.730 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 02:23:51.734 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 02:23:52.739 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 02:23:53.743 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 02:39:38.635 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 02:39:39.642 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 02:39:40.647 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 02:39:41.652 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 02:39:42.655 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 02:39:43.658 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 02:56:25.666 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 02:56:26.755 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 02:56:27.759 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 02:56:28.763 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 02:56:29.767 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 02:56:30.770 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 03:12:53.660 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 03:12:54.759 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 03:12:55.762 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 03:12:56.766 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 03:12:57.769 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 03:12:58.777 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 03:14:20.670 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 03:14:21.673 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 03:14:22.677 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 03:14:23.681 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 03:14:24.685 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 03:14:25.688 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 03:14:26.691 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 03:14:27.692 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 03:31:33.664 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 03:31:34.670 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 03:31:35.675 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 03:31:36.679 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 03:31:37.682 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 03:31:38.687 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 03:48:22.670 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 03:48:23.764 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 03:48:24.767 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 03:48:25.771 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 03:48:26.773 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 03:48:27.777 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 04:05:24.673 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 04:05:25.677 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 04:05:26.680 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 04:05:27.683 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 04:05:28.685 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 04:05:29.689 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 04:23:12.688 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 04:23:13.693 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 04:23:14.696 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 04:23:15.698 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 04:23:16.700 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 04:23:17.702 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 04:40:37.692 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 04:40:38.697 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 04:40:39.703 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 04:40:40.707 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 04:40:41.710 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 04:40:42.715 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 04:55:41.727 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 04:55:42.800 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 04:55:43.806 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 04:55:44.812 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 04:55:45.816 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 04:55:46.821 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 05:13:12.718 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 05:13:13.807 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 05:13:14.811 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 05:13:15.817 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 05:13:16.823 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 05:13:17.826 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 05:29:29.715 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 05:29:30.719 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 05:29:31.723 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 05:29:32.726 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 05:29:33.730 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 05:29:34.732 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 05:45:05.738 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 05:45:06.819 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 05:45:07.822 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 05:45:08.826 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 05:45:09.829 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 05:45:10.833 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 05:45:11.835 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 05:45:12.839 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 06:01:29.723 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 06:01:30.824 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 06:01:31.826 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 06:01:32.829 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 06:01:33.832 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 06:18:33.830 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 06:18:34.835 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 06:18:35.837 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 06:18:36.839 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 06:18:37.843 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 06:18:38.846 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 06:36:06.836 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 06:36:07.839 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 06:36:08.842 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 06:36:09.845 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 06:36:10.848 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 06:51:09.750 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 06:51:10.754 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 06:51:11.758 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 06:51:12.761 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 06:51:13.764 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 06:51:14.768 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:07:09.760 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:07:10.764 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:07:11.765 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:07:12.769 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:07:13.771 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:07:14.774 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:24:44.764 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:24:45.767 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:24:46.769 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:24:47.771 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:24:48.776 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:24:49.781 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:39:47.786 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:39:48.807 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:39:49.809 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:39:50.812 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:39:51.815 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:39:52.819 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:46:05.774 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:46:06.780 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:46:07.785 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:46:08.790 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:46:09.793 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:46:10.796 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:46:11.799 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:46:12.802 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:46:13.805 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:55:00.778 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:55:01.872 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:55:02.875 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:55:03.877 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:55:04.880 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:55:05.882 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:55:06.884 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:55:07.886 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:55:08.887 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:55:09.889 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:55:10.895 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:55:11.900 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:55:12.910 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:55:13.921 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:58:10.286 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:58:11.430 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:58:12.438 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:58:13.450 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:58:14.457 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:58:15.603 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:58:16.659 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:58:17.666 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:58:18.673 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:58:19.681 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:58:20.683 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:58:21.689 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:58:22.696 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:58:23.698 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:58:24.700 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:58:25.702 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:58:26.704 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:58:27.708 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:58:28.711 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:58:29.713 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:58:30.716 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:58:31.718 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:58:32.720 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:58:33.722 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:58:34.726 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:58:35.758 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:58:36.794 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:58:37.811 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:58:38.818 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:58:39.823 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:58:40.829 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:58:41.836 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:58:42.883 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:58:43.890 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:58:44.909 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:58:45.918 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:58:46.924 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:58:47.936 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:58:48.941 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:58:49.949 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:58:50.955 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:58:51.977 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:58:52.991 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:58:53.998 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:58:55.014 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:58:56.022 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:58:57.029 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:58:58.037 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:58:59.053 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:59:00.058 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:59:01.071 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:59:02.082 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:59:03.085 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:59:04.091 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:59:05.109 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:59:06.112 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:59:07.120 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:59:08.123 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:59:09.129 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:59:10.135 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:59:11.139 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:59:12.143 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:59:13.150 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:59:14.157 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:59:15.168 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:59:16.176 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:59:17.202 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:59:18.232 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:59:19.245 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:59:20.254 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:59:21.262 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:59:22.269 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:59:23.274 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:59:24.280 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:59:25.285 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:59:26.293 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:59:27.298 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:59:28.303 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:59:29.310 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:59:30.317 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:59:31.324 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:59:32.332 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:59:33.337 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:59:34.342 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:59:35.349 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:59:36.353 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:59:37.359 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:59:38.364 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:59:39.373 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:59:40.377 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:59:41.382 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:59:42.389 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:59:43.394 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:59:44.402 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:59:45.410 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:59:46.419 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:59:47.425 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:59:48.431 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:59:49.435 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:59:50.454 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:59:51.459 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:59:52.463 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:59:53.472 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:59:54.480 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:59:55.486 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:59:56.491 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:59:57.497 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:59:58.509 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 07:59:59.520 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:00:00.526 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:00:01.531 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:00:02.537 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:00:03.548 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:00:04.555 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:00:05.563 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:00:06.578 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:00:07.584 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:00:08.591 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:00:09.597 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:00:10.601 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:00:11.606 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:00:12.609 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:00:13.613 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:00:14.618 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:00:15.622 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:00:16.628 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:00:17.632 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:00:18.640 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:00:19.645 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:00:20.648 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:00:21.651 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:00:22.654 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:00:23.655 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:00:24.660 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:00:25.667 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:00:26.672 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:00:27.676 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:00:28.679 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:00:29.681 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:00:30.683 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:00:31.687 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:00:32.690 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:00:33.693 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:00:34.697 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:00:35.699 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:00:36.701 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:00:37.704 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:00:38.708 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:00:39.710 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:00:40.713 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:00:41.722 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:00:42.729 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:00:43.732 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:00:44.737 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:00:45.740 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:00:46.744 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:00:47.747 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:00:48.751 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:00:49.754 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:00:50.757 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:00:51.761 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:00:52.764 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:00:53.768 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:00:54.772 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:00:55.776 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:00:56.785 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:00:57.791 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:00:58.797 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:00:59.805 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:01:00.813 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:01:01.839 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:01:02.853 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:01:03.861 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:01:04.865 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:01:05.868 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:01:06.870 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:01:07.871 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:01:08.874 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:01:09.880 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:01:10.882 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:01:11.883 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:01:12.885 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:01:13.888 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:01:14.890 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:01:15.893 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:01:16.896 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:01:17.898 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:01:18.900 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:01:19.905 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:01:20.911 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:01:21.919 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:01:22.928 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:01:23.931 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:01:24.935 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:01:25.940 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:01:26.949 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:01:27.955 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:01:28.963 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:01:29.969 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:01:30.975 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:01:31.980 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:01:32.987 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:01:34.000 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:01:35.010 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:01:36.013 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:01:37.017 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:01:38.019 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:01:39.022 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:01:40.027 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:01:41.031 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:01:42.036 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:01:43.038 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:01:44.040 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:01:45.044 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:01:46.046 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:01:47.048 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:01:48.052 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:01:49.055 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:01:50.057 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:01:51.059 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:01:52.061 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:01:53.064 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:01:54.068 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:01:55.071 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:01:56.074 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:01:57.077 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:01:58.081 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:01:59.083 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:02:00.087 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:02:01.090 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:02:02.093 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:02:03.095 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:02:04.098 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:02:05.101 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:02:06.106 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:02:07.108 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:02:08.110 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:02:09.113 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:02:10.119 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:02:11.122 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:02:12.127 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:02:13.133 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:02:14.140 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:02:15.147 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:02:16.151 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:02:17.157 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:02:18.171 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:02:19.176 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:02:20.181 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:02:21.189 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:02:22.198 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:02:23.202 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
2026-09-23 08:02:24.205 | | | | 12367-8e907e | ERROR | module_admin.service.log_service:consume_stream:464 - 日志聚合消费异常: Error 61 connecting to 127.0.0.1:6379. Connection refused.
|
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,32 +0,0 @@
|
|||||||
2026-09-26 12:55:38.977 | | | | 43890-69016c | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-631' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.114 seconds
|
|
||||||
2026-09-26 12:55:41.558 | | | | 43890-69016c | WARNING | asyncio.base_events:_run_once:1904 - Executing <Task pending name='Task-1137' coro=<IsolatedAsyncioTestCase._asyncioLoopRunner() running at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:95> wait_for=<Future pending cb=[Task.task_wakeup()] created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/base_events.py:429> created at /Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/unittest/async_case.py:117> took 0.131 seconds
|
|
||||||
2026-09-26 13:40:25.189 | 4adcaf0fe9734e06a3e3540456d2dcda | bfc317a4ef2d47f9b1ff9b0dacbb4caf | f325961f7b574bb0946772b05e178ded | 35286-85260c | WARNING | module_admin.service.login_service:get_current_user:219 - 用户token已失效,请重新登录
|
|
||||||
2026-09-26 16:46:13.947 | 31755c4a7f4747f3963c5b94c040836f | 054f0424f5df44c196e82d4403fe8b1e | 6a70d146cceb42a08e58f1df9d00e30a | 35286-85260c | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-26 19:22:28.354 | b5e7bd983c794a9f8bdccfee51db8d73 | 005c76cace20459a8111156d5dfb9a69 | fdf16bf6fb774975978a7ee55994ccef | 35286-85260c | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-26 19:22:28.355 | cbf427c3908042d29c47fe1fdf002787 | 76eea226e3914e978fc1945589863eb0 | a036db90caa74c59ad836fcb6dfb4698 | 35286-85260c | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-26 19:22:28.358 | badf85531e264537881425cefd532a4e | 9777e8101ca64266a7fc028277cba6b6 | 7ac0e140695745698e8f6182e49f44a0 | 35286-85260c | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-26 19:22:28.360 | 0a5c054a6aeb4d5da44cf7edeba90bda | 546e0c5fca214ac59e6b1ca60bb51a5d | b6d578ac982343e780115f406dbd2f80 | 35286-85260c | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-26 19:22:28.360 | f9d8cb8d6f13403693533d4831d34fe2 | 85788d53e2c544128a120b7468ce841f | 92f14081de0344f18ba48a801b6a3277 | 35286-85260c | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-26 19:22:28.360 | 03ab2322a8a942c0890e0746010f06c6 | a118b2fa8b324ab6ad8ad7b7b8e27279 | b295f1db72c24d8d815aba6908e3239e | 35286-85260c | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-26 19:22:28.404 | d541c8c66d304766be61766e9cce2648 | f7a2b5ba8d04420d9fc819298ece8a82 | 7067c57860c24bc6af0047f6f0523112 | 35286-85260c | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-26 19:22:28.408 | 0b279fc9e3f245c2a269f42cd15790df | d00aa8f0f30a4eb38350d2d559f2b783 | fbfb19dcf5ab4ab18f9179912242ebba | 35286-85260c | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-26 19:22:28.409 | 8f088061d64445eb83100393320bba81 | de6a6a19267e474195c7b3d33334dcc5 | 58249b4d816b4a3b8833981f5aadebca | 35286-85260c | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-26 19:22:28.411 | 20c430d179d44806a414717830bf1c44 | 07c1721f324e447a9d121d6e78518182 | 286523eb9ad7456697859a49d3c85381 | 35286-85260c | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-26 21:43:11.533 | f639f0f70cf841baa341fff7fda02dbf | c08cd9bcfe1447f9809115a22a51c909 | 4b0d65ad896c4f79b36636218ef526de | 35286-85260c | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-26 23:43:55.134 | | | | 35286-85260c | ERROR | sqlalchemy.pool.base:_close_connection:376 - Exception closing connection <AdaptedConnection <asyncmy.connection.Connection object at 0x120ddf370>>
|
|
||||||
Traceback (most recent call last):
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/pool/base.py", line 374, in _close_connection
|
|
||||||
self._dialect.do_close(connection)
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/engine/default.py", line 721, in do_close
|
|
||||||
dbapi_connection.close()
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/dialects/mysql/asyncmy.py", line 114, in close
|
|
||||||
self.await_(self._connection.ensure_closed())
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only
|
|
||||||
return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn
|
|
||||||
value = await result
|
|
||||||
File "asyncmy/connection.pyx", line 367, in ensure_closed
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/streams.py", line 343, in wait_closed
|
|
||||||
await self._protocol._get_close_waiter(self)
|
|
||||||
BrokenPipeError: [Errno 32] Broken pipe
|
|
||||||
2026-09-27 00:05:01.664 | a9662ac3b2254f2d88ec8edf6e409c8d | 3ced5ce006d845db8dbec0c9accad850 | 7841be0637224ec5b48e2defe6f48baa | 35794-8a000d | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,56 +0,0 @@
|
|||||||
2026-09-27 01:20:39.570 | aeca06e98b2a457bae7a555ebab9c3e4 | c7b5cc2cd8954f239f72235abb121b38 | 1f860582c3a7413c835d1b2312151742 | 36967-fe3b0d | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-27 01:30:36.841 | | | | 36967-fe3b0d | WARNING | config.get_scheduler:on_lock_lost:273 - ⚠️ Worker 36967-fe3b0d 失去 Application 锁
|
|
||||||
2026-09-27 09:17:40.878 | efa6272b9713467b980b5e2279502288 | 257ee926db59431baeae83aa56d1fd3d | 7b08ae862c674486a217cbccc2da56ca | 36967-fe3b0d | WARNING | module_admin.service.login_service:__check_login_captcha:167 - 验证码已失效
|
|
||||||
2026-09-27 09:17:40.880 | efa6272b9713467b980b5e2279502288 | 257ee926db59431baeae83aa56d1fd3d | 7b08ae862c674486a217cbccc2da56ca | 36967-fe3b0d | WARNING | common.annotation.log_annotation:wrapper:197 - 验证码已失效
|
|
||||||
2026-09-27 11:09:14.360 | 8b0be0a5114141bdb37b6431382fcdc2 | 4fc3e9a9e9ef4334b746ef8be065c54e | 3515f9adf1e64b50a5ee5c28b522ea42 | 62289-86935c | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-27 11:50:06.114 | 8629920d3544439aa74e32d77b771ea7 | 2b71ec3764424e8595738c4263865922 | c1f4efbd1c8540e4827e7b543f3cf419 | 62289-86935c | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-27 12:05:47.001 | | | | 62289-86935c | WARNING | config.get_scheduler:on_lock_lost:273 - ⚠️ Worker 62289-86935c 失去 Application 锁
|
|
||||||
2026-09-27 12:07:47.946 | 2f3a94e35bfa40749edad4676fc7f829 | f1516386a6f54cffa9cbda8056afdb5f | 0539b6e3453d4245b3cbb995666e0250 | 62289-86935c | WARNING | module_admin.service.login_service:authenticate_user:133 - 密码错误
|
|
||||||
2026-09-27 12:07:47.947 | 2f3a94e35bfa40749edad4676fc7f829 | f1516386a6f54cffa9cbda8056afdb5f | 0539b6e3453d4245b3cbb995666e0250 | 62289-86935c | WARNING | common.annotation.log_annotation:wrapper:197 - 密码错误
|
|
||||||
2026-09-27 12:08:42.318 | f45d2036019848339490a295691a606a | ee76be6f453a45af83ae1f13a19a244e | 92414b750a2949b799c60542464253fc | 62289-86935c | WARNING | module_admin.service.login_service:__check_login_captcha:167 - 验证码已失效
|
|
||||||
2026-09-27 12:08:42.319 | f45d2036019848339490a295691a606a | ee76be6f453a45af83ae1f13a19a244e | 92414b750a2949b799c60542464253fc | 62289-86935c | WARNING | common.annotation.log_annotation:wrapper:197 - 验证码已失效
|
|
||||||
2026-09-27 12:38:43.360 | 93d8f14042c14439a1fc9af9781b3917 | ab93661ba45545d2b98611723aa80c97 | 2d7a40ea30bf4d96ba3f38d98add01d4 | 98878-57c13e | ERROR | common.annotation.log_annotation:wrapper:202 - 托盘不符合首次入库条件
|
|
||||||
2026-09-27 12:38:51.959 | b647ecabff704381839c93c606148449 | f9860290d57f450f8c47e77082417e96 | ff9ad3724a044fb3b55f5494fe3e0636 | 98878-57c13e | ERROR | common.annotation.log_annotation:wrapper:202 - 托盘不符合首次入库条件
|
|
||||||
2026-09-27 12:39:40.079 | e35e37edaf3349f2a483325410fb7d08 | c782c7bb104b4505bbf7b7570ed48dcc | e9a1da20ac1e460b919d068fc53f0c5c | 98878-57c13e | ERROR | common.annotation.log_annotation:wrapper:202 - 托盘不存在
|
|
||||||
2026-09-27 12:39:55.747 | 8e6c37c17dee4acca97d81bc1c8df234 | 1f1439ce9ae24fd0857a25a6d5247b19 | 833774659e364bf0b953c733be109f02 | 98878-57c13e | ERROR | common.annotation.log_annotation:wrapper:202 - 托盘不存在
|
|
||||||
2026-09-27 12:40:13.052 | 1b6fe92ad661496db94d6c545c079795 | ee5ec419404a4422b0bf8cabb3359e9e | 205e6790a7034d76a33d5c57597124d3 | 98878-57c13e | ERROR | common.annotation.log_annotation:wrapper:202 - 托盘不存在
|
|
||||||
2026-09-27 12:41:12.508 | d0dc9c192e974f69884cb4658b93f435 | 4b462f3020ac481ba0a37b88210158f1 | edd50d81cede49cab7bbaf6028207b20 | 98878-57c13e | ERROR | common.annotation.log_annotation:wrapper:202 - 托盘不符合首次入库条件
|
|
||||||
2026-09-27 12:41:15.159 | 89247b5e1c554337ac85f86a8e0ded6f | 4fe93c98b37943b1b5112297fa9b4ca6 | f32a9908ad73427bb834dcabc162726e | 98878-57c13e | ERROR | common.annotation.log_annotation:wrapper:202 - 托盘不符合首次入库条件
|
|
||||||
2026-09-27 12:41:17.335 | e5ee875f98314e67b3fac45dd00855da | 098796711da540b2947eefb29c9870af | 15a558072c3740aba34b002e5000128f | 98878-57c13e | ERROR | common.annotation.log_annotation:wrapper:202 - 托盘不符合首次入库条件
|
|
||||||
2026-09-27 12:42:07.755 | 84dde08dd86d45eab607fe861086fd39 | 63af6c1b8c7544808c5ef237972b2f78 | e631e73908cd4d68a8ae53a5a4789d66 | 98878-57c13e | ERROR | common.annotation.log_annotation:wrapper:202 - 托盘不符合仓库空托盘装填条件
|
|
||||||
2026-09-27 12:43:25.899 | ea8ced2637674cbaaebe945011758d9c | 47742a638abb4382bd3084ba08361579 | 22477243875c4e9da7431c65f3244cd0 | 98878-57c13e | ERROR | common.annotation.log_annotation:wrapper:202 - 托盘不在仓库
|
|
||||||
2026-09-27 12:43:55.961 | 80c5c99118c74ccf847411f43ff77904 | b550f418bfe3473bb1284d63dc6417ad | e921e40ad7e74ac9afa7e1b50dc1b8b1 | 98878-57c13e | ERROR | common.annotation.log_annotation:wrapper:202 - 托盘不在仓库
|
|
||||||
2026-09-27 12:44:03.523 | 6e0c2aa14062420eaa30e3e8757d248b | 7fcdba6045554c039f2839d9c3334ddb | df6c3c3149804e879bba5f1dd72d3215 | 98878-57c13e | ERROR | common.annotation.log_annotation:wrapper:202 - 托盘不在仓库
|
|
||||||
2026-09-27 12:45:06.004 | 071d1550da4e430e81f2829a2ea75518 | c87b19bd407048b998db61c27a7b79bb | b9ec0b3ae8e04b7fa9e2bebb57c63403 | 98878-57c13e | ERROR | common.annotation.log_annotation:wrapper:202 - 托盘不在仓库
|
|
||||||
2026-09-27 12:48:34.536 | 72cde0024dbd4261bef45f58ef165ed6 | ce5921bbde4d439dad5f27119fe74cde | 05771f45855549ac81165ce682c1ed19 | 98878-57c13e | ERROR | common.annotation.log_annotation:wrapper:202 - 托盘不存在活动装填周期
|
|
||||||
2026-09-27 12:48:40.629 | d94f732666cf4f4aa6c8e00b8a43519a | 26272550f15e47b2b8894cd99fad17f6 | d8c14cc3ca0d4b3ea598e77a5b2a5d8e | 98878-57c13e | ERROR | common.annotation.log_annotation:wrapper:202 - 托盘不存在活动装填周期
|
|
||||||
2026-09-27 21:03:23.484 | 0d2daf1685da417a86cc18a1f1703671 | 8c9c0df2542c42788c1e3ef786304a34 | 8923f52c36684edf843eee43c241217e | 98878-57c13e | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-27 21:09:06.309 | aeaaba8686fd4bb0bcfe70ee37a7f99c | 87413968a9c94012bc4d0e1cb387c5ad | 5373a4b28b7548f1a12fe8fe09420c4e | 98878-57c13e | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-27 21:09:06.315 | b9416504567448838c27351ce695e790 | 6ef0ec202543402bbcbc607eea3dd33f | f40e81e63e7f4f0aace83731a84f1b3d | 98878-57c13e | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-27 21:09:06.315 | e39e66a972964ed5a16e02b9603c8753 | 9b9124ad9d0349368089d0d4a48732e7 | 75a317beb07f47498325c29e26217446 | 98878-57c13e | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-27 21:09:06.338 | 43408d4704e340109cd40500cc4a4220 | 3dcbaa0b65d148fd8379a106dd81494a | 73b40a6c8eb44ba69aafe016157a354a | 98878-57c13e | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-27 21:09:06.340 | 9d4a6be5b23740138c5af1ab33058e3a | 253c7ffeddf24306a0510286c905a83d | 0df07cefe8574b428b998058a6c8e24b | 98878-57c13e | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-27 21:09:06.341 | 02c79524aabe4f67a3f0b9e2dfc98426 | d4c55c75a03d4c4aa5548c739a0fc1c1 | 5681ef3b6b7542f295fffb65b114693c | 98878-57c13e | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-27 21:09:06.345 | 926cec89f53b480388fe87f49f79b813 | b188bf19996e4300898f12cdc06c49dd | 9bd98cf850bd4f3daf6d3eb394aad92d | 98878-57c13e | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-27 21:09:06.354 | 80d2f1d6cd7e46c98dad81b113050afb | ae00f600b34c4bd5a1aad6db2ad6b939 | ad24a21f231f4f1489b576aa0a561504 | 98878-57c13e | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-27 21:09:06.355 | abdcc7433f624efcafd72a30478fb322 | 110c133582754763983b73ecbff01ff5 | 780e5781ee4649658e64552c993c327c | 98878-57c13e | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-27 21:09:06.382 | fcc3821d12f942b6b33bb076ff1261a3 | da00c06f2769485d871c28ab604711fe | 2b9eb989432c49a08ed11653776a0f4f | 98878-57c13e | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-27 21:09:06.383 | 30cc18b2af334ef08dd0e9e42d58cdb6 | ff301c892b90449c9ad42d80ce341bc5 | 95a641d4e29844de9a5d02fa44584d5a | 98878-57c13e | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-27 21:54:38.854 | 7edc8b4a28f6452a8703e341a070d094 | 07efe432e63a40bea0a6cd21cd97fbd1 | be9759590e48460eaa4973827fdb329e | 98878-57c13e | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-27 22:05:12.088 | | | | 98878-57c13e | WARNING | config.get_scheduler:on_lock_lost:273 - ⚠️ Worker 98878-57c13e 失去 Application 锁
|
|
||||||
2026-09-27 22:05:12.164 | | | | 98878-57c13e | ERROR | sqlalchemy.pool.base:_close_connection:376 - Exception closing connection <AdaptedConnection <asyncmy.connection.Connection object at 0x133919720>>
|
|
||||||
Traceback (most recent call last):
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/pool/base.py", line 374, in _close_connection
|
|
||||||
self._dialect.do_close(connection)
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/engine/default.py", line 721, in do_close
|
|
||||||
dbapi_connection.close()
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/dialects/mysql/asyncmy.py", line 114, in close
|
|
||||||
self.await_(self._connection.ensure_closed())
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only
|
|
||||||
return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn
|
|
||||||
value = await result
|
|
||||||
File "asyncmy/connection.pyx", line 367, in ensure_closed
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/streams.py", line 343, in wait_closed
|
|
||||||
await self._protocol._get_close_waiter(self)
|
|
||||||
BrokenPipeError: [Errno 32] Broken pipe
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,94 +0,0 @@
|
|||||||
2026-09-28 09:00:15.337 | ba36c1c61a7244b9b65fb20c6a958f4b | bfb05dda36d44ff6ba420f064a88562b | 0cd6a97296f94e8eb3cc277ef7820515 | 62572-6b1f2c | WARNING | module_admin.service.login_service:__check_login_captcha:167 - 验证码已失效
|
|
||||||
2026-09-28 09:00:15.339 | ba36c1c61a7244b9b65fb20c6a958f4b | bfb05dda36d44ff6ba420f064a88562b | 0cd6a97296f94e8eb3cc277ef7820515 | 62572-6b1f2c | WARNING | common.annotation.log_annotation:wrapper:197 - 验证码已失效
|
|
||||||
2026-09-28 09:43:50.310 | d2b267db4ba8496a9df6021d1ba00300 | 6792967bd70f49aa9d408c6559c322c2 | af1fe648a9cb4179bee7c754859c46a9 | 62572-6b1f2c | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-28 10:03:42.880 | bdbd9aaa0d48441f9da094ea63c40e10 | 928c68eb45b94716b75a8548306e002b | e5eb4344cb14454a923416ac78753615 | 62572-6b1f2c | WARNING | module_admin.service.login_service:get_current_user:219 - 用户token已失效,请重新登录
|
|
||||||
2026-09-28 10:09:14.545 | 09e6fff8a6614865af978bfc63633250 | e6b47ff360ed4cdd98110a7a6d5eb8d3 | c949b290f3294eef8ab226d00d1d8dc1 | 62572-6b1f2c | WARNING | module_admin.service.login_service:__check_login_captcha:167 - 验证码已失效
|
|
||||||
2026-09-28 10:09:14.546 | 09e6fff8a6614865af978bfc63633250 | e6b47ff360ed4cdd98110a7a6d5eb8d3 | c949b290f3294eef8ab226d00d1d8dc1 | 62572-6b1f2c | WARNING | common.annotation.log_annotation:wrapper:197 - 验证码已失效
|
|
||||||
2026-09-28 10:21:53.236 | bf6b4c6c058b430ba3ccb1708e07ee8a | a619e28862d7481cb4ee6a216802a05e | 52f7de72fe134ee0875aed8b38e73d0f | 62572-6b1f2c | ERROR | common.annotation.log_annotation:wrapper:202 - 托盘库存不存在或不在客户现场
|
|
||||||
2026-09-28 10:24:08.862 | 4edf2b18b29f4c03a634d6b484e4fd67 | 2569f1304b6844d2a85cafac1c8918cf | aa800f8f383741f3b60f094c769104c8 | 62572-6b1f2c | ERROR | common.annotation.log_annotation:wrapper:202 - 托盘库存不存在或不在客户现场
|
|
||||||
2026-09-28 10:38:31.064 | 53e207894a1a41f387538142ea33bc05 | 42cd65a6daff43a8a9147a4999b26d31 | c0ac80f51bea4fa6aa8df8a835f37fd1 | 62572-6b1f2c | WARNING | module_admin.service.login_service:authenticate_user:133 - 密码错误
|
|
||||||
2026-09-28 10:38:31.065 | 53e207894a1a41f387538142ea33bc05 | 42cd65a6daff43a8a9147a4999b26d31 | c0ac80f51bea4fa6aa8df8a835f37fd1 | 62572-6b1f2c | WARNING | common.annotation.log_annotation:wrapper:197 - 密码错误
|
|
||||||
2026-09-28 10:38:41.223 | 56fee336ebe64917993bfd7622cf200a | 6a6c67a9eb114ff389c2bd0702fd4c52 | 5a6c9a772ba24ec78b40e1a6e0bfbc10 | 62572-6b1f2c | WARNING | module_admin.service.login_service:__check_login_captcha:170 - 验证码错误
|
|
||||||
2026-09-28 10:38:41.223 | 56fee336ebe64917993bfd7622cf200a | 6a6c67a9eb114ff389c2bd0702fd4c52 | 5a6c9a772ba24ec78b40e1a6e0bfbc10 | 62572-6b1f2c | WARNING | common.annotation.log_annotation:wrapper:197 - 验证码错误
|
|
||||||
2026-09-28 10:39:08.437 | d8a40c7b112d4f2f9aaa1576fbe53fa8 | ed3211272ba242328f859f7c91d3e344 | 10d9499662d74069b50e25aaf8b37797 | 62572-6b1f2c | ERROR | common.annotation.log_annotation:wrapper:202 - 托盘不符合首次入库条件
|
|
||||||
2026-09-28 10:46:03.508 | 5991967288fa43dfa5a6271bc1558787 | 519a68df38094734ad0ea2d5eb570bf6 | aabf21cb05f94f91923652108f9b4d6a | 62572-6b1f2c | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-28 10:46:03.514 | 7b8b0647325446d3927a0eb3c1dcd243 | 55f399b0c1db44d393c8cd2d317758d5 | 2232c53932ae4c37bb4b74e365106987 | 62572-6b1f2c | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-28 10:46:03.517 | 03591e4d5132466bb2669406f52cef54 | d84d01d8e8dd402cb0538289efa17894 | 6d298dccae1b4b919a1cf468528ee47a | 62572-6b1f2c | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-28 10:46:03.519 | 18c5f5c4b502457082d2fb5d6e6effbc | b44f7d08c28b4d4e81f95fdc60ddeb37 | 90f4596111c1480bb8e947f6b01f9435 | 62572-6b1f2c | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-28 10:46:03.521 | 432adc6dbc374fceadbe7600b872bd53 | 78a958eb833f48588cf89f33d4de5a1b | 10445daddd45421b88d5229944c31445 | 62572-6b1f2c | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-28 10:46:03.524 | e993ea887654458f81e9843ec9d07952 | 9e6d6c1343994bff8e3dece2d20bf0ee | 20d503a7eb7a4f35acd582591e1b9d19 | 62572-6b1f2c | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-28 10:46:03.572 | 8b09a80bfeaa4215b959e02563810dd0 | ab4294c904a249ad863972aeb01a4d29 | 61794f5ad6124b2a94bd07a94fe237d3 | 62572-6b1f2c | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-28 10:46:03.579 | d17003e74b47423aa5abb8e2d0906871 | 13d207f3938441ec9de043ea99371274 | cd490dd2c5664d7388aae81e21445b7d | 62572-6b1f2c | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-28 10:46:03.580 | 9242f746036b49a9949d71718d1de355 | 756c01642fac45308a0ccaa11632b4c1 | fe9b872a3d4343ac94b258fcec5181dd | 62572-6b1f2c | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-28 10:46:03.580 | cc55b76dad1741a4833ff540b6dc442b | 1868b345057d4034baece403d93e9e29 | 1635a88ad5504efd94453a112f8e29de | 62572-6b1f2c | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-28 10:46:03.581 | 0a91ce3f831e49efab0965ca18b5dbc2 | 1c8c68b5fbbe425fa500be69d556cd2f | 05210e3976ac44c6b3da75b8fea98952 | 62572-6b1f2c | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-28 10:46:16.232 | f487e375148c457e8461f85f6149a369 | 3a5a5f02edec4bfba6944d250ae99ab7 | 5d22ece20d3f42ee90834292972f30f7 | 62572-6b1f2c | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-28 10:46:16.274 | 66a66a5342114b6081ec37161581f57e | dad420640f514875b674f4599fba05dd | 6acb0ea3c8104c7898fa3c099bf25d14 | 62572-6b1f2c | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-28 10:46:16.274 | 9000e1326b404b78abb9e7aeb30391f0 | 92d042571c854790a8487bd599daa1a9 | c00b72e95d67432591a22ebd900b7afb | 62572-6b1f2c | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-28 10:46:16.283 | ae676d2179cf424889f77806e3ee4c9b | 30c80ed1d960492993480baae5d9040c | 62f8d2bf510947b28672756f70787e76 | 62572-6b1f2c | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-28 10:46:16.284 | d46d37aa27024b2685db5581253a029c | a5fa9a3cc50441d88c544aeaf96c1163 | 6d24c8ac5f304b6e9db1a02569055f1c | 62572-6b1f2c | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-28 10:46:16.286 | b13930203e3745f29dc8b957ce7f302f | 3d381f1978384f02a67a251ad9ccb556 | 1b39dc0017a7453cafc9ef0a9c9efb95 | 62572-6b1f2c | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-28 10:46:16.334 | 6c4f35c7f97f4e74ade5f9ade9b1ac1c | 8242777acb314c53bb718c935df83932 | c8b6b445700549deb14838304ea24a00 | 62572-6b1f2c | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-28 10:46:16.341 | 1e374f012ecd4cf89a7dc79b0b72f559 | 116770f6222349bbbff40109d5f04a3f | 1aa2b9c5a6cb4222968c76fefdf4ad56 | 62572-6b1f2c | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-28 10:46:16.343 | 2da707d80ed2471fa487726b3c9f7af0 | 99cb8278c4314f86aeb53ca3714df758 | e7f48812d7614e22ae8f5848c438ab92 | 62572-6b1f2c | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-28 10:46:16.343 | 0d6378e8376a40c690cc04b8bff3866d | b06087c979a04726984cd8c879649539 | 783d035f0e2b4de1801743d5e3c76a7f | 62572-6b1f2c | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-28 10:46:16.344 | 19d2731983c44b71a04efd514a579320 | 867e7a717cd64541904c16f49b8f05f7 | 8e625c800e7c4f27a12cea3ec6ac15d2 | 62572-6b1f2c | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-28 12:03:10.155 | cce423f37fb84cd29e0d6dc6303d9c03 | 56f5f2575b854dada7b81b12b15c2813 | 98511d06168940dab87f39e4f3e3b7b0 | 62572-6b1f2c | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-28 12:03:10.157 | 2bd0170f8bcf4374ab60c0db43a32447 | c508a0855b214114861a1c4384124487 | 32ff02da68ef442286cefa9f84185a0d | 62572-6b1f2c | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-28 12:03:10.158 | 8d2a13462f724be39c4da1a6048c4ae8 | 53c0230422de445982668b36765187e6 | 2b827f6120e644048802922125ba2ff3 | 62572-6b1f2c | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-28 12:03:10.158 | 4d757a1a06ad4ef88f8c8ebcc01ca69a | 3c2ce29cca144acb9f82b08899c1805e | 1b25762b8394413e80db760cf923c96e | 62572-6b1f2c | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-28 12:03:10.186 | 8715cea358f2403fa725cdda75bf253e | 9d89c144d998477591fead7a9df7331b | a153e664a0ec4426ae86609093828d5b | 62572-6b1f2c | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-28 12:03:10.186 | 0f2e087daaa34c4289178ab647ff55d0 | 59fdd73713ae44a58a2548e1ff1e8ab6 | 99dd9cd9abdc436288405f6448659ebf | 62572-6b1f2c | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-28 12:03:10.188 | 530a2a1dd70a48088eff6ffa02f98a39 | 393cfa5715a84f0cb6852d4ab07cdcae | 12708e07f86f4ee98cda8526b68ebd8c | 62572-6b1f2c | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-28 12:03:10.188 | 082b2cf3465f49d4b39a09866c97ee8e | cb8a906c394743f1ace0e260422059cb | e21eeb4d4ac3461899fcb5efea9fd432 | 62572-6b1f2c | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-28 12:03:10.188 | 44df9a204ccf475483a55fb0d5c327c8 | a3a29eac131e4c359fe19f78437e998d | 140d7a57b6574cee812154218f1b5407 | 62572-6b1f2c | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-28 13:09:48.985 | 13f4cbcd83154d8ba991194959fa526a | 0a23c5e16ed44f3192cb93434bd2975f | 613ac50ed4a04b7fa78e234c98c84116 | 62572-6b1f2c | WARNING | module_admin.service.login_service:__check_login_captcha:170 - 验证码错误
|
|
||||||
2026-09-28 13:09:48.990 | 13f4cbcd83154d8ba991194959fa526a | 0a23c5e16ed44f3192cb93434bd2975f | 613ac50ed4a04b7fa78e234c98c84116 | 62572-6b1f2c | WARNING | common.annotation.log_annotation:wrapper:197 - 验证码错误
|
|
||||||
2026-09-28 13:53:49.708 | 73a6d08358304a178e9ac9089881e2b9 | 18c4db78e68641d6a35cae565589b239 | ae356b29372d46e9b6e5570691549c67 | 62572-6b1f2c | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-28 13:59:45.312 | 5ab6fb1312b444fcb388106469ce9873 | 7628b918777b4c0982903a773e18bc7e | 4c7e41ef83204be2874d60a71a5a8eca | 62572-6b1f2c | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-28 13:59:45.334 | faf5e90044ef4668ac186cf84dabb6b9 | 3a100294e01f45058eabf594ddd5eca0 | f0b1df93eb224f92975da239f92930b1 | 62572-6b1f2c | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-28 13:59:45.354 | ae5e3f9d480946dd8d03a7738b32d440 | d1a965ca11a74dc688f7b79c2b57954b | abc10506edc24506921e3b6865b22a0a | 62572-6b1f2c | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-28 13:59:45.369 | cabfdd3271cd49c1bfa4b2b5a31f27ec | 7f35b31a5b9740d1b060e233682494b6 | bcc3d7c9e2d741c9a3b75353b46c4e82 | 62572-6b1f2c | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-28 13:59:45.374 | c80a006255e54dd9afd2be79e243b544 | fa8750a6a7a64d8f93b3c16778d651b8 | c23d3d73eb1c42d989a052ab32b4495d | 62572-6b1f2c | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-28 13:59:45.378 | c3bcf46a67d3408cac2fd35495c10764 | 56998f6264ce4700bca3c8e61538b19f | 8708aa7c8273479e8ac33fc1f55829a5 | 62572-6b1f2c | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-28 13:59:45.382 | 33fd5d51ec9649fe9956fc6fc50966a0 | c2886cea734245f48618354d4fa22a47 | 6bcc309f42184588865183daf6607a82 | 62572-6b1f2c | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-28 13:59:45.469 | 90ab69c370fa4dc882923c30f9e6a6c2 | 4c0d88ad77cd42dba9cc3fc5e8da49c1 | 153bc5411f9148aeb2b368f558e7d006 | 62572-6b1f2c | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-28 13:59:45.469 | 3354a5201c6e475c815b3e93774c60ab | cf62d6123fde46b7b3eaf36fa7750263 | 425febf1654348d288e38e22a35f6d20 | 62572-6b1f2c | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-28 15:44:48.546 | f3d841a80e0c49b6a2ef12e0fb03c0e9 | d09057ad24a24e7ea4a22f44065f962d | 40ab25364cde46b29603eec07bb0410f | 19536-893d88 | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-28 18:15:15.372 | 55fe7aed5a5049eabdae0edd5e13b9c6 | e70f5cad542640e5b84a4a8f7bcbf349 | c96b83685c474b3fa2eb47238c10b3c3 | 19536-893d88 | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-28 18:24:37.733 | | | | 19536-893d88 | WARNING | config.get_scheduler:on_lock_lost:273 - ⚠️ Worker 19536-893d88 失去 Application 锁
|
|
||||||
2026-09-29 08:31:19.884 | ecd7f13ca30e45b294640064c6541d62 | c138e385f39748c2a69c9647d5f62168 | 730afa863d39409385556bd9e7a9aa74 | 19536-893d88 | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-29 08:31:19.884 | 8a5b859f4b5b42f587f3c68f80df2a29 | ffec21d61d124182814ca9e284d064c5 | e7b7bc0477ed4d06a3f722a03213f7df | 19536-893d88 | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-29 08:31:19.887 | 42584df6b4524e5ab17b92ab7bbad363 | 9e7dd342207143cfbf58edb837db9bc8 | fe765689650d4074b3214fb8385a891c | 19536-893d88 | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-29 08:31:19.887 | 6ace3b292707421699b77bbab6cc2c17 | ef13031420d84be8bd1b6bb949cc2e73 | ee66dbbf2cb34f0e881d9b8ff1720ca4 | 19536-893d88 | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-29 08:31:19.888 | ab831cab113b475fab50d19f98ae5ad5 | ec6c14b01c0f462f8f68487ffdc2e7a8 | 2c6e0349e8544bb99b1407297b2934ff | 19536-893d88 | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-29 08:31:19.888 | 9a3993f714a0480599a69853c7a160b7 | 7639accb89c04e3eab0cecb39b4222d6 | 5f1da52c460d45db94c6f753e760d1ff | 19536-893d88 | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-29 08:31:19.889 | 8bfdefdcc33d4a02a58ff162d637d78e | 695c2b2b62644fcb83ca330ed6c35377 | a9890dfac0be43f1af1a706257ad90f7 | 19536-893d88 | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-29 08:31:19.889 | 8074c1fbe9324750a34f1b41701ae10a | c8db0c5645af428aab6f891676743e90 | 1522f21948074184944eda7bb2c7a457 | 19536-893d88 | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-29 08:31:19.890 | 311c84b119c74c34926e8f105cb6b89d | 80faa8776a174e848a7ea949d49650a9 | 4e0791453ffd4109a7b057a6a1f9c89d | 19536-893d88 | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-29 10:36:18.935 | f336ad9851934b909fb22f7dfc4b3b65 | 8a0adcc4279e4a90ac233295a77dc47b | fdbf1ccbb5db4fc18600351d0e947184 | 19536-893d88 | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-29 14:34:17.408 | b5bd453c58164df3888a79f9347b08f2 | f2f3b6f4a9c94a038970ebe3c4cb4178 | 1d6fa79fe14a428189f4f10cbe02ffbb | 19536-893d88 | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-29 14:34:17.411 | ac47fd90ab8643a0b769eaee235c45cb | bab76393434043f4835d06527b31c85f | d154b8c62bf045e484bf4d0dd149e37a | 19536-893d88 | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-29 14:34:17.412 | 9a9f12f1f0a34a8fbe9cad915594afc6 | a054fea4972c4c2c8e7d96a4383e6974 | a7724448dd3b40a7aa90356608b39c37 | 19536-893d88 | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-29 14:34:17.413 | dc6317ef7e6e4196823e65609cd37af4 | cac0c26cbd5c47f194d66af70744a317 | 27c38b6b3345428981d4226abb767e68 | 19536-893d88 | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-29 14:34:17.414 | 43fd8348a96a43c486c5bbf15388af25 | 146ae1ecb2bc45dd827136680e972f48 | 5a59b2426cd74877aa7e1795317b3ede | 19536-893d88 | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-29 14:34:17.414 | c2aab8152a00445881b6fcab4936339c | 59a37c27d2b14dc9a3df640123dd48cb | 56b5f26cc25d475faf7dc7eb085afd7d | 19536-893d88 | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-29 14:34:17.414 | e2e16657d6bc4986ac054e12547cde7e | 80b7928ebcd141c89b9be78a5f451f31 | 7ddf26d600534e36936101698cb41375 | 19536-893d88 | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-29 14:34:17.414 | 5a0a281ce5ca4dc086a5e97e34f54064 | 6a2e8aad8ab648cd8c1f1145061b8617 | 169b721c5b184e058ef422f7a4dfa2d5 | 19536-893d88 | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-29 14:34:17.414 | a6848b04d69744c6903ff8f5488aff2a | 455b6c7725124b528d632116e50d8692 | 1d4829970328409a9c4241da7ef0e3df | 19536-893d88 | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-09-29 14:44:44.532 | | | | 19536-893d88 | ERROR | sqlalchemy.pool.base:_close_connection:376 - Exception closing connection <AdaptedConnection <asyncmy.connection.Connection object at 0x12526bf40>>
|
|
||||||
Traceback (most recent call last):
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/pool/base.py", line 374, in _close_connection
|
|
||||||
self._dialect.do_close(connection)
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/engine/default.py", line 721, in do_close
|
|
||||||
dbapi_connection.close()
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/dialects/mysql/asyncmy.py", line 114, in close
|
|
||||||
self.await_(self._connection.ensure_closed())
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only
|
|
||||||
return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn
|
|
||||||
value = await result
|
|
||||||
File "asyncmy/connection.pyx", line 367, in ensure_closed
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/asyncio/streams.py", line 343, in wait_closed
|
|
||||||
await self._protocol._get_close_waiter(self)
|
|
||||||
BrokenPipeError: [Errno 32] Broken pipe
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,6 +0,0 @@
|
|||||||
2026-09-29 15:19:51.438 | 989860659b114ab38204ade1141ea3c1 | 6064d458f0404b84a1d7848686d38762 | 36ef966879ce4a618a18c71affcb9e5d | 55906-91d48f | WARNING | module_admin.service.login_service:get_current_user:219 - 用户token已失效,请重新登录
|
|
||||||
2026-09-29 17:02:23.083 | 63ef7d446d464450b9b1d1965ff974da | e8f78596035e433686c099886c38dd09 | 05a6cd1aec2f42b79ce34b5c1afeee25 | 55906-91d48f | WARNING | common.annotation.rate_limit_annotation:_log_rate_limit_hit:652 - 接口限流命中: namespace=captcha:image preset=ANON_AUTH_CAPTCHA algorithm=sliding_window fail_strategy=local_fallback method=GET path=/captchaImage scope=ip scope_value=ip:127.0.0.1 current=36 limit=36 retry_after=32s
|
|
||||||
2026-09-29 17:02:23.881 | dfad946f3e3b4ad39a2824ff3843d26e | 6ac7acb690a94b28adc82485c2ffc24d | 13afc3a1f3c742eba1fa824b5c3b1c3d | 55906-91d48f | WARNING | common.annotation.rate_limit_annotation:_log_rate_limit_hit:652 - 接口限流命中: namespace=captcha:image preset=ANON_AUTH_CAPTCHA algorithm=sliding_window fail_strategy=local_fallback method=GET path=/captchaImage scope=ip scope_value=ip:127.0.0.1 current=36 limit=36 retry_after=31s
|
|
||||||
2026-09-29 17:02:45.046 | 5be0428cea524497b4a6174bb9f1a6ed | d7189467f9a544bca5adc90241a1c82d | e25f7456285147a990a16c907e9930c4 | 55906-91d48f | WARNING | common.annotation.rate_limit_annotation:_log_rate_limit_hit:652 - 接口限流命中: namespace=captcha:image preset=ANON_AUTH_CAPTCHA algorithm=sliding_window fail_strategy=local_fallback method=GET path=/captchaImage scope=ip scope_value=ip:127.0.0.1 current=36 limit=36 retry_after=10s
|
|
||||||
2026-09-29 17:02:49.279 | ca8fee87f80a4984ba64adea0235615a | 995b7c31d34c4af3b91e7e38691c55ed | 9840642de3244d5a83607d5fa4931f54 | 55906-91d48f | WARNING | common.annotation.rate_limit_annotation:_log_rate_limit_hit:652 - 接口限流命中: namespace=captcha:image preset=ANON_AUTH_CAPTCHA algorithm=sliding_window fail_strategy=local_fallback method=GET path=/captchaImage scope=ip scope_value=ip:127.0.0.1 current=36 limit=36 retry_after=6s
|
|
||||||
2026-09-29 18:46:30.336 | | | | 55906-91d48f | WARNING | config.get_scheduler:on_lock_lost:273 - ⚠️ Worker 55906-91d48f 失去 Application 锁
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,287 +0,0 @@
|
|||||||
2026-10-05 10:32:04.685 | 5ce457e932e34f669b2c7fda06bab450 | 5e433faf6cb54daa8fefbd591de4a42a | 30356484b94b4f1d8bd4b734ee876c59 | 21381-1d9e7d | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-10-05 13:18:49.387 | | | | 95189-da1f7e | WARNING | config.get_scheduler:on_lock_lost:273 - ⚠️ Worker 95189-da1f7e 失去 Application 锁
|
|
||||||
2026-10-05 13:23:35.421 | | | | 34715-45b610 | ERROR | exceptions.handle:exception_handler:71 - (asyncmy.errors.OperationalError) (1054, "Unknown column 'biz_usage_record.tunnel_id' in 'field list'")
|
|
||||||
[SQL: SELECT count(%s) AS count_1
|
|
||||||
FROM (SELECT biz_usage_record.usage_id AS usage_id, biz_usage_record.test_batch_id AS test_batch_id, biz_usage_record.usage_no AS usage_no, biz_usage_record.pallet_id AS pallet_id, biz_usage_record.active_filling_id AS active_filling_id, biz_usage_record.site_id AS site_id, biz_usage_record.tunnel_id AS tunnel_id, biz_usage_record.trace_no AS trace_no, biz_usage_record.batch_no_snapshot AS batch_no_snapshot, biz_usage_record.line_id AS line_id, biz_usage_record.used_packages AS used_packages, biz_usage_record.remaining_packages_after AS remaining_packages_after, biz_usage_record.idempotency_key AS idempotency_key, biz_usage_record.request_hash AS request_hash, biz_usage_record.operator_id AS operator_id, biz_usage_record.occurred_at AS occurred_at
|
|
||||||
FROM biz_usage_record
|
|
||||||
WHERE biz_usage_record.test_batch_id IS NULL ORDER BY biz_usage_record.usage_id) AS anon_1]
|
|
||||||
[parameters: ('*',)]
|
|
||||||
(Background on this error at: https://sqlalche.me/e/20/e3q8)
|
|
||||||
Traceback (most recent call last):
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 1967, in _exec_single_context
|
|
||||||
self.dialect.do_execute(
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/engine/default.py", line 952, in do_execute
|
|
||||||
cursor.execute(statement, parameters)
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/connectors/asyncio.py", line 230, in execute
|
|
||||||
self._adapt_connection._handle_exception(error)
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/dialects/mysql/asyncmy.py", line 91, in _handle_exception
|
|
||||||
raise error
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/connectors/asyncio.py", line 228, in execute
|
|
||||||
return self.await_(self._execute_async(operation, parameters))
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only
|
|
||||||
return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn
|
|
||||||
value = await result
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/connectors/asyncio.py", line 251, in _execute_async
|
|
||||||
result = await self._cursor.execute(operation, parameters)
|
|
||||||
File "asyncmy/cursors.pyx", line 179, in execute
|
|
||||||
File "asyncmy/cursors.pyx", line 364, in _query
|
|
||||||
File "asyncmy/connection.pyx", line 500, in query
|
|
||||||
File "asyncmy/connection.pyx", line 688, in _read_query_result
|
|
||||||
File "asyncmy/connection.pyx", line 1075, in read
|
|
||||||
File "asyncmy/connection.pyx", line 650, in read_packet
|
|
||||||
File "asyncmy/protocol.pyx", line 190, in asyncmy.protocol.MysqlPacket.raise_for_error
|
|
||||||
File "asyncmy/protocol.pyx", line 194, in asyncmy.protocol.MysqlPacket.raise_for_error
|
|
||||||
File "asyncmy/errors.pyx", line 128, in asyncmy.errors.raise_mysql_exception
|
|
||||||
File "asyncmy/errors.pyx", line 137, in asyncmy.errors.raise_mysql_exception
|
|
||||||
asyncmy.errors.OperationalError: (1054, "Unknown column 'biz_usage_record.tunnel_id' in 'field list'")
|
|
||||||
|
|
||||||
The above exception was the direct cause of the following exception:
|
|
||||||
|
|
||||||
Traceback (most recent call last):
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/starlette/middleware/errors.py", line 164, in __call__
|
|
||||||
await self.app(scope, receive, _send)
|
|
||||||
File "/Users/jiaolongyan/PycharmProjects/牛牛小屋/ShiErFeng/shierfeng-fastapi-backend/middlewares/transport_crypto_middleware.py", line 53, in __call__
|
|
||||||
await self.app(scope, receive, send)
|
|
||||||
File "/Users/jiaolongyan/PycharmProjects/牛牛小屋/ShiErFeng/shierfeng-fastapi-backend/middlewares/trace_middleware/middle.py", line 44, in __call__
|
|
||||||
await self.app(scope, handle_outgoing_receive, handle_outgoing_request)
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/starlette/middleware/base.py", line 191, in __call__
|
|
||||||
with recv_stream, send_stream, collapse_excgroups():
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/contextlib.py", line 153, in __exit__
|
|
||||||
self.gen.throw(typ, value, traceback)
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/starlette/_utils.py", line 85, in collapse_excgroups
|
|
||||||
raise exc
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/starlette/middleware/base.py", line 193, in __call__
|
|
||||||
response = await self.dispatch_func(request, call_next)
|
|
||||||
File "/Users/jiaolongyan/PycharmProjects/牛牛小屋/ShiErFeng/shierfeng-fastapi-backend/middlewares/api_response_header_middleware.py", line 15, in dispatch
|
|
||||||
response = await call_next(request)
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/starlette/middleware/base.py", line 168, in call_next
|
|
||||||
raise app_exc from app_exc.__cause__ or app_exc.__context__
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/starlette/middleware/base.py", line 144, in coro
|
|
||||||
await self.app(scope, receive_or_disconnect, send_no_error)
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/starlette/middleware/gzip.py", line 29, in __call__
|
|
||||||
await responder(scope, receive, send)
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/starlette/middleware/gzip.py", line 130, in __call__
|
|
||||||
await super().__call__(scope, receive, send)
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/starlette/middleware/gzip.py", line 46, in __call__
|
|
||||||
await self.app(scope, receive, self.send_with_compression)
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/starlette/middleware/cors.py", line 85, in __call__
|
|
||||||
await self.app(scope, receive, send)
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/starlette/middleware/base.py", line 191, in __call__
|
|
||||||
with recv_stream, send_stream, collapse_excgroups():
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/contextlib.py", line 153, in __exit__
|
|
||||||
self.gen.throw(typ, value, traceback)
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/starlette/_utils.py", line 85, in collapse_excgroups
|
|
||||||
raise exc
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/starlette/middleware/base.py", line 193, in __call__
|
|
||||||
response = await self.dispatch_func(request, call_next)
|
|
||||||
File "/Users/jiaolongyan/PycharmProjects/牛牛小屋/ShiErFeng/shierfeng-fastapi-backend/middlewares/context_middleware.py", line 18, in dispatch
|
|
||||||
return await call_next(request)
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/starlette/middleware/base.py", line 168, in call_next
|
|
||||||
raise app_exc from app_exc.__cause__ or app_exc.__context__
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/starlette/middleware/base.py", line 144, in coro
|
|
||||||
await self.app(scope, receive_or_disconnect, send_no_error)
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/starlette/middleware/exceptions.py", line 63, in __call__
|
|
||||||
await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send)
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app
|
|
||||||
raise exc
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
|
|
||||||
await app(scope, receive, sender)
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/fastapi/middleware/asyncexitstack.py", line 18, in __call__
|
|
||||||
await self.app(scope, receive, send)
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/starlette/routing.py", line 716, in __call__
|
|
||||||
await self.middleware_stack(scope, receive, send)
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/starlette/routing.py", line 736, in app
|
|
||||||
await route.handle(scope, receive, send)
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/starlette/routing.py", line 290, in handle
|
|
||||||
await self.app(scope, receive, send)
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/fastapi/routing.py", line 115, in app
|
|
||||||
await wrap_app_handling_exceptions(app, request)(scope, receive, send)
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app
|
|
||||||
raise exc
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
|
|
||||||
await app(scope, receive, sender)
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/fastapi/routing.py", line 101, in app
|
|
||||||
response = await f(request)
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/fastapi/routing.py", line 355, in app
|
|
||||||
raw_response = await run_endpoint_function(
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/fastapi/routing.py", line 243, in run_endpoint_function
|
|
||||||
return await dependant.call(**values)
|
|
||||||
File "/Users/jiaolongyan/PycharmProjects/牛牛小屋/ShiErFeng/shierfeng-fastapi-backend/module_business/controller/usage_controller.py", line 52, in get_business_usage_list
|
|
||||||
result = await UsageService.get_usage_list_services(
|
|
||||||
File "/Users/jiaolongyan/PycharmProjects/牛牛小屋/ShiErFeng/shierfeng-fastapi-backend/module_business/service/usage_service.py", line 259, in get_usage_list_services
|
|
||||||
result = await OperationDao.get_usage_list(
|
|
||||||
File "/Users/jiaolongyan/PycharmProjects/牛牛小屋/ShiErFeng/shierfeng-fastapi-backend/module_business/dao/operation_dao.py", line 835, in get_usage_list
|
|
||||||
return await cls._paginate(db, statement, query_object, is_page)
|
|
||||||
File "/Users/jiaolongyan/PycharmProjects/牛牛小屋/ShiErFeng/shierfeng-fastapi-backend/module_business/dao/operation_dao.py", line 142, in _paginate
|
|
||||||
return await PageUtil.paginate(
|
|
||||||
File "/Users/jiaolongyan/PycharmProjects/牛牛小屋/ShiErFeng/shierfeng-fastapi-backend/utils/page_util.py", line 83, in paginate
|
|
||||||
total = (await db.execute(select(func.count('*')).select_from(query.subquery()))).scalar()
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/ext/asyncio/session.py", line 449, in execute
|
|
||||||
result = await greenlet_spawn(
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 203, in greenlet_spawn
|
|
||||||
result = context.switch(value)
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 2351, in execute
|
|
||||||
return self._execute_internal(
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 2249, in _execute_internal
|
|
||||||
result: Result[Any] = compile_state_cls.orm_execute_statement(
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/orm/context.py", line 306, in orm_execute_statement
|
|
||||||
result = conn.execute(
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 1419, in execute
|
|
||||||
return meth(
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/sql/elements.py", line 527, in _execute_on_connection
|
|
||||||
return connection._execute_clauseelement(
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 1641, in _execute_clauseelement
|
|
||||||
ret = self._execute_context(
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 1846, in _execute_context
|
|
||||||
return self._exec_single_context(
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 1986, in _exec_single_context
|
|
||||||
self._handle_dbapi_exception(
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 2363, in _handle_dbapi_exception
|
|
||||||
raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 1967, in _exec_single_context
|
|
||||||
self.dialect.do_execute(
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/engine/default.py", line 952, in do_execute
|
|
||||||
cursor.execute(statement, parameters)
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/connectors/asyncio.py", line 230, in execute
|
|
||||||
self._adapt_connection._handle_exception(error)
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/dialects/mysql/asyncmy.py", line 91, in _handle_exception
|
|
||||||
raise error
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/connectors/asyncio.py", line 228, in execute
|
|
||||||
return self.await_(self._execute_async(operation, parameters))
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only
|
|
||||||
return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn
|
|
||||||
value = await result
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/connectors/asyncio.py", line 251, in _execute_async
|
|
||||||
result = await self._cursor.execute(operation, parameters)
|
|
||||||
File "asyncmy/cursors.pyx", line 179, in execute
|
|
||||||
File "asyncmy/cursors.pyx", line 364, in _query
|
|
||||||
File "asyncmy/connection.pyx", line 500, in query
|
|
||||||
File "asyncmy/connection.pyx", line 688, in _read_query_result
|
|
||||||
File "asyncmy/connection.pyx", line 1075, in read
|
|
||||||
File "asyncmy/connection.pyx", line 650, in read_packet
|
|
||||||
File "asyncmy/protocol.pyx", line 190, in asyncmy.protocol.MysqlPacket.raise_for_error
|
|
||||||
File "asyncmy/protocol.pyx", line 194, in asyncmy.protocol.MysqlPacket.raise_for_error
|
|
||||||
File "asyncmy/errors.pyx", line 128, in asyncmy.errors.raise_mysql_exception
|
|
||||||
File "asyncmy/errors.pyx", line 137, in asyncmy.errors.raise_mysql_exception
|
|
||||||
sqlalchemy.exc.OperationalError: (asyncmy.errors.OperationalError) (1054, "Unknown column 'biz_usage_record.tunnel_id' in 'field list'")
|
|
||||||
[SQL: SELECT count(%s) AS count_1
|
|
||||||
FROM (SELECT biz_usage_record.usage_id AS usage_id, biz_usage_record.test_batch_id AS test_batch_id, biz_usage_record.usage_no AS usage_no, biz_usage_record.pallet_id AS pallet_id, biz_usage_record.active_filling_id AS active_filling_id, biz_usage_record.site_id AS site_id, biz_usage_record.tunnel_id AS tunnel_id, biz_usage_record.trace_no AS trace_no, biz_usage_record.batch_no_snapshot AS batch_no_snapshot, biz_usage_record.line_id AS line_id, biz_usage_record.used_packages AS used_packages, biz_usage_record.remaining_packages_after AS remaining_packages_after, biz_usage_record.idempotency_key AS idempotency_key, biz_usage_record.request_hash AS request_hash, biz_usage_record.operator_id AS operator_id, biz_usage_record.occurred_at AS occurred_at
|
|
||||||
FROM biz_usage_record
|
|
||||||
WHERE biz_usage_record.test_batch_id IS NULL ORDER BY biz_usage_record.usage_id) AS anon_1]
|
|
||||||
[parameters: ('*',)]
|
|
||||||
(Background on this error at: https://sqlalche.me/e/20/e3q8)
|
|
||||||
2026-10-05 14:58:00.827 | 30919192f3594497a59fc913008fda10 | 53240ccf884a443ba4ada988273cbd6e | dcdb5888a906403b894cda1fb4d83974 | 34715-45b610 | WARNING | module_admin.service.login_service:get_current_user:277 - 用户token已失效,请重新登录
|
|
||||||
2026-10-05 15:23:25.800 | | | | 34715-45b610 | WARNING | config.get_scheduler:on_lock_lost:273 - ⚠️ Worker 34715-45b610 失去 Application 锁
|
|
||||||
2026-10-05 17:57:42.275 | | | | 38941-a4ab07 | WARNING | config.get_scheduler:on_lock_lost:273 - ⚠️ Worker 38941-a4ab07 失去 Application 锁
|
|
||||||
2026-10-05 17:58:13.287 | eba30441d8d247f1a71c18ca28b545e3 | a66289a299b54b39949859fc20d7c49e | cdc11db34b914473b5bfe9f4cc8bf96a | 46633-a22437 | WARNING | module_admin.service.login_service:authenticate_user:133 - 密码错误
|
|
||||||
2026-10-05 17:58:13.287 | eba30441d8d247f1a71c18ca28b545e3 | a66289a299b54b39949859fc20d7c49e | cdc11db34b914473b5bfe9f4cc8bf96a | 46633-a22437 | WARNING | common.annotation.log_annotation:wrapper:197 - 密码错误
|
|
||||||
2026-10-05 18:01:12.069 | 15caaca0a4cc4c6382be942118562672 | af3f9aab3ded4ab0b4ffd746dff5a6c2 | 47b5ecf753d44f11b5812048deee1540 | 46633-a22437 | ERROR | common.annotation.log_annotation:wrapper:205 - (asyncmy.errors.OperationalError) (1054, "Unknown column 'tunnel_id' in 'field list'")
|
|
||||||
[SQL: INSERT INTO biz_pallet_inventory (pallet_id, test_batch_id, active_filling_id, warehouse_id, site_id, tunnel_id, trace_no, current_line_id, flow_state, remaining_packages, last_event_id, version, updated_at) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)]
|
|
||||||
[parameters: (5, None, None, None, None, None, None, None, 'UNSTOCKED', 0, None, 0, datetime.datetime(2026, 10, 5, 18, 1, 12, 36126))]
|
|
||||||
(Background on this error at: https://sqlalche.me/e/20/e3q8)
|
|
||||||
Traceback (most recent call last):
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 1967, in _exec_single_context
|
|
||||||
self.dialect.do_execute(
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/engine/default.py", line 952, in do_execute
|
|
||||||
cursor.execute(statement, parameters)
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/connectors/asyncio.py", line 230, in execute
|
|
||||||
self._adapt_connection._handle_exception(error)
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/dialects/mysql/asyncmy.py", line 91, in _handle_exception
|
|
||||||
raise error
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/connectors/asyncio.py", line 228, in execute
|
|
||||||
return self.await_(self._execute_async(operation, parameters))
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only
|
|
||||||
return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn
|
|
||||||
value = await result
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/connectors/asyncio.py", line 251, in _execute_async
|
|
||||||
result = await self._cursor.execute(operation, parameters)
|
|
||||||
File "asyncmy/cursors.pyx", line 179, in execute
|
|
||||||
File "asyncmy/cursors.pyx", line 364, in _query
|
|
||||||
File "asyncmy/connection.pyx", line 500, in query
|
|
||||||
File "asyncmy/connection.pyx", line 688, in _read_query_result
|
|
||||||
File "asyncmy/connection.pyx", line 1075, in read
|
|
||||||
File "asyncmy/connection.pyx", line 650, in read_packet
|
|
||||||
File "asyncmy/protocol.pyx", line 190, in asyncmy.protocol.MysqlPacket.raise_for_error
|
|
||||||
File "asyncmy/protocol.pyx", line 194, in asyncmy.protocol.MysqlPacket.raise_for_error
|
|
||||||
File "asyncmy/errors.pyx", line 128, in asyncmy.errors.raise_mysql_exception
|
|
||||||
File "asyncmy/errors.pyx", line 137, in asyncmy.errors.raise_mysql_exception
|
|
||||||
asyncmy.errors.OperationalError: (1054, "Unknown column 'tunnel_id' in 'field list'")
|
|
||||||
|
|
||||||
The above exception was the direct cause of the following exception:
|
|
||||||
|
|
||||||
Traceback (most recent call last):
|
|
||||||
File "/Users/jiaolongyan/PycharmProjects/牛牛小屋/ShiErFeng/shierfeng-fastapi-backend/common/annotation/log_annotation.py", line 195, in wrapper
|
|
||||||
result = await func(*args, **kwargs)
|
|
||||||
File "/Users/jiaolongyan/PycharmProjects/牛牛小屋/ShiErFeng/shierfeng-fastapi-backend/module_business/controller/pallet_controller.py", line 98, in add_master_pallet
|
|
||||||
result = await PalletService.add_pallet(query_db, add_pallet, current_user, scope)
|
|
||||||
File "/Users/jiaolongyan/PycharmProjects/牛牛小屋/ShiErFeng/shierfeng-fastapi-backend/module_business/service/pallet_service.py", line 147, in add_pallet
|
|
||||||
await MasterDao.add_pallet_inventory(db, inventory)
|
|
||||||
File "/Users/jiaolongyan/PycharmProjects/牛牛小屋/ShiErFeng/shierfeng-fastapi-backend/module_business/dao/master_dao.py", line 568, in add_pallet_inventory
|
|
||||||
await db.flush()
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/ext/asyncio/session.py", line 787, in flush
|
|
||||||
await greenlet_spawn(self.sync_session.flush, objects=objects)
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 203, in greenlet_spawn
|
|
||||||
result = context.switch(value)
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 4331, in flush
|
|
||||||
self._flush(objects)
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 4466, in _flush
|
|
||||||
with util.safe_reraise():
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/util/langhelpers.py", line 224, in __exit__
|
|
||||||
raise exc_value.with_traceback(exc_tb)
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 4427, in _flush
|
|
||||||
flush_context.execute()
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/orm/unitofwork.py", line 466, in execute
|
|
||||||
rec.execute(self)
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/orm/unitofwork.py", line 642, in execute
|
|
||||||
util.preloaded.orm_persistence.save_obj(
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/orm/persistence.py", line 93, in save_obj
|
|
||||||
_emit_insert_statements(
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/orm/persistence.py", line 1048, in _emit_insert_statements
|
|
||||||
result = connection.execute(
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 1419, in execute
|
|
||||||
return meth(
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/sql/elements.py", line 527, in _execute_on_connection
|
|
||||||
return connection._execute_clauseelement(
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 1641, in _execute_clauseelement
|
|
||||||
ret = self._execute_context(
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 1846, in _execute_context
|
|
||||||
return self._exec_single_context(
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 1986, in _exec_single_context
|
|
||||||
self._handle_dbapi_exception(
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 2363, in _handle_dbapi_exception
|
|
||||||
raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 1967, in _exec_single_context
|
|
||||||
self.dialect.do_execute(
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/engine/default.py", line 952, in do_execute
|
|
||||||
cursor.execute(statement, parameters)
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/connectors/asyncio.py", line 230, in execute
|
|
||||||
self._adapt_connection._handle_exception(error)
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/dialects/mysql/asyncmy.py", line 91, in _handle_exception
|
|
||||||
raise error
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/connectors/asyncio.py", line 228, in execute
|
|
||||||
return self.await_(self._execute_async(operation, parameters))
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only
|
|
||||||
return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn
|
|
||||||
value = await result
|
|
||||||
File "/Users/jiaolongyan/miniconda3/envs/ShiErFeng/lib/python3.10/site-packages/sqlalchemy/connectors/asyncio.py", line 251, in _execute_async
|
|
||||||
result = await self._cursor.execute(operation, parameters)
|
|
||||||
File "asyncmy/cursors.pyx", line 179, in execute
|
|
||||||
File "asyncmy/cursors.pyx", line 364, in _query
|
|
||||||
File "asyncmy/connection.pyx", line 500, in query
|
|
||||||
File "asyncmy/connection.pyx", line 688, in _read_query_result
|
|
||||||
File "asyncmy/connection.pyx", line 1075, in read
|
|
||||||
File "asyncmy/connection.pyx", line 650, in read_packet
|
|
||||||
File "asyncmy/protocol.pyx", line 190, in asyncmy.protocol.MysqlPacket.raise_for_error
|
|
||||||
File "asyncmy/protocol.pyx", line 194, in asyncmy.protocol.MysqlPacket.raise_for_error
|
|
||||||
File "asyncmy/errors.pyx", line 128, in asyncmy.errors.raise_mysql_exception
|
|
||||||
File "asyncmy/errors.pyx", line 137, in asyncmy.errors.raise_mysql_exception
|
|
||||||
sqlalchemy.exc.OperationalError: (asyncmy.errors.OperationalError) (1054, "Unknown column 'tunnel_id' in 'field list'")
|
|
||||||
[SQL: INSERT INTO biz_pallet_inventory (pallet_id, test_batch_id, active_filling_id, warehouse_id, site_id, tunnel_id, trace_no, current_line_id, flow_state, remaining_packages, last_event_id, version, updated_at) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)]
|
|
||||||
[parameters: (5, None, None, None, None, None, None, None, 'UNSTOCKED', 0, None, 0, datetime.datetime(2026, 10, 5, 18, 1, 12, 36126))]
|
|
||||||
(Background on this error at: https://sqlalche.me/e/20/e3q8)
|
|
||||||
2026-10-05 18:02:21.594 | f09ec57e4f274520839c9684c6dbc940 | 793ffb29205b4a5888c569a22c678400 | 60b65cd4baeb4392a338a65fc6c32904 | 46633-a22437 | ERROR | common.annotation.log_annotation:wrapper:202 - 目标客户不存在
|
|
||||||
2026-10-05 18:37:04.581 | | | | 52026-91894b | WARNING | config.get_scheduler:on_lock_lost:273 - ⚠️ Worker 52026-91894b 失去 Application 锁
|
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,48 @@
|
|||||||
|
# MySQL 初始化与升级
|
||||||
|
|
||||||
|
## 新建空库
|
||||||
|
|
||||||
|
使用 [shierfeng-fastapi.sql](./shierfeng-fastapi.sql)。建表与初始化菜单已经包含截至 2026-10-08 的最新结构:
|
||||||
|
|
||||||
|
- 测试数据批次、隧道主数据及隧道菜单。
|
||||||
|
- 库存 `tunnel_id`、`trace_no`,使用、退回、事件的隧道关联与批次快照;使用记录 `line_id` 可空。
|
||||||
|
- 装填记录的 `production_date`、`expiry_date` 及日期约束。
|
||||||
|
- 发货收货状态、人员、时间、幂等字段,库存 `site_arrived_at`,在途状态和收货事件及菜单。
|
||||||
|
- 使用记录和托盘事件的 `fifo_skip_reason`、`fifo_recommendation`。
|
||||||
|
|
||||||
|
**全量脚本含 `DROP TABLE`,仅用于新空库,禁止用于已有业务库升级。** 新库初始化后不要再执行对应的历史增量补丁,否则可能遇到重复字段、表或菜单冲突。
|
||||||
|
|
||||||
|
Docker Compose 仅在 MySQL 数据卷首次为空时自动执行初始化 SQL。更新代码、替换 SQL 文件或重启容器不会自动升级已有库;不要删除数据卷来触发初始化。
|
||||||
|
|
||||||
|
## 已有生产库:已存在隧道表和物料日期,缺少关联字段
|
||||||
|
|
||||||
|
适用于已核对的 `shierfeng-fastapi` / MySQL 8.0.46 生产结构。完整的停写、备份、独立恢复演练、逐份执行和验收流程见 [生产 Compose 物料流转增量迁移](./production-compose-material-flow-migration-20261008.md)。
|
||||||
|
|
||||||
|
在该文档全部门禁满足后,按顺序使用:
|
||||||
|
|
||||||
|
1. [生产隧道关联补齐](./patches/20261008_prod_existing_tunnel_repair_mysql.sql):保留已有隧道表和日期,补齐库存等表的关联列、外键及菜单。
|
||||||
|
2. [收货补丁](./patches/20261008_shipment_receipt_mysql.sql)。
|
||||||
|
3. [FIFO 补丁](./patches/20261008_usage_fifo_mysql.sql)。
|
||||||
|
|
||||||
|
配套只读检查:
|
||||||
|
|
||||||
|
- [原字段基线](./checks/20261008_prod_material_flow_baseline.sql):停写后在迁移前、后各执行一次,逐行比较原数据。
|
||||||
|
- [迁移验收](./checks/20261008_prod_material_flow_verify.sql):检查字段、约束、菜单及历史数据状态;查询退出码为 0 不代表每项均通过,仍须核对结果。
|
||||||
|
|
||||||
|
这是特定起点的一次性升级路线,不是幂等脚本。其他结构、部分迁移或已经升级的库必须重新核对,不能盲目重复执行;MySQL DDL 隐式提交,失败时不能依赖 `ROLLBACK` 撤销已完成的结构变更。
|
||||||
|
|
||||||
|
本次仅交付文件,没有执行本地或生产数据库操作,也没有启停服务或修改 Compose 配置。生产执行仍须单独审批;不要在本机开发库运行该生产路线。
|
||||||
|
|
||||||
|
## 业务说明与离线验证
|
||||||
|
|
||||||
|
- [托盘流转业务部署说明](./pallet-workflow-deployment.md):业务规则与历史执行记录;历史记录不能替代当前环境的迁移证明。
|
||||||
|
- [测试数据批次操作说明](./test-data-batch-operations.md):权限、纳入与批次清理流程。
|
||||||
|
|
||||||
|
使用已安装后端依赖的 Python 环境,从项目根目录运行下列离线契约检查;不导入应用、不连接数据库:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python -B shierfeng-fastapi-backend/tests/module_business/test_sql_contract.py -q
|
||||||
|
python -B shierfeng-fastapi-backend/tests/module_business/test_prod_tunnel_repair_sql.py -q
|
||||||
|
```
|
||||||
|
|
||||||
|
离线检查不能替代真实 MySQL 的恢复演练和迁移验收。
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
-- 只读:在持续停写期间,于迁移前/后各执行一次,保存到权限600的文件后 cmp。
|
||||||
|
-- 只选择用户提供结构中的原字段,新增列不参与比较。覆盖正式及测试数据,不输出密码/Token。
|
||||||
|
-- JSON_ARRAY 保持 NULL 与空字符串差异并转义换行;按主键排序,避免行序造成假差异。
|
||||||
|
-- 文件包含业务信息,只留在受控生产备份位置,不上传聊天、不提交仓库。
|
||||||
|
SELECT 'biz_tunnel', JSON_ARRAY(tunnel_id, test_batch_id, site_id, tunnel_code, tunnel_name,
|
||||||
|
current_trace_no, current_trace_started_at, status, create_by, create_time, update_by, update_time, remark)
|
||||||
|
FROM biz_tunnel ORDER BY tunnel_id;
|
||||||
|
|
||||||
|
SELECT 'biz_pallet_inventory', JSON_ARRAY(pallet_id, test_batch_id, active_filling_id, warehouse_id,
|
||||||
|
site_id, current_line_id, flow_state, remaining_packages, last_event_id, version, updated_at)
|
||||||
|
FROM biz_pallet_inventory ORDER BY pallet_id;
|
||||||
|
|
||||||
|
SELECT 'biz_usage_record', JSON_ARRAY(usage_id, test_batch_id, usage_no, pallet_id, active_filling_id,
|
||||||
|
site_id, line_id, used_packages, remaining_packages_after, idempotency_key, request_hash, operator_id, occurred_at)
|
||||||
|
FROM biz_usage_record ORDER BY usage_id;
|
||||||
|
|
||||||
|
SELECT 'biz_return_item', JSON_ARRAY(return_item_id, test_batch_id, return_id, pallet_id,
|
||||||
|
active_filling_id_snapshot, remaining_packages_snapshot, create_by, create_time)
|
||||||
|
FROM biz_return_item ORDER BY return_item_id;
|
||||||
|
|
||||||
|
SELECT 'biz_pallet_event', JSON_ARRAY(event_id, test_batch_id, pallet_id, event_seq, event_type,
|
||||||
|
source_type, source_id, before_state, after_state, before_warehouse_id, before_site_id,
|
||||||
|
before_line_id, after_warehouse_id, after_site_id, after_line_id, before_remaining_packages,
|
||||||
|
after_remaining_packages, operator_id, occurred_at, idempotency_key, request_hash)
|
||||||
|
FROM biz_pallet_event ORDER BY event_id;
|
||||||
|
|
||||||
|
SELECT 'biz_filling_record', JSON_ARRAY(filling_id, test_batch_id, filling_no, pallet_id, warehouse_id,
|
||||||
|
strain_id, strain_code_snapshot, strain_name_snapshot, batch_no, production_date, expiry_date,
|
||||||
|
package_spec, initial_packages, active_slot, closed_at, idempotency_key, request_hash, operator_id,
|
||||||
|
operated_at, create_by, create_time, update_by, update_time, remark)
|
||||||
|
FROM biz_filling_record ORDER BY filling_id;
|
||||||
|
|
||||||
|
SELECT 'biz_shipment_order', JSON_ARRAY(shipment_id, test_batch_id, shipment_no, source_warehouse_id,
|
||||||
|
target_site_id, status, confirm_idempotency_key, confirm_request_hash, confirmed_by, confirmed_at,
|
||||||
|
create_by, create_time, update_by, update_time, remark)
|
||||||
|
FROM biz_shipment_order ORDER BY shipment_id;
|
||||||
@@ -0,0 +1,90 @@
|
|||||||
|
-- 只读:三份补丁成功后、仍停写时执行。所有 status=OK、异常计数=0;还需原字段快照一致。
|
||||||
|
SELECT DATABASE() AS db_name, VERSION() AS mysql_version;
|
||||||
|
|
||||||
|
WITH expected AS (
|
||||||
|
SELECT 'biz_pallet_inventory' AS tab, 'tunnel_id' AS col, 'bigint' AS typ, 'YES' AS nullable
|
||||||
|
UNION ALL SELECT 'biz_pallet_inventory', 'trace_no', 'varchar(64)', 'YES'
|
||||||
|
UNION ALL SELECT 'biz_pallet_inventory', 'site_arrived_at', 'datetime', 'YES'
|
||||||
|
UNION ALL SELECT 'biz_usage_record', 'tunnel_id', 'bigint', 'YES'
|
||||||
|
UNION ALL SELECT 'biz_usage_record', 'trace_no', 'varchar(64)', 'YES'
|
||||||
|
UNION ALL SELECT 'biz_usage_record', 'batch_no_snapshot', 'varchar(64)', 'YES'
|
||||||
|
UNION ALL SELECT 'biz_usage_record', 'fifo_skip_reason', 'varchar(500)', 'YES'
|
||||||
|
UNION ALL SELECT 'biz_usage_record', 'fifo_recommendation', 'json', 'YES'
|
||||||
|
UNION ALL SELECT 'biz_usage_record', 'line_id', 'bigint', 'YES'
|
||||||
|
UNION ALL SELECT 'biz_return_item', 'tunnel_id_snapshot', 'bigint', 'YES'
|
||||||
|
UNION ALL SELECT 'biz_return_item', 'trace_no_snapshot', 'varchar(64)', 'YES'
|
||||||
|
UNION ALL SELECT 'biz_return_item', 'batch_no_snapshot', 'varchar(64)', 'YES'
|
||||||
|
UNION ALL SELECT 'biz_pallet_event', 'before_tunnel_id', 'bigint', 'YES'
|
||||||
|
UNION ALL SELECT 'biz_pallet_event', 'after_tunnel_id', 'bigint', 'YES'
|
||||||
|
UNION ALL SELECT 'biz_pallet_event', 'trace_no', 'varchar(64)', 'YES'
|
||||||
|
UNION ALL SELECT 'biz_pallet_event', 'batch_no_snapshot', 'varchar(64)', 'YES'
|
||||||
|
UNION ALL SELECT 'biz_pallet_event', 'fifo_skip_reason', 'varchar(500)', 'YES'
|
||||||
|
UNION ALL SELECT 'biz_pallet_event', 'fifo_recommendation', 'json', 'YES'
|
||||||
|
UNION ALL SELECT 'biz_filling_record', 'production_date', 'date', 'YES'
|
||||||
|
UNION ALL SELECT 'biz_filling_record', 'expiry_date', 'date', 'YES'
|
||||||
|
UNION ALL SELECT 'biz_shipment_order', 'receipt_state', 'varchar(16)', 'NO'
|
||||||
|
UNION ALL SELECT 'biz_shipment_order', 'received_by', 'bigint', 'YES'
|
||||||
|
UNION ALL SELECT 'biz_shipment_order', 'received_at', 'datetime', 'YES'
|
||||||
|
UNION ALL SELECT 'biz_shipment_order', 'receipt_idempotency_key', 'varchar(64)', 'YES'
|
||||||
|
UNION ALL SELECT 'biz_shipment_order', 'receipt_request_hash', 'varchar(64)', 'YES'
|
||||||
|
)
|
||||||
|
SELECT e.tab, e.col, c.column_type, c.is_nullable,
|
||||||
|
CASE WHEN c.column_name IS NULL THEN 'MISSING'
|
||||||
|
WHEN c.column_type <> e.typ OR c.is_nullable <> e.nullable THEN 'MISMATCH'
|
||||||
|
ELSE 'OK' END AS status
|
||||||
|
FROM expected e LEFT JOIN information_schema.columns c
|
||||||
|
ON c.table_schema = DATABASE() AND c.table_name = e.tab AND c.column_name = e.col
|
||||||
|
ORDER BY e.tab, e.col;
|
||||||
|
|
||||||
|
WITH expected AS (
|
||||||
|
SELECT 'biz_usage_record' AS tab, 'tunnel_id' AS col, 'biz_tunnel' AS ref_tab, 'tunnel_id' AS ref_col
|
||||||
|
UNION ALL SELECT 'biz_return_item', 'tunnel_id_snapshot', 'biz_tunnel', 'tunnel_id'
|
||||||
|
UNION ALL SELECT 'biz_pallet_inventory', 'tunnel_id', 'biz_tunnel', 'tunnel_id'
|
||||||
|
UNION ALL SELECT 'biz_pallet_event', 'before_tunnel_id', 'biz_tunnel', 'tunnel_id'
|
||||||
|
UNION ALL SELECT 'biz_pallet_event', 'after_tunnel_id', 'biz_tunnel', 'tunnel_id'
|
||||||
|
UNION ALL SELECT 'biz_shipment_order', 'received_by', 'sys_user', 'user_id'
|
||||||
|
)
|
||||||
|
SELECT e.tab, e.col,
|
||||||
|
CASE WHEN EXISTS (SELECT 1 FROM information_schema.key_column_usage k
|
||||||
|
WHERE k.table_schema = DATABASE() AND k.table_name = e.tab AND k.column_name = e.col
|
||||||
|
AND k.referenced_table_schema = DATABASE()
|
||||||
|
AND k.referenced_table_name = e.ref_tab AND k.referenced_column_name = e.ref_col)
|
||||||
|
THEN 'OK' ELSE 'MISSING' END AS status
|
||||||
|
FROM expected e;
|
||||||
|
|
||||||
|
-- 三个 CHECK 必须存在且 ENFORCED=YES;人工核对枚举含 IN_TRANSIT、TUNNEL_ENTERED、SHIPMENT_RECEIVED。
|
||||||
|
SELECT t.table_name, t.constraint_name, t.enforced, c.check_clause
|
||||||
|
FROM information_schema.table_constraints t JOIN information_schema.check_constraints c
|
||||||
|
ON c.constraint_schema = t.constraint_schema AND c.constraint_name = t.constraint_name
|
||||||
|
WHERE t.constraint_schema = DATABASE()
|
||||||
|
AND t.constraint_name IN ('ck_biz_pallet_inventory_flow_state', 'ck_biz_pallet_event_event_type',
|
||||||
|
'ck_biz_shipment_order_receipt_state');
|
||||||
|
SELECT index_name, non_unique, GROUP_CONCAT(column_name ORDER BY seq_in_index) AS columns_in_order
|
||||||
|
FROM information_schema.statistics
|
||||||
|
WHERE table_schema = DATABASE() AND table_name = 'biz_shipment_order'
|
||||||
|
AND index_name = 'uq_biz_shipment_receipt_site_key'
|
||||||
|
GROUP BY index_name, non_unique;
|
||||||
|
|
||||||
|
-- 必须恰有5行且编号/父菜单/权限与操作说明一致;不应自动出现任何普通角色映射。
|
||||||
|
SELECT menu_id, parent_id, menu_type, perms FROM sys_menu
|
||||||
|
WHERE menu_id IN (520, 1116, 1117, 1118, 1119) ORDER BY menu_id;
|
||||||
|
SELECT COUNT(*) AS unexpected_role_grants FROM sys_role_menu WHERE menu_id IN (520, 1116, 1117, 1118, 1119);
|
||||||
|
|
||||||
|
SELECT COUNT(*) AS unexpected_receipt_history FROM biz_shipment_order
|
||||||
|
WHERE (status = 'CONFIRMED' AND receipt_state <> 'LEGACY')
|
||||||
|
OR (status = 'DRAFT' AND receipt_state <> 'PENDING')
|
||||||
|
OR received_by IS NOT NULL OR received_at IS NOT NULL
|
||||||
|
OR receipt_idempotency_key IS NOT NULL OR receipt_request_hash IS NOT NULL;
|
||||||
|
SELECT COUNT(*) AS unexpected_inventory_history FROM biz_pallet_inventory
|
||||||
|
WHERE tunnel_id IS NOT NULL OR trace_no IS NOT NULL OR site_arrived_at IS NOT NULL;
|
||||||
|
SELECT COUNT(*) AS unexpected_usage_history FROM biz_usage_record
|
||||||
|
WHERE tunnel_id IS NOT NULL OR trace_no IS NOT NULL OR batch_no_snapshot IS NOT NULL
|
||||||
|
OR fifo_skip_reason IS NOT NULL OR fifo_recommendation IS NOT NULL;
|
||||||
|
SELECT COUNT(*) AS unexpected_return_history FROM biz_return_item
|
||||||
|
WHERE tunnel_id_snapshot IS NOT NULL OR trace_no_snapshot IS NOT NULL OR batch_no_snapshot IS NOT NULL;
|
||||||
|
SELECT COUNT(*) AS unexpected_event_history FROM biz_pallet_event
|
||||||
|
WHERE before_tunnel_id IS NOT NULL OR after_tunnel_id IS NOT NULL OR trace_no IS NOT NULL
|
||||||
|
OR batch_no_snapshot IS NOT NULL OR fifo_skip_reason IS NOT NULL OR fifo_recommendation IS NOT NULL;
|
||||||
|
SELECT COUNT(*) AS remaining_migration_routines FROM information_schema.routines
|
||||||
|
WHERE routine_schema = DATABASE() AND routine_name IN ('repair_prod_existing_tunnel_20261008',
|
||||||
|
'migrate_shipment_receipt_20261008', 'migrate_usage_fifo_20261008');
|
||||||
@@ -0,0 +1,204 @@
|
|||||||
|
-- 生产专用:修复“biz_tunnel 已存在、日期已升级、关联业务表仍为旧结构”的状态。
|
||||||
|
-- 依据用户提供的 shierfeng-fastapi / MySQL 8.0.46 SHOW CREATE TABLE;不是通用幂等迁移。
|
||||||
|
-- 仅生成,未在本地或生产执行。必须先停写、完整备份、在隔离恢复实例试跑,并经 DBA 审核。
|
||||||
|
-- 保留现有 biz_tunnel(包括 ORM 生成的外键/索引名称)和所有物料日期,不重建表、不补造历史。
|
||||||
|
-- 本补丁成功后:20261008_shipment_receipt_mysql.sql -> 20261008_usage_fifo_mysql.sql。
|
||||||
|
-- 不执行原 20261005_tunnel_material_flow_mysql.sql,也不重复执行日期/全量初始化脚本。
|
||||||
|
-- 在同一连接中显式 SET @shierfeng_prod_migration_approved = 1 后才能改业务表。
|
||||||
|
-- 该变量是人工确认门,不是环境识别器;同名开发库也必须禁止执行本交付。
|
||||||
|
-- 使用 mysql 批处理、禁用 --force;任一错误立即停止,不启动应用、不盲目重跑。
|
||||||
|
-- DDL 隐式提交,异常 handler 的 ROLLBACK 只能回滚菜单 DML,不能回滚之前的 ALTER。
|
||||||
|
|
||||||
|
DELIMITER $$
|
||||||
|
CREATE PROCEDURE repair_prod_existing_tunnel_20261008()
|
||||||
|
BEGIN
|
||||||
|
DECLARE EXIT HANDLER FOR SQLEXCEPTION
|
||||||
|
BEGIN
|
||||||
|
ROLLBACK;
|
||||||
|
RESIGNAL;
|
||||||
|
END;
|
||||||
|
|
||||||
|
IF COALESCE(@shierfeng_prod_migration_approved, 0) <> 1 THEN
|
||||||
|
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Production maintenance approval and verified backup are required';
|
||||||
|
END IF;
|
||||||
|
IF DATABASE() IS NULL OR DATABASE() <> 'shierfeng-fastapi' THEN
|
||||||
|
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Select the reviewed shierfeng-fastapi database on the production server';
|
||||||
|
END IF;
|
||||||
|
IF SUBSTRING_INDEX(VERSION(), '.', 1) <> '8'
|
||||||
|
OR (CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(VERSION(), '.', 2), '.', -1) AS UNSIGNED) = 0
|
||||||
|
AND CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(VERSION(), '.', 3), '.', -1) AS UNSIGNED) < 16) THEN
|
||||||
|
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'MySQL 8.0.16 or newer MySQL 8 is required';
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
-- 所有前置检查必须在首个业务表 ALTER 之前;不修改不符合快照的数据库。
|
||||||
|
IF (SELECT COUNT(*) FROM information_schema.tables
|
||||||
|
WHERE table_schema = DATABASE() AND engine = 'InnoDB'
|
||||||
|
AND table_name IN ('biz_tunnel', 'biz_test_batch', 'biz_customer_site', 'biz_usage_record',
|
||||||
|
'biz_return_item', 'biz_pallet_inventory', 'biz_pallet_event',
|
||||||
|
'biz_filling_record', 'biz_shipment_order', 'sys_menu', 'sys_role_menu', 'sys_user')) <> 12 THEN
|
||||||
|
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Required reviewed InnoDB tables are missing';
|
||||||
|
END IF;
|
||||||
|
IF (SELECT COUNT(*) FROM information_schema.columns
|
||||||
|
WHERE table_schema = DATABASE() AND table_name = 'biz_tunnel'
|
||||||
|
AND column_name IN ('tunnel_id', 'test_batch_id', 'site_id', 'tunnel_code', 'tunnel_name',
|
||||||
|
'current_trace_no', 'current_trace_started_at', 'status', 'create_by',
|
||||||
|
'create_time', 'update_by', 'update_time', 'remark')) <> 13
|
||||||
|
OR NOT EXISTS (SELECT 1 FROM information_schema.columns
|
||||||
|
WHERE table_schema = DATABASE() AND table_name = 'biz_tunnel'
|
||||||
|
AND column_name = 'tunnel_id' AND column_type = 'bigint' AND is_nullable = 'NO') THEN
|
||||||
|
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Existing tunnel table does not match the reviewed structure';
|
||||||
|
END IF;
|
||||||
|
-- 只校验外键语义,不要求 ORM 外键名等于原手写脚本的名称。
|
||||||
|
IF NOT EXISTS (SELECT 1 FROM information_schema.key_column_usage
|
||||||
|
WHERE table_schema = DATABASE() AND table_name = 'biz_tunnel'
|
||||||
|
AND column_name = 'site_id' AND referenced_table_schema = DATABASE()
|
||||||
|
AND referenced_table_name = 'biz_customer_site' AND referenced_column_name = 'site_id')
|
||||||
|
OR NOT EXISTS (SELECT 1 FROM information_schema.key_column_usage
|
||||||
|
WHERE table_schema = DATABASE() AND table_name = 'biz_tunnel'
|
||||||
|
AND column_name = 'test_batch_id' AND referenced_table_schema = DATABASE()
|
||||||
|
AND referenced_table_name = 'biz_test_batch' AND referenced_column_name = 'batch_id') THEN
|
||||||
|
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Existing tunnel foreign keys must be reviewed';
|
||||||
|
END IF;
|
||||||
|
IF NOT EXISTS (SELECT index_name FROM information_schema.statistics
|
||||||
|
WHERE table_schema = DATABASE() AND table_name = 'biz_tunnel' AND non_unique = 0
|
||||||
|
GROUP BY index_name
|
||||||
|
HAVING GROUP_CONCAT(column_name ORDER BY seq_in_index) = 'site_id,tunnel_code') THEN
|
||||||
|
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Existing tunnel site and code unique key is missing';
|
||||||
|
END IF;
|
||||||
|
IF (SELECT COUNT(*) FROM information_schema.columns
|
||||||
|
WHERE table_schema = DATABASE() AND table_name = 'biz_filling_record'
|
||||||
|
AND column_name IN ('production_date', 'expiry_date') AND data_type = 'date' AND is_nullable = 'YES') <> 2
|
||||||
|
OR NOT EXISTS (SELECT 1 FROM information_schema.table_constraints
|
||||||
|
WHERE constraint_schema = DATABASE() AND table_name = 'biz_filling_record'
|
||||||
|
AND constraint_name = 'ck_biz_filling_record_material_dates'
|
||||||
|
AND constraint_type = 'CHECK' AND enforced = 'YES') THEN
|
||||||
|
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'The reviewed material date migration must already be complete';
|
||||||
|
END IF;
|
||||||
|
IF NOT EXISTS (SELECT 1 FROM information_schema.columns
|
||||||
|
WHERE table_schema = DATABASE() AND table_name = 'biz_usage_record'
|
||||||
|
AND column_name = 'line_id' AND column_type = 'bigint' AND is_nullable = 'NO') THEN
|
||||||
|
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Usage line_id is not in the reviewed pre-migration state';
|
||||||
|
END IF;
|
||||||
|
IF EXISTS (SELECT 1 FROM information_schema.columns
|
||||||
|
WHERE table_schema = DATABASE()
|
||||||
|
AND ((table_name = 'biz_usage_record' AND column_name IN ('tunnel_id', 'trace_no', 'batch_no_snapshot'))
|
||||||
|
OR (table_name = 'biz_return_item' AND column_name IN ('tunnel_id_snapshot', 'trace_no_snapshot', 'batch_no_snapshot'))
|
||||||
|
OR (table_name = 'biz_pallet_inventory' AND column_name IN ('tunnel_id', 'trace_no', 'site_arrived_at'))
|
||||||
|
OR (table_name = 'biz_pallet_event' AND column_name IN ('before_tunnel_id', 'after_tunnel_id', 'trace_no', 'batch_no_snapshot'))
|
||||||
|
OR (table_name = 'biz_shipment_order' AND column_name IN ('receipt_state', 'received_by', 'received_at', 'receipt_idempotency_key', 'receipt_request_hash'))
|
||||||
|
OR (table_name IN ('biz_usage_record', 'biz_pallet_event') AND column_name IN ('fifo_skip_reason', 'fifo_recommendation')))) THEN
|
||||||
|
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Target columns already exist: partial or completed migration; do not rerun';
|
||||||
|
END IF;
|
||||||
|
IF NOT EXISTS (SELECT 1 FROM information_schema.check_constraints
|
||||||
|
WHERE constraint_schema = DATABASE() AND constraint_name = 'ck_biz_pallet_event_event_type'
|
||||||
|
AND UPPER(check_clause) LIKE '%USAGE_RECORDED%'
|
||||||
|
AND UPPER(check_clause) NOT LIKE '%TUNNEL_ENTERED%'
|
||||||
|
AND UPPER(check_clause) NOT LIKE '%SHIPMENT_RECEIVED%')
|
||||||
|
OR NOT EXISTS (SELECT 1 FROM information_schema.check_constraints
|
||||||
|
WHERE constraint_schema = DATABASE() AND constraint_name = 'ck_biz_pallet_inventory_flow_state'
|
||||||
|
AND UPPER(check_clause) LIKE '%AT_SITE_UNUSED%'
|
||||||
|
AND UPPER(check_clause) NOT LIKE '%IN_TRANSIT%') THEN
|
||||||
|
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Event or inventory CHECK differs from the reviewed legacy state';
|
||||||
|
END IF;
|
||||||
|
IF EXISTS (SELECT 1 FROM information_schema.table_constraints
|
||||||
|
WHERE constraint_schema = DATABASE()
|
||||||
|
AND constraint_name IN ('fk_biz_usage_record_tunnel', 'fk_biz_return_item_tunnel',
|
||||||
|
'fk_biz_pallet_inventory_tunnel', 'fk_biz_pallet_event_before_tunnel',
|
||||||
|
'fk_biz_pallet_event_after_tunnel', 'uq_biz_shipment_receipt_site_key',
|
||||||
|
'fk_biz_shipment_order_received_by', 'ck_biz_shipment_order_receipt_state')) THEN
|
||||||
|
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'New constraint names already exist; review schema before migration';
|
||||||
|
END IF;
|
||||||
|
IF EXISTS (SELECT 1 FROM information_schema.routines WHERE routine_schema = DATABASE()
|
||||||
|
AND routine_name IN ('migrate_shipment_receipt_20261008', 'migrate_usage_fifo_20261008')) THEN
|
||||||
|
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'A previous receipt or FIFO migration routine remains; inspect before proceeding';
|
||||||
|
END IF;
|
||||||
|
IF EXISTS (SELECT 1 FROM information_schema.triggers WHERE trigger_schema = DATABASE()
|
||||||
|
AND event_object_table IN ('biz_usage_record', 'biz_return_item', 'biz_pallet_inventory',
|
||||||
|
'biz_pallet_event', 'biz_shipment_order', 'sys_menu'))
|
||||||
|
OR EXISTS (SELECT 1 FROM information_schema.events WHERE event_schema = DATABASE() AND status = 'ENABLED') THEN
|
||||||
|
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Custom triggers or enabled events require separate DBA review';
|
||||||
|
END IF;
|
||||||
|
IF NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id = 121 AND parent_id = 0 AND menu_type = 'M')
|
||||||
|
OR NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id = 510 AND parent_id = 122
|
||||||
|
AND menu_type = 'C' AND perms = 'business:shipment:list') THEN
|
||||||
|
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Existing parent menus do not match the reviewed deployment';
|
||||||
|
END IF;
|
||||||
|
IF EXISTS (SELECT 1 FROM sys_menu WHERE menu_id IN (520, 1116, 1117, 1118, 1119)
|
||||||
|
OR perms IN ('master:tunnel:list', 'master:tunnel:query', 'master:tunnel:add',
|
||||||
|
'master:tunnel:edit', 'business:shipment:receive')) THEN
|
||||||
|
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Tunnel or receipt menu ID/permission conflict; do not overwrite';
|
||||||
|
END IF;
|
||||||
|
IF EXISTS (SELECT 1 FROM sys_role_menu WHERE menu_id IN (520, 1116, 1117, 1118, 1119)) THEN
|
||||||
|
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Orphan role grants would become active; review before inserting menus';
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
-- BEGIN DDL
|
||||||
|
ALTER TABLE biz_usage_record
|
||||||
|
ADD COLUMN tunnel_id BIGINT NULL COMMENT '隧道ID;历史记录可能为空' AFTER site_id,
|
||||||
|
ADD COLUMN trace_no VARCHAR(64) NULL COMMENT '隧道物料内部溯源号;历史记录可能为空' AFTER tunnel_id,
|
||||||
|
ADD COLUMN batch_no_snapshot VARCHAR(64) NULL COMMENT '生产批次快照;历史记录可能为空' AFTER trace_no,
|
||||||
|
MODIFY COLUMN line_id BIGINT NULL COMMENT '产线ID(可选)',
|
||||||
|
ADD CONSTRAINT fk_biz_usage_record_tunnel FOREIGN KEY (tunnel_id) REFERENCES biz_tunnel (tunnel_id);
|
||||||
|
|
||||||
|
ALTER TABLE biz_return_item
|
||||||
|
ADD COLUMN tunnel_id_snapshot BIGINT NULL COMMENT '申请时隧道ID快照' AFTER active_filling_id_snapshot,
|
||||||
|
ADD COLUMN trace_no_snapshot VARCHAR(64) NULL COMMENT '申请时物料溯源号快照' AFTER tunnel_id_snapshot,
|
||||||
|
ADD COLUMN batch_no_snapshot VARCHAR(64) NULL COMMENT '申请时生产批次快照' AFTER trace_no_snapshot,
|
||||||
|
ADD CONSTRAINT fk_biz_return_item_tunnel FOREIGN KEY (tunnel_id_snapshot) REFERENCES biz_tunnel (tunnel_id);
|
||||||
|
|
||||||
|
ALTER TABLE biz_pallet_inventory
|
||||||
|
ADD COLUMN tunnel_id BIGINT NULL COMMENT '当前隧道ID' AFTER site_id,
|
||||||
|
ADD COLUMN trace_no VARCHAR(64) NULL COMMENT '当前隧道物料溯源号' AFTER tunnel_id,
|
||||||
|
ADD CONSTRAINT fk_biz_pallet_inventory_tunnel FOREIGN KEY (tunnel_id) REFERENCES biz_tunnel (tunnel_id);
|
||||||
|
|
||||||
|
ALTER TABLE biz_pallet_event
|
||||||
|
ADD COLUMN before_tunnel_id BIGINT NULL COMMENT '变更前隧道ID' AFTER before_site_id,
|
||||||
|
ADD COLUMN after_tunnel_id BIGINT NULL COMMENT '变更后隧道ID' AFTER after_site_id,
|
||||||
|
ADD COLUMN trace_no VARCHAR(64) NULL COMMENT '事件关联物料溯源号' AFTER after_remaining_packages,
|
||||||
|
ADD COLUMN batch_no_snapshot VARCHAR(64) NULL COMMENT '事件生产批次快照' AFTER trace_no,
|
||||||
|
ADD CONSTRAINT fk_biz_pallet_event_before_tunnel FOREIGN KEY (before_tunnel_id) REFERENCES biz_tunnel (tunnel_id),
|
||||||
|
ADD CONSTRAINT fk_biz_pallet_event_after_tunnel FOREIGN KEY (after_tunnel_id) REFERENCES biz_tunnel (tunnel_id);
|
||||||
|
|
||||||
|
ALTER TABLE biz_pallet_event
|
||||||
|
DROP CHECK ck_biz_pallet_event_event_type,
|
||||||
|
ADD CONSTRAINT ck_biz_pallet_event_event_type CHECK (
|
||||||
|
event_type IN ('INBOUND_CONFIRMED', 'FILLING_CONFIRMED', 'SHIPMENT_CONFIRMED',
|
||||||
|
'TUNNEL_ENTERED', 'USAGE_RECORDED', 'RETURN_REQUESTED', 'RETURN_CONFIRMED')
|
||||||
|
);
|
||||||
|
-- END DDL
|
||||||
|
|
||||||
|
-- 菜单只新增已核实空闲的 ID;不修改 sys_role_menu、不自动授予普通角色。
|
||||||
|
START TRANSACTION;
|
||||||
|
-- BEGIN MENU
|
||||||
|
INSERT INTO sys_menu (
|
||||||
|
menu_id, menu_name, parent_id, order_num, path, component, query, route_name,
|
||||||
|
is_frame, is_cache, menu_type, visible, status, perms, icon, create_by,
|
||||||
|
create_time, update_by, update_time, remark
|
||||||
|
) VALUES
|
||||||
|
(520, '隧道资料', 121, 7, 'tunnel', 'master/tunnel/index', '', '',
|
||||||
|
1, 0, 'C', '0', '0', 'master:tunnel:list', '#', 'admin', SYSDATE(), '', NULL, '隧道资料菜单'),
|
||||||
|
(1116, '隧道查询', 520, 1, '#', '', '', '',
|
||||||
|
1, 0, 'F', '0', '0', 'master:tunnel:query', '#', 'admin', SYSDATE(), '', NULL, ''),
|
||||||
|
(1117, '隧道新增', 520, 2, '#', '', '', '',
|
||||||
|
1, 0, 'F', '0', '0', 'master:tunnel:add', '#', 'admin', SYSDATE(), '', NULL, ''),
|
||||||
|
(1118, '隧道修改', 520, 3, '#', '', '', '',
|
||||||
|
1, 0, 'F', '0', '0', 'master:tunnel:edit', '#', 'admin', SYSDATE(), '', NULL, '');
|
||||||
|
-- END MENU
|
||||||
|
COMMIT;
|
||||||
|
END$$
|
||||||
|
DELIMITER ;
|
||||||
|
|
||||||
|
CALL repair_prod_existing_tunnel_20261008();
|
||||||
|
DROP PROCEDURE repair_prod_existing_tunnel_20261008;
|
||||||
|
SET @shierfeng_prod_migration_approved = NULL;
|
||||||
|
|
||||||
|
-- 返回12个新增隧道字段、line_id=YES及4行隧道菜单;随后仍须执行收货/FIFO两份补丁。
|
||||||
|
SELECT table_name, column_name, column_type, is_nullable
|
||||||
|
FROM information_schema.columns
|
||||||
|
WHERE table_schema = DATABASE()
|
||||||
|
AND ((table_name = 'biz_usage_record' AND column_name IN ('tunnel_id', 'trace_no', 'batch_no_snapshot', 'line_id'))
|
||||||
|
OR (table_name = 'biz_return_item' AND column_name IN ('tunnel_id_snapshot', 'trace_no_snapshot', 'batch_no_snapshot'))
|
||||||
|
OR (table_name = 'biz_pallet_inventory' AND column_name IN ('tunnel_id', 'trace_no'))
|
||||||
|
OR (table_name = 'biz_pallet_event' AND column_name IN ('before_tunnel_id', 'after_tunnel_id', 'trace_no', 'batch_no_snapshot')))
|
||||||
|
ORDER BY table_name, ordinal_position;
|
||||||
|
SELECT menu_id, parent_id, perms FROM sys_menu WHERE menu_id IN (520, 1116, 1117, 1118) ORDER BY menu_id;
|
||||||
@@ -0,0 +1,161 @@
|
|||||||
|
# 生产 Compose 物料流转增量迁移
|
||||||
|
|
||||||
|
## 状态、授权与适用范围
|
||||||
|
|
||||||
|
本交付**只生成文件**,未连接任何数据库,未执行本地或生产迁移,未重启服务、构建镜像或改动 Compose/环境变量。下列命令供维护人员审核后在**生产服务器**执行,不要在本机开发目录运行。生成脚本的确认不等于已完成生产执行审批。
|
||||||
|
|
||||||
|
依据用户提供的生产 `shierfeng-fastapi` / MySQL 8.0.46 结构:
|
||||||
|
|
||||||
|
- `biz_test_batch`、`biz_tunnel` 已存在;隧道外键使用 ORM 自动名称,保留不改。
|
||||||
|
- `biz_filling_record.production_date/expiry_date` 及日期 CHECK 已存在,保留现有数据。
|
||||||
|
- 库存、使用、退回、事件表的隧道关联未升级,使用记录 `line_id` 仍非空。
|
||||||
|
- 收货字段、FIFO 原因/快照不存在;隧道及收货菜单尚不存在。
|
||||||
|
|
||||||
|
这是一条**特定起点、单次执行、遇错即停**的升级路线,不是通用幂等修复器。生产结构有变化必须重新评估,不能删掉检查后强行执行。
|
||||||
|
|
||||||
|
## 文件顺序
|
||||||
|
|
||||||
|
以下路径相对生产服务器项目根目录,必须带齐五份 SQL:
|
||||||
|
|
||||||
|
1. `shierfeng-fastapi-backend/sql/patches/20261008_prod_existing_tunnel_repair_mysql.sql`:新增专用补丁,保留已存在隧道表,补12个关联字段、5个外键、可空产线、入隧事件和4行菜单。
|
||||||
|
2. `shierfeng-fastapi-backend/sql/patches/20261008_shipment_receipt_mysql.sql`:复用现有补丁,补收货和在途状态;旧确认单新增 `LEGACY` 标识,不改变旧库存、批号、编号和数量。
|
||||||
|
3. `shierfeng-fastapi-backend/sql/patches/20261008_usage_fifo_mysql.sql`:复用现有补丁,补可空原因及推荐快照。
|
||||||
|
4. `shierfeng-fastapi-backend/sql/checks/20261008_prod_material_flow_baseline.sql`:只读,前后原字段快照。
|
||||||
|
5. `shierfeng-fastapi-backend/sql/checks/20261008_prod_material_flow_verify.sql`:只读,迁移后验收。
|
||||||
|
|
||||||
|
**不要执行**原隧道补丁 `20261005_tunnel_material_flow_mysql.sql`(会重复建表),不要重复日期/测试批次补丁,不要执行全量 `shierfeng-fastapi.sql`。不要把这些补丁挂到 MySQL 初始化目录,也不要删除/更换 MySQL 数据卷来修复。
|
||||||
|
|
||||||
|
## 1. 审核目标与维护窗口(尚不改库)
|
||||||
|
|
||||||
|
进入生产服务器上实际部署的 Compose 目录,使用原部署的 `-f`、`--env-file`、`-p` 参数(如有),下文每条 `docker compose` 都必须保持同一套参数。不要改变项目名或数据卷名称。
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker compose ps
|
||||||
|
docker compose exec shierfeng-backend-my python -c "import os; print({k: os.getenv(k) for k in ['APP_ENV', 'DB_HOST', 'DB_PORT', 'DB_DATABASE']})"
|
||||||
|
docker compose exec -T shierfeng-mysql sh -c 'MYSQL_PWD="$MYSQL_ROOT_PASSWORD" exec mysql --user=root --database="$MYSQL_DATABASE" --execute="SELECT DATABASE(), VERSION(), @@hostname, @@port;"'
|
||||||
|
```
|
||||||
|
|
||||||
|
要求后端 `DB_HOST=shierfeng-mysql`、`DB_DATABASE=shierfeng-fastapi`,与 MySQL 查询一致。若使用外部数据库、不同服务名、空输出或其他库名,停止并调整方案,不能把命令照搬到另一个库。
|
||||||
|
|
||||||
|
命令利用现有 MySQL 容器环境中的密码,不将密码放进命令参数、终端输出或仓库;不要启用 shell `set -x`,也不要贴完整 `.env`/`docker compose config`。缺少 `MYSQL_ROOT_PASSWORD` 时请 DBA 使用受控凭据,不要把密码改写进文档。
|
||||||
|
|
||||||
|
获得维护窗口、停写和生产迁移审批,确认备份保留位置、恢复负责人、可接受恢复时间。先备好一致的新代码版本及上一个可用版本;本操作不执行拉取或构建。
|
||||||
|
|
||||||
|
## 2. 停写、备份与原数据基线
|
||||||
|
|
||||||
|
以下开始影响生产服务,必须在审批后的维护窗口由维护人员执行。通知用户退出操作,停止所有外部导入、定时任务、独立 worker 和其他写入来源。
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker compose stop shierfeng-frontend shierfeng-backend-my
|
||||||
|
docker compose ps
|
||||||
|
docker compose exec -T shierfeng-mysql sh -c 'MYSQL_PWD="$MYSQL_ROOT_PASSWORD" exec mysql --user=root --database="$MYSQL_DATABASE" --execute="SELECT ID, USER, HOST, DB, COMMAND, TIME FROM information_schema.PROCESSLIST WHERE DB=DATABASE() AND ID<>CONNECTION_ID(); SELECT EVENT_NAME, STATUS FROM information_schema.EVENTS WHERE EVENT_SCHEMA=DATABASE() AND STATUS=\"ENABLED\"; SELECT TABLE_NAME, ENGINE FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_TYPE=\"BASE TABLE\" AND ENGINE<>\"InnoDB\";"'
|
||||||
|
```
|
||||||
|
|
||||||
|
不得继续:仍有业务连接/事务或启用的事件,或存在非 InnoDB 表。不要擅自 kill 会话、禁用事件或转换表;由 DBA 查明并停写。MySQL/Redis 保持运行,不执行全栈停止或删除卷。
|
||||||
|
|
||||||
|
在同一个 Bash 会话保存备份路径,`/var/backups` 需有经批准的写入权限和足够磁盘空间;权限不足时停止,不自动改权限:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
set -euo pipefail
|
||||||
|
umask 077
|
||||||
|
prod_backup_dir=$(mktemp -d /var/backups/shierfeng-prod-20261008.XXXXXX)
|
||||||
|
printf '生产备份目录:%s\n' "$prod_backup_dir"
|
||||||
|
|
||||||
|
docker compose exec -T shierfeng-mysql sh -c 'MYSQL_PWD="$MYSQL_ROOT_PASSWORD" exec mysqldump --user=root --single-transaction --quick --routines --events --triggers --hex-blob --set-gtid-purged=OFF --no-tablespaces --column-statistics=0 --default-character-set=utf8mb4 "$MYSQL_DATABASE"' > "$prod_backup_dir/before.sql"
|
||||||
|
test -s "$prod_backup_dir/before.sql"
|
||||||
|
sha256sum "$prod_backup_dir/before.sql" > "$prod_backup_dir/before.sha256"
|
||||||
|
|
||||||
|
docker compose exec -T shierfeng-mysql sh -c 'MYSQL_PWD="$MYSQL_ROOT_PASSWORD" exec mysql --user=root --database="$MYSQL_DATABASE" --default-character-set=utf8mb4 --batch --raw --skip-column-names' < shierfeng-fastapi-backend/sql/checks/20261008_prod_material_flow_baseline.sql > "$prod_backup_dir/original-fields.before.tsv"
|
||||||
|
```
|
||||||
|
|
||||||
|
备份不使用 `--databases`,避免把原库名的 `CREATE DATABASE/USE` 写入文件,便于在另一个隔离实例恢复。备份覆盖全部表和触发器、过程、事件;快照只用于比较本次7张关联业务表的全部原字段,不能代替完整备份。空业务库的快照可能为空,但完整备份不能为空。任何命令失败都停止,不能拿半份文件继续。
|
||||||
|
|
||||||
|
## 3. 恢复演练门禁
|
||||||
|
|
||||||
|
将备份复制到受控的**独立验收 MySQL 实例**,不是本机开发库,也不是业务生产库。由 DBA 建立空的同名 `shierfeng-fastapi` 库(新补丁核对库名;实例必须隔离),恢复完整备份并核对所有表及原字段快照,再按第4节顺序试跑三份脚本和第5节验收。
|
||||||
|
|
||||||
|
不得为演练启用应用写入,需检查恢复的存储过程/事件/触发器及其 DEFINER;演练实例应禁用事件调度。本交付没有该隔离实例的地址及凭据,因此不预填可能误指向生产的恢复命令。需 DBA 留存恢复目标、命令、成功结果、原字段一致性、耗时和脚本 SHA-256。
|
||||||
|
|
||||||
|
**没有完成恢复及补丁试跑,就不能进入生产执行。** 文件非空、哈希正确或 SQL 静态检查通过不等于恢复成功。迁移期间持续停写;若中途恢复业务,原备份/基线不再代表执行起点,必须重新安排窗口和备份。
|
||||||
|
|
||||||
|
## 4. 生产逐份执行(仍保持停写)
|
||||||
|
|
||||||
|
重新确认当前终端属于生产服务器、Compose 实例与第1节一致、备份已验证可恢复、三个脚本与演练使用版本哈希相同。`prod_backup_dir` 必须仍是第2节打印的目录;重新登录终端时由维护人员明确填入并核对,禁止猜测路径。
|
||||||
|
|
||||||
|
```bash
|
||||||
|
test -d "$prod_backup_dir"
|
||||||
|
sha256sum -c "$prod_backup_dir/before.sha256"
|
||||||
|
sha256sum shierfeng-fastapi-backend/sql/patches/20261008_prod_existing_tunnel_repair_mysql.sql shierfeng-fastapi-backend/sql/patches/20261008_shipment_receipt_mysql.sql shierfeng-fastapi-backend/sql/patches/20261008_usage_fifo_mysql.sql
|
||||||
|
```
|
||||||
|
|
||||||
|
**每次只执行一份,检查退出码和日志后才进入下一份。** 下列块依赖第2节 `set -euo pipefail`,禁止 `--force`、遇错继续的图形客户端及把三份脚本拼起来盲跑。建议在专用维护终端操作,保留退出状态。
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker compose exec -T shierfeng-mysql sh -c 'MYSQL_PWD="$MYSQL_ROOT_PASSWORD" exec mysql --user=root --database="$MYSQL_DATABASE" --default-character-set=utf8mb4 --show-warnings --init-command="SET @shierfeng_prod_migration_approved=1"' < shierfeng-fastapi-backend/sql/patches/20261008_prod_existing_tunnel_repair_mysql.sql > "$prod_backup_dir/01-tunnel.log" 2>&1
|
||||||
|
```
|
||||||
|
|
||||||
|
第一份应输出12个新增隧道字段和1个 `line_id=YES`,以及4个隧道菜单。检查 `01-tunnel.log`,无错误才执行:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker compose exec -T shierfeng-mysql sh -c 'MYSQL_PWD="$MYSQL_ROOT_PASSWORD" exec mysql --user=root --database="$MYSQL_DATABASE" --default-character-set=utf8mb4 --show-warnings' < shierfeng-fastapi-backend/sql/patches/20261008_shipment_receipt_mysql.sql > "$prod_backup_dir/02-receipt.log" 2>&1
|
||||||
|
```
|
||||||
|
|
||||||
|
检查 `02-receipt.log`:历史 `CONFIRMED` 单为 `LEGACY`、`DRAFT` 为 `PENDING`,新增1119收货菜单;无错误才执行:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker compose exec -T shierfeng-mysql sh -c 'MYSQL_PWD="$MYSQL_ROOT_PASSWORD" exec mysql --user=root --database="$MYSQL_DATABASE" --default-character-set=utf8mb4 --show-warnings' < shierfeng-fastapi-backend/sql/patches/20261008_usage_fifo_mysql.sql > "$prod_backup_dir/03-fifo.log" 2>&1
|
||||||
|
```
|
||||||
|
|
||||||
|
第三份成功不一定有结果集,必须确认退出码0且日志无错误,再做完整验收。这三份脚本都不允许重复执行。
|
||||||
|
|
||||||
|
## 5. 验收与恢复服务
|
||||||
|
|
||||||
|
在启动应用前执行:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker compose exec -T shierfeng-mysql sh -c 'MYSQL_PWD="$MYSQL_ROOT_PASSWORD" exec mysql --user=root --database="$MYSQL_DATABASE" --default-character-set=utf8mb4 --batch --raw --skip-column-names' < shierfeng-fastapi-backend/sql/checks/20261008_prod_material_flow_baseline.sql > "$prod_backup_dir/original-fields.after.tsv"
|
||||||
|
cmp "$prod_backup_dir/original-fields.before.tsv" "$prod_backup_dir/original-fields.after.tsv"
|
||||||
|
|
||||||
|
docker compose exec -T shierfeng-mysql sh -c 'MYSQL_PWD="$MYSQL_ROOT_PASSWORD" exec mysql --user=root --database="$MYSQL_DATABASE" --default-character-set=utf8mb4 --table' < shierfeng-fastapi-backend/sql/checks/20261008_prod_material_flow_verify.sql > "$prod_backup_dir/verify.log"
|
||||||
|
```
|
||||||
|
|
||||||
|
全部验收条件:
|
||||||
|
|
||||||
|
- `cmp` 退出0,七张表全部原字段逐行一致,包含库存、批号、日期和历史事件。
|
||||||
|
- 验收文件25行字段(含原日期和产线)均为 `OK`,6行外键均为 `OK`;不能只看 mysql 命令退出码,因为 SELECT 会正常返回 `MISSING/MISMATCH`。
|
||||||
|
- 三个 CHECK 均存在且 `ENFORCED=YES`;库存枚举含 `IN_TRANSIT`,事件枚举含 `TUNNEL_ENTERED`、`SHIPMENT_RECEIVED`;收货唯一索引 `non_unique=0` 且列顺序为 `target_site_id,receipt_idempotency_key`。
|
||||||
|
- 恰有菜单520/1116/1117/1118/1119,父ID为121/520/520/520/510,权限分别为 `master:tunnel:list/query/add/edit` 和 `business:shipment:receive`。
|
||||||
|
- `unexpected_*` 和 `remaining_migration_routines` 均为0。历史日期保持原值;新隧道、快照、收货时间等历史字段为空。
|
||||||
|
|
||||||
|
任何一项失败都不要启动。确认运行镜像已是这次适配的新版本后,再恢复原容器(不改变卷/配置、不拉取新镜像):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker compose start shierfeng-backend-my
|
||||||
|
docker compose ps
|
||||||
|
docker compose logs --since=5m --tail=100 shierfeng-backend-my
|
||||||
|
```
|
||||||
|
|
||||||
|
确认后端健康、没有缺列/约束错误,再执行:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker compose start shierfeng-frontend
|
||||||
|
docker compose ps
|
||||||
|
```
|
||||||
|
|
||||||
|
使用超级管理员重新登录检查库存/使用/退回报表及隧道资料页面。新菜单不会自动授予普通角色,需要按既有角色管理配置菜单和现场范围,另行审批;不要直接修改角色关联表或清空 Redis。新流程用明确授权的测试数据验收,不用正式库存随意试扣。
|
||||||
|
|
||||||
|
前述 Web Crypto/HTTPS 问题与本迁移无关;此交付不修改加密开关、证书或反向代理。
|
||||||
|
|
||||||
|
## 失败与恢复原则
|
||||||
|
|
||||||
|
- 保持后端及其他写入来源停止,保留备份、日志和实际已落库结构。
|
||||||
|
- MySQL DDL 会隐式提交,`ROLLBACK` 不能撤销前面已完成的 ALTER;不能盲目重跑、跳过错误或用反向删列 SQL“回滚”。
|
||||||
|
- 存储过程报错后可能保留临时过程名称,这是失败现场的一部分;不要直接 DROP 后重试,先由 DBA 确定失败阶段。
|
||||||
|
- 由 DBA 依据实际提交状态决定经过审核的续修,或从已验证完整备份恢复,并匹配已验证的应用版本。恢复目标、方式及可能覆盖的数据必须再次确认,文档不提供自动覆盖生产库命令。
|
||||||
|
- 不删除数据卷,不重跑初始化,不把开发库覆盖到生产;备份和快照需转存到受控备份系统,遵循保留期限,不提交仓库。
|
||||||
|
|
||||||
|
## 本次生成的验证边界
|
||||||
|
|
||||||
|
本轮仅执行不连接数据库的离线 SQL 契约检查和文件自检:6项契约检查通过,10段 Shell 命令经 `bash -n` 语法检查;非空历史字段、误写角色表、误删隧道表3种内存变异均被契约检查拒绝,未把变异写入文件。当前 SQLGlot 不能完整解析存储过程及部分 MySQL ALTER 语法,因此检查采用新增列/查询的 AST 加原 ALTER token 契约,不能称为完整 MySQL 语法验证。
|
||||||
|
|
||||||
|
没有执行 MySQL 存储过程、DDL、DML、备份恢复或生产验收;静态检查不能证明这些运行操作成功。MySQL/Compose 操作仍需第3节的独立恢复演练及生产审批。
|
||||||
@@ -3,6 +3,11 @@
|
|||||||
-- 脚本包含 DROP TABLE,会删除目标库中同名表及其数据;禁止直接用于已有业务库。
|
-- 脚本包含 DROP TABLE,会删除目标库中同名表及其数据;禁止直接用于已有业务库。
|
||||||
-- 已有数据库请先完成备份和结构核对,再按 sql/patches/ 下对应的 MySQL 增量补丁执行。
|
-- 已有数据库请先完成备份和结构核对,再按 sql/patches/ 下对应的 MySQL 增量补丁执行。
|
||||||
-- Docker Compose 仅会在 MySQL 数据卷首次为空时执行本文件。
|
-- Docker Compose 仅会在 MySQL 数据卷首次为空时执行本文件。
|
||||||
|
-- 当前已内置截至 2026-10-08 的测试批次、隧道关联、物料日期、收货和 FIFO 结构及菜单。
|
||||||
|
-- 新空库执行本文件后,无需再执行对应旧增量补丁;不要在本文件末尾重复追加 ALTER。
|
||||||
|
-- 含 biz_tunnel/物料日期但缺关联字段的已有生产库,按本目录
|
||||||
|
-- production-compose-material-flow-migration-20261008.md 使用专用补丁,不运行本文件。
|
||||||
|
-- 初始化与增量升级的选择见本目录 README.md。
|
||||||
-- ============================================================================
|
-- ============================================================================
|
||||||
|
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
|
|||||||
@@ -0,0 +1,164 @@
|
|||||||
|
"""生产补齐脚本的离线 SQL 契约:只解析文件,不导入应用、不连接数据库。
|
||||||
|
|
||||||
|
检查实际交付的 ALTER/INSERT 所描述的变更,不把解析通过当作 MySQL 执行通过。
|
||||||
|
删掉关联字段、改成非空、重建已有表或插入角色授权时,以下契约应失败。
|
||||||
|
存储过程前置检查的运行行为仍须在生产备份的隔离恢复实例验收。
|
||||||
|
"""
|
||||||
|
|
||||||
|
import unittest
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
import sqlglot
|
||||||
|
from sqlglot import exp
|
||||||
|
from sqlglot.tokens import Tokenizer, TokenType
|
||||||
|
|
||||||
|
SQL_ROOT = Path(__file__).resolve().parents[2] / 'sql'
|
||||||
|
PATCH = SQL_ROOT / 'patches/20261008_prod_existing_tunnel_repair_mysql.sql'
|
||||||
|
|
||||||
|
|
||||||
|
def split_top_level(source: str, delimiter: TokenType) -> list[str]:
|
||||||
|
"""仅切分顶层语句/动作;字符串、注释及括号内的分隔符不作为边界。"""
|
||||||
|
parts, start, depth = [], 0, 0
|
||||||
|
for token in Tokenizer(dialect='mysql').tokenize(source):
|
||||||
|
if token.token_type == TokenType.L_PAREN:
|
||||||
|
depth += 1
|
||||||
|
elif token.token_type == TokenType.R_PAREN:
|
||||||
|
depth -= 1
|
||||||
|
elif token.token_type == delimiter and depth == 0:
|
||||||
|
parts.append(source[start:token.start].strip())
|
||||||
|
start = token.end + 1
|
||||||
|
if source[start:].strip():
|
||||||
|
parts.append(source[start:].strip())
|
||||||
|
return parts
|
||||||
|
|
||||||
|
|
||||||
|
def token_contract(source: str) -> list[tuple[TokenType, str]]:
|
||||||
|
return [(token.token_type, token.text) for token in Tokenizer(dialect='mysql').tokenize(source)]
|
||||||
|
|
||||||
|
|
||||||
|
class TestProdTunnelRepairSql(unittest.TestCase):
|
||||||
|
def setUp(self) -> None:
|
||||||
|
self.assertTrue(PATCH.is_file(), '缺少适配生产已存在隧道表的专用补丁')
|
||||||
|
self.source = PATCH.read_text(encoding='utf-8')
|
||||||
|
# 当前 SQLGlot 不完整支持 MODIFY ... NULL / DROP CHECK 的多动作 ALTER。
|
||||||
|
# 不把 Command 回退当作解析成功;整条用 token 契约比对,新列另做 AST 解析。
|
||||||
|
self.ddl = split_top_level(self.block('DDL'), TokenType.SEMICOLON)
|
||||||
|
self.dml = sqlglot.parse(self.block('MENU'), read='mysql')
|
||||||
|
|
||||||
|
def block(self, name: str) -> str:
|
||||||
|
begin, end = f'-- BEGIN {name}', f'-- END {name}'
|
||||||
|
self.assertEqual(self.source.count(begin), 1)
|
||||||
|
self.assertEqual(self.source.count(end), 1)
|
||||||
|
return self.source.split(begin, 1)[1].split(end, 1)[0]
|
||||||
|
|
||||||
|
def test_only_expected_tables_are_altered_without_recreating_tunnel_or_dates(self) -> None:
|
||||||
|
self.assertEqual(len(self.ddl), 5)
|
||||||
|
heads = [Tokenizer(dialect='mysql').tokenize(stmt)[:3] for stmt in self.ddl]
|
||||||
|
self.assertTrue(all([token.text.upper() for token in head[:2]] == ['ALTER', 'TABLE'] for head in heads))
|
||||||
|
self.assertEqual([head[2].text for head in heads], [
|
||||||
|
'biz_usage_record', 'biz_return_item', 'biz_pallet_inventory',
|
||||||
|
'biz_pallet_event', 'biz_pallet_event',
|
||||||
|
])
|
||||||
|
|
||||||
|
def test_twelve_new_history_fields_are_nullable_and_have_expected_types(self) -> None:
|
||||||
|
columns = {}
|
||||||
|
for stmt in self.ddl:
|
||||||
|
head = Tokenizer(dialect='mysql').tokenize(stmt)[:3]
|
||||||
|
for action in split_top_level(stmt[head[2].end + 1:], TokenType.COMMA):
|
||||||
|
tokens = Tokenizer(dialect='mysql').tokenize(action)
|
||||||
|
if [token.text.upper() for token in tokens[:2]] != ['ADD', 'COLUMN']:
|
||||||
|
continue
|
||||||
|
end = next((token.start for token in tokens if token.token_type == TokenType.VAR
|
||||||
|
and token.text.upper() == 'AFTER'), len(action))
|
||||||
|
# AFTER 的列位置不属于 CREATE TABLE 的列定义,先移除再解析类型/NULL。
|
||||||
|
definition = action[tokens[2].start:end].strip()
|
||||||
|
parsed = sqlglot.parse_one(f'CREATE TABLE contract_column ({definition})', read='mysql')
|
||||||
|
column = parsed.this.expressions[0]
|
||||||
|
self.assertIsInstance(column, exp.ColumnDef)
|
||||||
|
columns[(head[2].text, column.name)] = column.args['kind'].sql(dialect='mysql')
|
||||||
|
self.assertFalse(any(isinstance(item.kind, exp.NotNullColumnConstraint)
|
||||||
|
and not item.kind.args.get('allow_null')
|
||||||
|
for item in column.args.get('constraints', [])))
|
||||||
|
self.assertEqual(columns, {
|
||||||
|
('biz_usage_record', 'tunnel_id'): 'BIGINT',
|
||||||
|
('biz_usage_record', 'trace_no'): 'VARCHAR(64)',
|
||||||
|
('biz_usage_record', 'batch_no_snapshot'): 'VARCHAR(64)',
|
||||||
|
('biz_return_item', 'tunnel_id_snapshot'): 'BIGINT',
|
||||||
|
('biz_return_item', 'trace_no_snapshot'): 'VARCHAR(64)',
|
||||||
|
('biz_return_item', 'batch_no_snapshot'): 'VARCHAR(64)',
|
||||||
|
('biz_pallet_inventory', 'tunnel_id'): 'BIGINT',
|
||||||
|
('biz_pallet_inventory', 'trace_no'): 'VARCHAR(64)',
|
||||||
|
('biz_pallet_event', 'before_tunnel_id'): 'BIGINT',
|
||||||
|
('biz_pallet_event', 'after_tunnel_id'): 'BIGINT',
|
||||||
|
('biz_pallet_event', 'trace_no'): 'VARCHAR(64)',
|
||||||
|
('biz_pallet_event', 'batch_no_snapshot'): 'VARCHAR(64)',
|
||||||
|
})
|
||||||
|
|
||||||
|
def test_alters_keep_the_original_reviewed_tunnel_semantics(self) -> None:
|
||||||
|
original = split_top_level((SQL_ROOT / 'patches/20261005_tunnel_material_flow_mysql.sql').read_text(), TokenType.SEMICOLON)
|
||||||
|
original_alters = [stmt for stmt in original if token_contract(stmt)
|
||||||
|
and token_contract(stmt)[0][1].upper() == 'ALTER']
|
||||||
|
self.assertEqual([token_contract(stmt) for stmt in self.ddl],
|
||||||
|
[token_contract(stmt) for stmt in original_alters])
|
||||||
|
|
||||||
|
def test_menu_rows_add_only_expected_permissions_without_role_grants(self) -> None:
|
||||||
|
self.assertEqual(len(self.dml), 1)
|
||||||
|
insert = self.dml[0]
|
||||||
|
self.assertIsInstance(insert, exp.Insert)
|
||||||
|
self.assertEqual(insert.this.this.name, 'sys_menu')
|
||||||
|
columns = [column.name for column in insert.this.expressions]
|
||||||
|
self.assertIsInstance(insert.expression, exp.Values)
|
||||||
|
actual = []
|
||||||
|
for row in insert.expression.expressions:
|
||||||
|
self.assertEqual(len(row.expressions), len(columns))
|
||||||
|
values = dict(zip(columns, row.expressions, strict=True))
|
||||||
|
actual.append((int(values['menu_id'].this), int(values['parent_id'].this),
|
||||||
|
values['perms'].this, values['menu_type'].this))
|
||||||
|
self.assertEqual(actual, [
|
||||||
|
(520, 121, 'master:tunnel:list', 'C'),
|
||||||
|
(1116, 520, 'master:tunnel:query', 'F'),
|
||||||
|
(1117, 520, 'master:tunnel:add', 'F'),
|
||||||
|
(1118, 520, 'master:tunnel:edit', 'F'),
|
||||||
|
])
|
||||||
|
|
||||||
|
def test_baseline_reads_seven_tables_without_new_columns_or_writes(self) -> None:
|
||||||
|
source = (SQL_ROOT / 'checks/20261008_prod_material_flow_baseline.sql').read_text()
|
||||||
|
statements = sqlglot.parse(source, read='mysql')
|
||||||
|
expected = {
|
||||||
|
'biz_tunnel': ('tunnel_id', 13),
|
||||||
|
'biz_pallet_inventory': ('pallet_id', 11),
|
||||||
|
'biz_usage_record': ('usage_id', 13),
|
||||||
|
'biz_return_item': ('return_item_id', 8),
|
||||||
|
'biz_pallet_event': ('event_id', 21),
|
||||||
|
'biz_filling_record': ('filling_id', 24),
|
||||||
|
'biz_shipment_order': ('shipment_id', 15),
|
||||||
|
}
|
||||||
|
self.assertEqual(len(statements), len(expected))
|
||||||
|
for stmt in statements:
|
||||||
|
self.assertIsInstance(stmt, exp.Select)
|
||||||
|
table = next(stmt.find_all(exp.Table)).name
|
||||||
|
primary_key, original_column_count = expected.pop(table)
|
||||||
|
self.assertEqual(stmt.args['order'].expressions[0].this.name, primary_key)
|
||||||
|
self.assertEqual(len(list(stmt.expressions[1].find_all(exp.Column))), original_column_count)
|
||||||
|
self.assertIsNone(stmt.args.get('where'), '原数据基线不能过滤正式/测试数据或历史记录')
|
||||||
|
self.assertFalse(expected)
|
||||||
|
|
||||||
|
def test_postcheck_is_select_only_and_reports_expected_number_of_fields(self) -> None:
|
||||||
|
source = (SQL_ROOT / 'checks/20261008_prod_material_flow_verify.sql').read_text()
|
||||||
|
statements = sqlglot.parse(source, read='mysql')
|
||||||
|
self.assertTrue(all(isinstance(stmt, exp.Select) for stmt in statements))
|
||||||
|
expected = statements[1].args['with_'].expressions[0]
|
||||||
|
rows = list(expected.find_all(exp.Select))
|
||||||
|
self.assertEqual(len(rows), 25)
|
||||||
|
actual = {(row.expressions[0].this.this if isinstance(row.expressions[0], exp.Alias)
|
||||||
|
else row.expressions[0].this,
|
||||||
|
row.expressions[1].this.this if isinstance(row.expressions[1], exp.Alias)
|
||||||
|
else row.expressions[1].this) for row in rows}
|
||||||
|
self.assertEqual(len(actual), 25, '验收字段不得重复以掩盖漏项')
|
||||||
|
self.assertTrue({('biz_pallet_inventory', 'tunnel_id'), ('biz_pallet_inventory', 'site_arrived_at'),
|
||||||
|
('biz_usage_record', 'line_id'), ('biz_shipment_order', 'receipt_state'),
|
||||||
|
('biz_usage_record', 'fifo_skip_reason'), ('biz_pallet_event', 'fifo_recommendation')} <= actual)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
unittest.main()
|
||||||
Reference in New Issue
Block a user