调整部分前端布局和后端增删改逻辑
This commit is contained in:
@@ -117,6 +117,7 @@ class Log:
|
||||
log_type: Literal['login', 'operation'] | None = 'operation',
|
||||
request_log_mode: Literal['full', 'none', 'summary', 'include', 'exclude'] = 'full',
|
||||
response_log_mode: Literal['full', 'none', 'summary', 'include', 'exclude'] = 'full',
|
||||
oper_url_mode: Literal['full', 'route'] = 'full',
|
||||
request_include_fields: tuple[str, ...] | None = None,
|
||||
response_include_fields: tuple[str, ...] | None = None,
|
||||
request_exclude_fields: tuple[str, ...] | None = None,
|
||||
@@ -130,6 +131,7 @@ class Log:
|
||||
:param log_type: 日志类型;`login`表示登录日志,仅落登录信息,`operation`表示操作日志,会落请求/响应摘要与操作人信息
|
||||
:param request_log_mode: 请求日志记录模式;`full`记录脱敏后的完整请求,`none`不记录请求体,`summary`记录请求摘要,`include`仅记录request_include_fields指定的字段,`exclude`记录完整请求后排除request_exclude_fields指定的字段
|
||||
:param response_log_mode: 响应日志记录模式;`full`记录脱敏后的完整响应,`none`不记录响应体,`summary`记录响应摘要,`include`仅记录response_include_fields指定的字段,`exclude`记录完整响应后排除response_exclude_fields指定的字段
|
||||
:param oper_url_mode: 操作URL记录模式;`full`记录实际请求路径,`route`记录路由模板,适合路径中包含敏感标识的接口
|
||||
:param request_include_fields: 请求日志白名单字段路径,仅在request_log_mode='include'时生效;推荐从path_params/query_params/json_body/form_data/files/raw_body开始,字段名支持 snake_case 与 camelCase 自动兼容
|
||||
:param response_include_fields: 响应日志白名单字段路径,仅在response_log_mode='include'时生效;推荐从code/msg/data/rows/success/time开始,字段名支持 snake_case 与 camelCase 自动兼容
|
||||
:param request_exclude_fields: 请求日志排除字段路径,仅在request_log_mode='exclude'时生效;推荐从path_params/query_params/json_body/form_data/files/raw_body开始,字段名支持 snake_case 与 camelCase 自动兼容
|
||||
@@ -141,6 +143,7 @@ class Log:
|
||||
self.log_type = log_type
|
||||
self.request_log_mode = request_log_mode
|
||||
self.response_log_mode = response_log_mode
|
||||
self.oper_url_mode = oper_url_mode
|
||||
self.request_include_fields = request_include_fields or ()
|
||||
self.response_include_fields = response_include_fields or ()
|
||||
self.request_exclude_fields = request_exclude_fields or ()
|
||||
@@ -166,7 +169,7 @@ class Log:
|
||||
# 获取操作类型
|
||||
operator_type = self._get_oper_type(user_agent)
|
||||
# 获取请求的url
|
||||
oper_url = request.url.path
|
||||
oper_url = self._get_oper_url(request)
|
||||
# 获取请求ip
|
||||
oper_ip = ClientIPUtil.get_client_ip(request)
|
||||
# 获取请求ip归属区域
|
||||
@@ -281,6 +284,21 @@ class Log:
|
||||
|
||||
return func_path
|
||||
|
||||
def _get_oper_url(self, request: Request) -> str:
|
||||
"""
|
||||
获取操作日志中的请求URL。
|
||||
|
||||
路由模板模式只保留路由结构,不把路径参数(例如二维码固定标识)写入日志。
|
||||
|
||||
:param request: 当前请求
|
||||
:return: 用于操作日志的URL
|
||||
"""
|
||||
if self.oper_url_mode == 'route':
|
||||
route_path = getattr(request.scope.get('route'), 'path', None)
|
||||
if route_path:
|
||||
return route_path
|
||||
return request.url.path
|
||||
|
||||
@staticmethod
|
||||
def _limit_log_text(log_text: str, max_length: int, overflow_text: str) -> str:
|
||||
"""
|
||||
|
||||
@@ -13,3 +13,20 @@
|
||||
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
@@ -0,0 +1,56 @@
|
||||
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
@@ -0,0 +1,59 @@
|
||||
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 锁
|
||||
File diff suppressed because it is too large
Load Diff
@@ -60,6 +60,22 @@ class OperationLogDao:
|
||||
|
||||
return operation_log_list
|
||||
|
||||
@classmethod
|
||||
async def get_scan_exception_log_list(
|
||||
cls, db: AsyncSession, oper_name: str | None, page_size: int
|
||||
) -> PageModel:
|
||||
"""按扫码日志标题和精确操作人查询首页异常记录。"""
|
||||
query = (
|
||||
select(SysOperLog)
|
||||
.where(
|
||||
SysOperLog.title == '扫码操作',
|
||||
SysOperLog.status == 1,
|
||||
SysOperLog.oper_name == oper_name if oper_name is not None else True,
|
||||
)
|
||||
.order_by(desc(SysOperLog.oper_time))
|
||||
)
|
||||
return await PageUtil.paginate(db, query, page_num=1, page_size=page_size, is_page=True)
|
||||
|
||||
@classmethod
|
||||
async def add_operation_log_dao(cls, db: AsyncSession, operation_log: OperLogModel) -> SysOperLog:
|
||||
"""
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
"""首页运营驾驶舱接口。"""
|
||||
|
||||
from typing import Annotated
|
||||
|
||||
from fastapi import Request, Response
|
||||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
|
||||
from common.aspect.db_seesion import DBSessionDependency
|
||||
from common.aspect.pre_auth import CurrentUserDependency, PreAuthDependency
|
||||
from common.router import APIRouterPro
|
||||
from common.vo import PageResponseModel
|
||||
from module_admin.entity.vo.user_vo import CurrentUserModel
|
||||
from module_business.entity.vo.dashboard_vo import ScanExceptionModel
|
||||
from module_business.service.dashboard_service import DashboardService
|
||||
from utils.response_util import ResponseUtil
|
||||
|
||||
|
||||
dashboard_controller = APIRouterPro(
|
||||
prefix='/business/dashboard',
|
||||
tags=['业务管理-运营驾驶舱'],
|
||||
dependencies=[PreAuthDependency()],
|
||||
)
|
||||
|
||||
|
||||
@dashboard_controller.get(
|
||||
'/scan-exceptions',
|
||||
summary='获取首页扫码异常分页列表接口',
|
||||
description='普通用户仅查看本人扫码异常,超级管理员查看全部扫码异常',
|
||||
response_model=PageResponseModel[ScanExceptionModel],
|
||||
)
|
||||
async def get_business_dashboard_scan_exceptions(
|
||||
request: Request,
|
||||
query_db: Annotated[AsyncSession, DBSessionDependency()],
|
||||
current_user: Annotated[CurrentUserModel, CurrentUserDependency()],
|
||||
) -> Response:
|
||||
result = await DashboardService.get_scan_exception_list_services(query_db, current_user)
|
||||
return ResponseUtil.success(model_content=result)
|
||||
@@ -78,6 +78,13 @@ async def get_business_filling_strain_options(
|
||||
response_model=DataResponseModel[PalletScanResponseModel],
|
||||
dependencies=[UserInterfaceAuthDependency('business:filling:query')],
|
||||
)
|
||||
@Log(
|
||||
title='扫码操作',
|
||||
business_type=BusinessType.OTHER,
|
||||
request_log_mode='none',
|
||||
response_log_mode='summary',
|
||||
oper_url_mode='route',
|
||||
)
|
||||
async def scan_business_filling_pallet(
|
||||
request: Request,
|
||||
qr_token: Annotated[
|
||||
|
||||
@@ -81,6 +81,13 @@ async def get_business_inbound_warehouse_options(
|
||||
response_model=DataResponseModel[PalletScanResponseModel],
|
||||
dependencies=[UserInterfaceAuthDependency('business:inbound:query')],
|
||||
)
|
||||
@Log(
|
||||
title='扫码操作',
|
||||
business_type=BusinessType.OTHER,
|
||||
request_log_mode='none',
|
||||
response_log_mode='summary',
|
||||
oper_url_mode='route',
|
||||
)
|
||||
async def scan_business_inbound_pallet(
|
||||
request: Request,
|
||||
qr_token: Annotated[
|
||||
|
||||
@@ -82,6 +82,13 @@ async def get_business_return_warehouse_options(
|
||||
response_model=DataResponseModel[PalletScanResponseModel],
|
||||
dependencies=[UserInterfaceAuthDependency('business:return:query')],
|
||||
)
|
||||
@Log(
|
||||
title='扫码操作',
|
||||
business_type=BusinessType.OTHER,
|
||||
request_log_mode='none',
|
||||
response_log_mode='summary',
|
||||
oper_url_mode='route',
|
||||
)
|
||||
async def scan_business_return_pallet(
|
||||
request: Request,
|
||||
qr_token: Annotated[
|
||||
|
||||
@@ -98,6 +98,13 @@ async def get_business_shipment_site_options(
|
||||
response_model=DataResponseModel[PalletScanResponseModel],
|
||||
dependencies=[UserInterfaceAuthDependency('business:shipment:query')],
|
||||
)
|
||||
@Log(
|
||||
title='扫码操作',
|
||||
business_type=BusinessType.OTHER,
|
||||
request_log_mode='none',
|
||||
response_log_mode='summary',
|
||||
oper_url_mode='route',
|
||||
)
|
||||
async def scan_business_shipment_pallet(
|
||||
request: Request,
|
||||
qr_token: Annotated[
|
||||
|
||||
@@ -82,6 +82,13 @@ async def get_business_usage_line_options(
|
||||
response_model=DataResponseModel[PalletScanResponseModel],
|
||||
dependencies=[UserInterfaceAuthDependency('business:usage:query')],
|
||||
)
|
||||
@Log(
|
||||
title='扫码操作',
|
||||
business_type=BusinessType.OTHER,
|
||||
request_log_mode='none',
|
||||
response_log_mode='summary',
|
||||
oper_url_mode='route',
|
||||
)
|
||||
async def scan_business_usage_pallet(
|
||||
request: Request,
|
||||
qr_token: Annotated[
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
from datetime import datetime
|
||||
|
||||
from pydantic import BaseModel, ConfigDict, Field
|
||||
from pydantic.alias_generators import to_camel
|
||||
|
||||
|
||||
class ScanExceptionModel(BaseModel):
|
||||
"""首页扫码异常记录。"""
|
||||
|
||||
model_config = ConfigDict(alias_generator=to_camel, from_attributes=True, populate_by_name=True)
|
||||
|
||||
oper_id: int = Field(gt=0, description='异常日志ID')
|
||||
source: str = Field(min_length=1, max_length=50, description='扫码来源')
|
||||
error_message: str = Field(min_length=1, max_length=2000, description='异常消息')
|
||||
operator_name: str = Field(min_length=1, max_length=50, description='操作人员')
|
||||
occurred_at: datetime | None = Field(default=None, description='异常时间')
|
||||
@@ -0,0 +1,73 @@
|
||||
from typing import Any
|
||||
|
||||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
|
||||
from common.vo import PageModel
|
||||
from exceptions.exception import ServiceException
|
||||
from module_admin.dao.log_dao import OperationLogDao
|
||||
from module_admin.entity.vo.user_vo import CurrentUserModel
|
||||
from module_business.entity.vo.dashboard_vo import ScanExceptionModel
|
||||
|
||||
|
||||
class DashboardService:
|
||||
"""首页运营驾驶舱数据服务。"""
|
||||
|
||||
_SCAN_EXCEPTION_LIMIT = 5
|
||||
_SCAN_SOURCE_LABELS = {
|
||||
'/business/inbound/scan/{qr_token}': '首次入库扫码',
|
||||
'/business/filling/scan/{qr_token}': '托盘装填扫码',
|
||||
'/business/shipment/scan/{qr_token}': '整托发货扫码',
|
||||
'/business/usage/scan/{qr_token}': '托盘使用扫码',
|
||||
'/business/return/scan/{qr_token}': '托盘退回扫码',
|
||||
}
|
||||
|
||||
@staticmethod
|
||||
def _row_value(row: Any, *keys: str) -> Any:
|
||||
if isinstance(row, dict):
|
||||
for key in keys:
|
||||
if key in row:
|
||||
return row[key]
|
||||
return None
|
||||
for key in keys:
|
||||
value = getattr(row, key, None)
|
||||
if value is not None:
|
||||
return value
|
||||
return None
|
||||
|
||||
@classmethod
|
||||
def _scan_source(cls, oper_url: str | None) -> str:
|
||||
if not oper_url:
|
||||
return '扫码接口'
|
||||
for route_path, label in cls._SCAN_SOURCE_LABELS.items():
|
||||
route_prefix = route_path.split('/{', 1)[0]
|
||||
if oper_url == route_path or oper_url.startswith(f'{route_prefix}/'):
|
||||
return label
|
||||
return '扫码接口'
|
||||
|
||||
@classmethod
|
||||
async def get_scan_exception_list_services(
|
||||
cls, query_db: AsyncSession, current_user: CurrentUserModel
|
||||
) -> PageModel[ScanExceptionModel]:
|
||||
"""按用户范围获取首页最近扫码异常。"""
|
||||
if current_user.user is None or not current_user.user.user_name:
|
||||
raise ServiceException(message='当前用户信息无效')
|
||||
|
||||
oper_name = None if current_user.user.admin else current_user.user.user_name
|
||||
page = await OperationLogDao.get_scan_exception_log_list(query_db, oper_name, cls._SCAN_EXCEPTION_LIMIT)
|
||||
rows = [
|
||||
ScanExceptionModel(
|
||||
oper_id=cls._row_value(row, 'operId', 'oper_id'),
|
||||
source=cls._scan_source(cls._row_value(row, 'operUrl', 'oper_url')),
|
||||
error_message=cls._row_value(row, 'errorMsg', 'error_msg') or '扫码请求失败',
|
||||
operator_name=cls._row_value(row, 'operName', 'oper_name') or '未知用户',
|
||||
occurred_at=cls._row_value(row, 'operTime', 'oper_time'),
|
||||
)
|
||||
for row in page.rows
|
||||
]
|
||||
return PageModel[ScanExceptionModel](
|
||||
rows=rows,
|
||||
pageNum=page.page_num,
|
||||
pageSize=page.page_size,
|
||||
total=page.total,
|
||||
hasNext=page.has_next,
|
||||
)
|
||||
@@ -1,3 +1,10 @@
|
||||
-- ============================================================================
|
||||
-- 重要说明:本文件是新建空 MySQL 数据库的全量初始化脚本。
|
||||
-- 脚本包含 DROP TABLE,会删除目标库中同名表及其数据;禁止直接用于已有业务库。
|
||||
-- 已有数据库请先完成备份和结构核对,再按 sql/patches/ 下对应的 MySQL 增量补丁执行。
|
||||
-- Docker Compose 仅会在 MySQL 数据卷首次为空时执行本文件。
|
||||
-- ============================================================================
|
||||
|
||||
-- ----------------------------
|
||||
-- 托盘业务表(须先于被引用的系统表按反向依赖删除)
|
||||
-- ----------------------------
|
||||
|
||||
Reference in New Issue
Block a user