koa-boot-runtime 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/aiToolRegistry.d.ts +32 -0
- package/dist/aiToolRegistry.d.ts.map +1 -0
- package/dist/aiToolRegistry.js +41 -0
- package/dist/aiToolRegistry.js.map +1 -0
- package/dist/build/routes.d.ts +3 -0
- package/dist/build/routes.d.ts.map +1 -0
- package/dist/build/routes.js +4055 -0
- package/dist/build/routes.js.map +1 -0
- package/dist/build/swagger.json +6752 -0
- package/dist/common/decorators/index.d.ts +2 -0
- package/dist/common/decorators/index.d.ts.map +1 -0
- package/dist/common/decorators/index.js +18 -0
- package/dist/common/decorators/index.js.map +1 -0
- package/dist/common/decorators/validation.d.ts +33 -0
- package/dist/common/decorators/validation.d.ts.map +1 -0
- package/dist/common/decorators/validation.js +215 -0
- package/dist/common/decorators/validation.js.map +1 -0
- package/dist/common/dto.d.ts +17 -0
- package/dist/common/dto.d.ts.map +1 -0
- package/dist/common/dto.js +28 -0
- package/dist/common/dto.js.map +1 -0
- package/dist/common/enums/base.d.ts +14 -0
- package/dist/common/enums/base.d.ts.map +1 -0
- package/dist/common/enums/base.js +14 -0
- package/dist/common/enums/base.js.map +1 -0
- package/dist/common/enums/index.d.ts +8 -0
- package/dist/common/enums/index.d.ts.map +1 -0
- package/dist/common/enums/index.js +24 -0
- package/dist/common/enums/index.js.map +1 -0
- package/dist/common/enums/system.d.ts +14 -0
- package/dist/common/enums/system.d.ts.map +1 -0
- package/dist/common/enums/system.js +14 -0
- package/dist/common/enums/system.js.map +1 -0
- package/dist/common/index.d.ts +6 -0
- package/dist/common/index.d.ts.map +1 -0
- package/dist/common/index.js +25 -0
- package/dist/common/index.js.map +1 -0
- package/dist/common/paginate.d.ts +49 -0
- package/dist/common/paginate.d.ts.map +1 -0
- package/dist/common/paginate.js +47 -0
- package/dist/common/paginate.js.map +1 -0
- package/dist/common/types/index.d.ts +8 -0
- package/dist/common/types/index.d.ts.map +1 -0
- package/dist/common/types/index.js +18 -0
- package/dist/common/types/index.js.map +1 -0
- package/dist/common/types/pagination.d.ts +76 -0
- package/dist/common/types/pagination.d.ts.map +1 -0
- package/dist/common/types/pagination.js +29 -0
- package/dist/common/types/pagination.js.map +1 -0
- package/dist/common/types/request.d.ts +66 -0
- package/dist/common/types/request.d.ts.map +1 -0
- package/dist/common/types/request.js +4 -0
- package/dist/common/types/request.js.map +1 -0
- package/dist/common/types/response.d.ts +109 -0
- package/dist/common/types/response.d.ts.map +1 -0
- package/dist/common/types/response.js +50 -0
- package/dist/common/types/response.js.map +1 -0
- package/dist/common/types/sort.d.ts +71 -0
- package/dist/common/types/sort.d.ts.map +1 -0
- package/dist/common/types/sort.js +46 -0
- package/dist/common/types/sort.js.map +1 -0
- package/dist/config/database.d.ts +12 -0
- package/dist/config/database.d.ts.map +1 -0
- package/dist/config/database.js +24 -0
- package/dist/config/database.js.map +1 -0
- package/dist/config/index.d.ts +144 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +180 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/ioc.d.ts +6 -0
- package/dist/config/ioc.d.ts.map +1 -0
- package/dist/config/ioc.js +29 -0
- package/dist/config/ioc.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +49 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware/auth.d.ts +3 -0
- package/dist/middleware/auth.d.ts.map +1 -0
- package/dist/middleware/auth.js +52 -0
- package/dist/middleware/auth.js.map +1 -0
- package/dist/middleware/errorHandler.d.ts +3 -0
- package/dist/middleware/errorHandler.d.ts.map +1 -0
- package/dist/middleware/errorHandler.js +40 -0
- package/dist/middleware/errorHandler.js.map +1 -0
- package/dist/middleware/logger.d.ts +3 -0
- package/dist/middleware/logger.d.ts.map +1 -0
- package/dist/middleware/logger.js +13 -0
- package/dist/middleware/logger.js.map +1 -0
- package/dist/middleware/operationLogger.d.ts +11 -0
- package/dist/middleware/operationLogger.d.ts.map +1 -0
- package/dist/middleware/operationLogger.js +155 -0
- package/dist/middleware/operationLogger.js.map +1 -0
- package/dist/middleware/permission.d.ts +23 -0
- package/dist/middleware/permission.d.ts.map +1 -0
- package/dist/middleware/permission.js +153 -0
- package/dist/middleware/permission.js.map +1 -0
- package/dist/middleware/validate.d.ts +7 -0
- package/dist/middleware/validate.d.ts.map +1 -0
- package/dist/middleware/validate.js +53 -0
- package/dist/middleware/validate.js.map +1 -0
- package/dist/middlewares.d.ts +15 -0
- package/dist/middlewares.d.ts.map +1 -0
- package/dist/middlewares.js +24 -0
- package/dist/middlewares.js.map +1 -0
- package/dist/registerRoutes.d.ts +15 -0
- package/dist/registerRoutes.d.ts.map +1 -0
- package/dist/registerRoutes.js +83 -0
- package/dist/registerRoutes.js.map +1 -0
- package/dist/system/department/department.controller.d.ts +46 -0
- package/dist/system/department/department.controller.d.ts.map +1 -0
- package/dist/system/department/department.controller.js +203 -0
- package/dist/system/department/department.controller.js.map +1 -0
- package/dist/system/department/department.model.d.ts +33 -0
- package/dist/system/department/department.model.d.ts.map +1 -0
- package/dist/system/department/department.model.js +171 -0
- package/dist/system/department/department.model.js.map +1 -0
- package/dist/system/department/department.service.d.ts +40 -0
- package/dist/system/department/department.service.d.ts.map +1 -0
- package/dist/system/department/department.service.js +99 -0
- package/dist/system/department/department.service.js.map +1 -0
- package/dist/system/dictItem/dictItem.controller.d.ts +42 -0
- package/dist/system/dictItem/dictItem.controller.d.ts.map +1 -0
- package/dist/system/dictItem/dictItem.controller.js +167 -0
- package/dist/system/dictItem/dictItem.controller.js.map +1 -0
- package/dist/system/dictItem/dictItem.model.d.ts +38 -0
- package/dist/system/dictItem/dictItem.model.d.ts.map +1 -0
- package/dist/system/dictItem/dictItem.model.js +180 -0
- package/dist/system/dictItem/dictItem.model.js.map +1 -0
- package/dist/system/dictItem/dictItem.service.d.ts +33 -0
- package/dist/system/dictItem/dictItem.service.d.ts.map +1 -0
- package/dist/system/dictItem/dictItem.service.js +97 -0
- package/dist/system/dictItem/dictItem.service.js.map +1 -0
- package/dist/system/dictType/dictType.controller.d.ts +47 -0
- package/dist/system/dictType/dictType.controller.d.ts.map +1 -0
- package/dist/system/dictType/dictType.controller.js +174 -0
- package/dist/system/dictType/dictType.controller.js.map +1 -0
- package/dist/system/dictType/dictType.model.d.ts +31 -0
- package/dist/system/dictType/dictType.model.d.ts.map +1 -0
- package/dist/system/dictType/dictType.model.js +127 -0
- package/dist/system/dictType/dictType.model.js.map +1 -0
- package/dist/system/dictType/dictType.service.d.ts +27 -0
- package/dist/system/dictType/dictType.service.d.ts.map +1 -0
- package/dist/system/dictType/dictType.service.js +74 -0
- package/dist/system/dictType/dictType.service.js.map +1 -0
- package/dist/system/employee/employee.controller.d.ts +16 -0
- package/dist/system/employee/employee.controller.d.ts.map +1 -0
- package/dist/system/employee/employee.controller.js +111 -0
- package/dist/system/employee/employee.controller.js.map +1 -0
- package/dist/system/employee/employee.model.d.ts +34 -0
- package/dist/system/employee/employee.model.d.ts.map +1 -0
- package/dist/system/employee/employee.model.js +186 -0
- package/dist/system/employee/employee.model.js.map +1 -0
- package/dist/system/employee/employee.service.d.ts +16 -0
- package/dist/system/employee/employee.service.d.ts.map +1 -0
- package/dist/system/employee/employee.service.js +49 -0
- package/dist/system/employee/employee.service.js.map +1 -0
- package/dist/system/fileUpload/fileUpload.controller.d.ts +35 -0
- package/dist/system/fileUpload/fileUpload.controller.d.ts.map +1 -0
- package/dist/system/fileUpload/fileUpload.controller.js +228 -0
- package/dist/system/fileUpload/fileUpload.controller.js.map +1 -0
- package/dist/system/fileUpload/fileUpload.model.d.ts +13 -0
- package/dist/system/fileUpload/fileUpload.model.d.ts.map +1 -0
- package/dist/system/fileUpload/fileUpload.model.js +71 -0
- package/dist/system/fileUpload/fileUpload.model.js.map +1 -0
- package/dist/system/fileUpload/fileUpload.service.d.ts +29 -0
- package/dist/system/fileUpload/fileUpload.service.d.ts.map +1 -0
- package/dist/system/fileUpload/fileUpload.service.js +61 -0
- package/dist/system/fileUpload/fileUpload.service.js.map +1 -0
- package/dist/system/loginLog/loginLog.controller.d.ts +21 -0
- package/dist/system/loginLog/loginLog.controller.d.ts.map +1 -0
- package/dist/system/loginLog/loginLog.controller.js +149 -0
- package/dist/system/loginLog/loginLog.controller.js.map +1 -0
- package/dist/system/loginLog/loginLog.model.d.ts +26 -0
- package/dist/system/loginLog/loginLog.model.d.ts.map +1 -0
- package/dist/system/loginLog/loginLog.model.js +150 -0
- package/dist/system/loginLog/loginLog.model.js.map +1 -0
- package/dist/system/loginLog/loginLog.service.d.ts +24 -0
- package/dist/system/loginLog/loginLog.service.d.ts.map +1 -0
- package/dist/system/loginLog/loginLog.service.js +87 -0
- package/dist/system/loginLog/loginLog.service.js.map +1 -0
- package/dist/system/menu/menu.controller.d.ts +46 -0
- package/dist/system/menu/menu.controller.d.ts.map +1 -0
- package/dist/system/menu/menu.controller.js +203 -0
- package/dist/system/menu/menu.controller.js.map +1 -0
- package/dist/system/menu/menu.model.d.ts +45 -0
- package/dist/system/menu/menu.model.d.ts.map +1 -0
- package/dist/system/menu/menu.model.js +254 -0
- package/dist/system/menu/menu.model.js.map +1 -0
- package/dist/system/menu/menu.service.d.ts +40 -0
- package/dist/system/menu/menu.service.d.ts.map +1 -0
- package/dist/system/menu/menu.service.js +101 -0
- package/dist/system/menu/menu.service.js.map +1 -0
- package/dist/system/operationLog/operationLog.controller.d.ts +34 -0
- package/dist/system/operationLog/operationLog.controller.d.ts.map +1 -0
- package/dist/system/operationLog/operationLog.controller.js +126 -0
- package/dist/system/operationLog/operationLog.controller.js.map +1 -0
- package/dist/system/operationLog/operationLog.model.d.ts +38 -0
- package/dist/system/operationLog/operationLog.model.d.ts.map +1 -0
- package/dist/system/operationLog/operationLog.model.js +224 -0
- package/dist/system/operationLog/operationLog.model.js.map +1 -0
- package/dist/system/operationLog/operationLog.service.d.ts +46 -0
- package/dist/system/operationLog/operationLog.service.d.ts.map +1 -0
- package/dist/system/operationLog/operationLog.service.js +109 -0
- package/dist/system/operationLog/operationLog.service.js.map +1 -0
- package/dist/system/permission/permission.controller.d.ts +18 -0
- package/dist/system/permission/permission.controller.d.ts.map +1 -0
- package/dist/system/permission/permission.controller.js +160 -0
- package/dist/system/permission/permission.controller.js.map +1 -0
- package/dist/system/permission/permission.model.d.ts +39 -0
- package/dist/system/permission/permission.model.d.ts.map +1 -0
- package/dist/system/permission/permission.model.js +220 -0
- package/dist/system/permission/permission.model.js.map +1 -0
- package/dist/system/permission/permission.service.d.ts +40 -0
- package/dist/system/permission/permission.service.d.ts.map +1 -0
- package/dist/system/permission/permission.service.js +105 -0
- package/dist/system/permission/permission.service.js.map +1 -0
- package/dist/system/role/role.controller.d.ts +16 -0
- package/dist/system/role/role.controller.d.ts.map +1 -0
- package/dist/system/role/role.controller.js +123 -0
- package/dist/system/role/role.controller.js.map +1 -0
- package/dist/system/role/role.model.d.ts +25 -0
- package/dist/system/role/role.model.d.ts.map +1 -0
- package/dist/system/role/role.model.js +133 -0
- package/dist/system/role/role.model.js.map +1 -0
- package/dist/system/role/role.service.d.ts +17 -0
- package/dist/system/role/role.service.d.ts.map +1 -0
- package/dist/system/role/role.service.js +50 -0
- package/dist/system/role/role.service.js.map +1 -0
- package/dist/system/roleMenu/roleMenu.controller.d.ts +26 -0
- package/dist/system/roleMenu/roleMenu.controller.d.ts.map +1 -0
- package/dist/system/roleMenu/roleMenu.controller.js +83 -0
- package/dist/system/roleMenu/roleMenu.controller.js.map +1 -0
- package/dist/system/roleMenu/roleMenu.model.d.ts +35 -0
- package/dist/system/roleMenu/roleMenu.model.d.ts.map +1 -0
- package/dist/system/roleMenu/roleMenu.model.js +56 -0
- package/dist/system/roleMenu/roleMenu.model.js.map +1 -0
- package/dist/system/roleMenu/roleMenu.service.d.ts +35 -0
- package/dist/system/roleMenu/roleMenu.service.d.ts.map +1 -0
- package/dist/system/roleMenu/roleMenu.service.js +77 -0
- package/dist/system/roleMenu/roleMenu.service.js.map +1 -0
- package/dist/system/rolePermission/rolePermission.controller.d.ts +36 -0
- package/dist/system/rolePermission/rolePermission.controller.d.ts.map +1 -0
- package/dist/system/rolePermission/rolePermission.controller.js +115 -0
- package/dist/system/rolePermission/rolePermission.controller.js.map +1 -0
- package/dist/system/rolePermission/rolePermission.model.d.ts +45 -0
- package/dist/system/rolePermission/rolePermission.model.d.ts.map +1 -0
- package/dist/system/rolePermission/rolePermission.model.js +87 -0
- package/dist/system/rolePermission/rolePermission.model.js.map +1 -0
- package/dist/system/rolePermission/rolePermission.service.d.ts +50 -0
- package/dist/system/rolePermission/rolePermission.service.d.ts.map +1 -0
- package/dist/system/rolePermission/rolePermission.service.js +110 -0
- package/dist/system/rolePermission/rolePermission.service.js.map +1 -0
- package/dist/system/user/user.controller.d.ts +66 -0
- package/dist/system/user/user.controller.d.ts.map +1 -0
- package/dist/system/user/user.controller.js +322 -0
- package/dist/system/user/user.controller.js.map +1 -0
- package/dist/system/user/user.model.d.ts +58 -0
- package/dist/system/user/user.model.d.ts.map +1 -0
- package/dist/system/user/user.model.js +225 -0
- package/dist/system/user/user.model.js.map +1 -0
- package/dist/system/user/user.service.d.ts +73 -0
- package/dist/system/user/user.service.d.ts.map +1 -0
- package/dist/system/user/user.service.js +388 -0
- package/dist/system/user/user.service.js.map +1 -0
- package/dist/system/userRole/userRole.controller.d.ts +33 -0
- package/dist/system/userRole/userRole.controller.d.ts.map +1 -0
- package/dist/system/userRole/userRole.controller.js +231 -0
- package/dist/system/userRole/userRole.controller.js.map +1 -0
- package/dist/system/userRole/userRole.model.d.ts +14 -0
- package/dist/system/userRole/userRole.model.d.ts.map +1 -0
- package/dist/system/userRole/userRole.model.js +58 -0
- package/dist/system/userRole/userRole.model.js.map +1 -0
- package/dist/system/userRole/userRole.service.d.ts +29 -0
- package/dist/system/userRole/userRole.service.d.ts.map +1 -0
- package/dist/system/userRole/userRole.service.js +135 -0
- package/dist/system/userRole/userRole.service.js.map +1 -0
- package/dist/systemServices.d.ts +23 -0
- package/dist/systemServices.d.ts.map +1 -0
- package/dist/systemServices.js +40 -0
- package/dist/systemServices.js.map +1 -0
- package/dist/types.d.ts +29 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +70 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/aiClient.d.ts +55 -0
- package/dist/utils/aiClient.d.ts.map +1 -0
- package/dist/utils/aiClient.js +59 -0
- package/dist/utils/aiClient.js.map +1 -0
- package/dist/utils/banner.d.ts +10 -0
- package/dist/utils/banner.d.ts.map +1 -0
- package/dist/utils/banner.js +40 -0
- package/dist/utils/banner.js.map +1 -0
- package/dist/utils/crypto.d.ts +49 -0
- package/dist/utils/crypto.d.ts.map +1 -0
- package/dist/utils/crypto.js +113 -0
- package/dist/utils/crypto.js.map +1 -0
- package/dist/utils/dataScope.d.ts +41 -0
- package/dist/utils/dataScope.d.ts.map +1 -0
- package/dist/utils/dataScope.js +130 -0
- package/dist/utils/dataScope.js.map +1 -0
- package/dist/utils/date.d.ts +48 -0
- package/dist/utils/date.d.ts.map +1 -0
- package/dist/utils/date.js +145 -0
- package/dist/utils/date.js.map +1 -0
- package/dist/utils/emailClient.d.ts +15 -0
- package/dist/utils/emailClient.d.ts.map +1 -0
- package/dist/utils/emailClient.js +71 -0
- package/dist/utils/emailClient.js.map +1 -0
- package/dist/utils/jwt.d.ts +10 -0
- package/dist/utils/jwt.d.ts.map +1 -0
- package/dist/utils/jwt.js +31 -0
- package/dist/utils/jwt.js.map +1 -0
- package/dist/utils/logger.d.ts +34 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +108 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/ossClient.d.ts +38 -0
- package/dist/utils/ossClient.d.ts.map +1 -0
- package/dist/utils/ossClient.js +92 -0
- package/dist/utils/ossClient.js.map +1 -0
- package/dist/utils/permissionSync.d.ts +10 -0
- package/dist/utils/permissionSync.d.ts.map +1 -0
- package/dist/utils/permissionSync.js +11 -0
- package/dist/utils/permissionSync.js.map +1 -0
- package/dist/utils/redisClient.d.ts +91 -0
- package/dist/utils/redisClient.d.ts.map +1 -0
- package/dist/utils/redisClient.js +246 -0
- package/dist/utils/redisClient.js.map +1 -0
- package/dist/utils/sequence.d.ts +53 -0
- package/dist/utils/sequence.d.ts.map +1 -0
- package/dist/utils/sequence.js +109 -0
- package/dist/utils/sequence.js.map +1 -0
- package/dist/utils/smsClient.d.ts +15 -0
- package/dist/utils/smsClient.d.ts.map +1 -0
- package/dist/utils/smsClient.js +115 -0
- package/dist/utils/smsClient.js.map +1 -0
- package/dist/utils/supabaseClient.d.ts +5 -0
- package/dist/utils/supabaseClient.d.ts.map +1 -0
- package/dist/utils/supabaseClient.js +17 -0
- package/dist/utils/supabaseClient.js.map +1 -0
- package/dist/utils/unipushClient.d.ts +12 -0
- package/dist/utils/unipushClient.d.ts.map +1 -0
- package/dist/utils/unipushClient.js +109 -0
- package/dist/utils/unipushClient.js.map +1 -0
- package/dist/utils/validator.d.ts +74 -0
- package/dist/utils/validator.d.ts.map +1 -0
- package/dist/utils/validator.js +173 -0
- package/dist/utils/validator.js.map +1 -0
- package/dist/utils/wecom.d.ts +20 -0
- package/dist/utils/wecom.d.ts.map +1 -0
- package/dist/utils/wecom.js +126 -0
- package/dist/utils/wecom.js.map +1 -0
- package/package.json +84 -0
- package/templates/schema.system.prisma +283 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissionSync.d.ts","sourceRoot":"","sources":["../../src/utils/permissionSync.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissionSync.js","sourceRoot":"","sources":["../../src/utils/permissionSync.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { RedisClientType } from 'redis';
|
|
2
|
+
/**
|
|
3
|
+
* 连接 Redis(应在应用启动时调用一次)
|
|
4
|
+
*/
|
|
5
|
+
export declare function connectRedis(): Promise<void>;
|
|
6
|
+
/**
|
|
7
|
+
* 断开 Redis 连接
|
|
8
|
+
*/
|
|
9
|
+
export declare function disconnectRedis(): Promise<void>;
|
|
10
|
+
export declare const redis: {
|
|
11
|
+
/**
|
|
12
|
+
* 获取当前客户端原始实例(同步,不保证已连接;并发场景请使用 incr 等封装方法)
|
|
13
|
+
*/
|
|
14
|
+
readonly raw: RedisClientType | null;
|
|
15
|
+
/**
|
|
16
|
+
* 原子自增(发号器等场景)
|
|
17
|
+
*/
|
|
18
|
+
incr(key: string): Promise<number>;
|
|
19
|
+
/**
|
|
20
|
+
* 设置键值对
|
|
21
|
+
* @param key 键
|
|
22
|
+
* @param value 值(字符串)
|
|
23
|
+
* @param ttl 过期时间(秒),不传则不过期
|
|
24
|
+
*/
|
|
25
|
+
set(key: string, value: string, ttl?: number): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* 获取值
|
|
28
|
+
* @param key 键
|
|
29
|
+
* @returns 值或 null
|
|
30
|
+
*/
|
|
31
|
+
get(key: string): Promise<string | null>;
|
|
32
|
+
/**
|
|
33
|
+
* 删除键
|
|
34
|
+
* @param keys 一个或多个键
|
|
35
|
+
* @returns 删除的键数量
|
|
36
|
+
*/
|
|
37
|
+
del(...keys: string[]): Promise<number>;
|
|
38
|
+
/**
|
|
39
|
+
* 检查键是否存在
|
|
40
|
+
*/
|
|
41
|
+
exists(key: string): Promise<boolean>;
|
|
42
|
+
/**
|
|
43
|
+
* 设置过期时间
|
|
44
|
+
* @param key 键
|
|
45
|
+
* @param ttl 过期时间(秒)
|
|
46
|
+
*/
|
|
47
|
+
expire(key: string, ttl: number): Promise<boolean>;
|
|
48
|
+
/**
|
|
49
|
+
* 获取键的剩余过期时间(秒)
|
|
50
|
+
* @returns -2=不存在,-1=无过期,其他=剩余秒数
|
|
51
|
+
*/
|
|
52
|
+
ttl(key: string): Promise<number>;
|
|
53
|
+
/**
|
|
54
|
+
* 设置 JSON 对象(自动序列化)
|
|
55
|
+
* @param key 键
|
|
56
|
+
* @param value 对象
|
|
57
|
+
* @param ttl 过期时间(秒)
|
|
58
|
+
*/
|
|
59
|
+
setJSON<T>(key: string, value: T, ttl?: number): Promise<void>;
|
|
60
|
+
/**
|
|
61
|
+
* 获取 JSON 对象(自动反序列化)
|
|
62
|
+
* @param key 键
|
|
63
|
+
* @returns 解析后的对象或 null
|
|
64
|
+
*/
|
|
65
|
+
getJSON<T>(key: string): Promise<T | null>;
|
|
66
|
+
/**
|
|
67
|
+
* 设置 Hash 字段
|
|
68
|
+
*/
|
|
69
|
+
hSet(key: string, field: string, value: string): Promise<void>;
|
|
70
|
+
/**
|
|
71
|
+
* 获取 Hash 字段
|
|
72
|
+
*/
|
|
73
|
+
hGet(key: string, field: string): Promise<string | null>;
|
|
74
|
+
/**
|
|
75
|
+
* 获取整个 Hash
|
|
76
|
+
*/
|
|
77
|
+
hGetAll(key: string): Promise<Record<string, string>>;
|
|
78
|
+
/**
|
|
79
|
+
* 删除 Hash 字段
|
|
80
|
+
*/
|
|
81
|
+
hDel(key: string, ...fields: string[]): Promise<number>;
|
|
82
|
+
/**
|
|
83
|
+
* 缓存穿透防护:获取缓存,未命中则调用 fetcher 并缓存结果
|
|
84
|
+
* @param key 缓存键
|
|
85
|
+
* @param fetcher 数据获取函数
|
|
86
|
+
* @param ttl 缓存时间(秒),默认 300
|
|
87
|
+
*/
|
|
88
|
+
getOrSet<T>(key: string, fetcher: () => Promise<T>, ttl?: number): Promise<T>;
|
|
89
|
+
};
|
|
90
|
+
export default redis;
|
|
91
|
+
//# sourceMappingURL=redisClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redisClient.d.ts","sourceRoot":"","sources":["../../src/utils/redisClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,eAAe,EAAE,MAAM,OAAO,CAAC;AA+FtD;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAElD;AAED;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAMrD;AAID,eAAO,MAAM,KAAK;IAChB;;OAEG;kBACQ,eAAe,GAAG,IAAI;IAIjC;;OAEG;cACa,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIxC;;;;;OAKG;aACY,MAAM,SAAS,MAAM,QAAQ,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASlE;;;;OAIG;aACY,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAI9C;;;;OAIG;iBACgB,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAI7C;;OAEG;gBACe,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAK3C;;;;OAIG;gBACe,MAAM,OAAO,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKxD;;;OAGG;aACY,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAMvC;;;;;OAKG;YACW,CAAC,OAAO,MAAM,SAAS,CAAC,QAAQ,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpE;;;;OAIG;YACW,CAAC,OAAO,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAYhD;;OAEG;cACa,MAAM,SAAS,MAAM,SAAS,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpE;;OAEG;cACa,MAAM,SAAS,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAI9D;;OAEG;iBACgB,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAI3D;;OAEG;cACa,MAAM,aAAa,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAM7D;;;;;OAKG;aACY,CAAC,OAAO,MAAM,WAAW,MAAM,OAAO,CAAC,CAAC,CAAC,QAAO,MAAM,GAAS,OAAO,CAAC,CAAC,CAAC;CAQzF,CAAC;AAEF,eAAe,KAAK,CAAC"}
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.redis = void 0;
|
|
4
|
+
exports.connectRedis = connectRedis;
|
|
5
|
+
exports.disconnectRedis = disconnectRedis;
|
|
6
|
+
const redis_1 = require("redis");
|
|
7
|
+
const logger_1 = require("./logger");
|
|
8
|
+
/**
|
|
9
|
+
* Redis 客户端封装(自动重连)
|
|
10
|
+
*
|
|
11
|
+
* 提供连接管理、常用操作封装、自动重连等功能。
|
|
12
|
+
* 使用 `redis` v5 官方客户端(默认 RESP2 协议)。
|
|
13
|
+
*
|
|
14
|
+
* 协议说明:node-redis v6 起默认改用 RESP3(握手发送 HELLO 命令),要求 Redis ≥ 6.0;
|
|
15
|
+
* 本项目部署环境为 Redis 5,因此固定使用 v5(默认 RESP2,不发送 HELLO),
|
|
16
|
+
* 升级 redis 包时务必保持 v5 大版本或确认服务端版本。
|
|
17
|
+
*
|
|
18
|
+
* 注意:connect() 只能调用一次,实例一旦断开(Redis 重启/空闲断连)
|
|
19
|
+
* 即进入 closed 状态无法复用。本封装在检测到连接不可用时自动重建实例并重连,
|
|
20
|
+
* 避免出现 "The client is closed" 错误。
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```ts
|
|
24
|
+
* import { redis } from '../utils/redisClient';
|
|
25
|
+
*
|
|
26
|
+
* await redis.set('key', 'value', 60); // 设置,60秒过期
|
|
27
|
+
* const val = await redis.get('key'); // 获取
|
|
28
|
+
* await redis.del('key'); // 删除
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
const REDIS_URL = process.env.REDIS_URL || 'redis://localhost:6379';
|
|
32
|
+
const REDIS_DB = parseInt(process.env.REDIS_DB || '0', 10);
|
|
33
|
+
let client = null;
|
|
34
|
+
let connecting = null;
|
|
35
|
+
/**
|
|
36
|
+
* 创建客户端实例并绑定事件
|
|
37
|
+
*/
|
|
38
|
+
function createRedisClient() {
|
|
39
|
+
const instance = (0, redis_1.createClient)({
|
|
40
|
+
url: REDIS_URL,
|
|
41
|
+
database: REDIS_DB,
|
|
42
|
+
socket: {
|
|
43
|
+
// 中间断连自动重连(退避至最多 3s);真正关闭后由 end 事件触发下次调用时重建
|
|
44
|
+
reconnectStrategy: (retries) => Math.min(200 * retries, 3000),
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
instance.on('connect', () => {
|
|
48
|
+
logger_1.logger.info(`[Redis] Connected to ${REDIS_URL} (db ${REDIS_DB})`);
|
|
49
|
+
});
|
|
50
|
+
instance.on('ready', () => {
|
|
51
|
+
logger_1.logger.info(`[Redis] Ready (db ${REDIS_DB})`);
|
|
52
|
+
});
|
|
53
|
+
instance.on('error', (err) => {
|
|
54
|
+
logger_1.logger.error('[Redis] Connection error:', err.message);
|
|
55
|
+
});
|
|
56
|
+
instance.on('reconnecting', () => {
|
|
57
|
+
logger_1.logger.info('[Redis] Reconnecting...');
|
|
58
|
+
});
|
|
59
|
+
instance.on('end', () => {
|
|
60
|
+
logger_1.logger.warn('[Redis] Connection closed, will recreate on next use');
|
|
61
|
+
if (client === instance)
|
|
62
|
+
client = null;
|
|
63
|
+
});
|
|
64
|
+
return instance;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* 获取已连接的客户端(懒初始化 + 断开自动重建,并发安全)
|
|
68
|
+
*/
|
|
69
|
+
async function getClient() {
|
|
70
|
+
if (client && client.isOpen)
|
|
71
|
+
return client;
|
|
72
|
+
if (connecting)
|
|
73
|
+
return connecting;
|
|
74
|
+
connecting = (async () => {
|
|
75
|
+
if (!client)
|
|
76
|
+
client = createRedisClient();
|
|
77
|
+
if (!client.isOpen) {
|
|
78
|
+
try {
|
|
79
|
+
await client.connect();
|
|
80
|
+
}
|
|
81
|
+
catch (e) {
|
|
82
|
+
logger_1.logger.error('[Redis] Connect failed:', e.message);
|
|
83
|
+
// connect 失败时该实例不可复用,丢弃由下次调用重建
|
|
84
|
+
client = null;
|
|
85
|
+
throw e;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return client;
|
|
89
|
+
})().finally(() => {
|
|
90
|
+
connecting = null;
|
|
91
|
+
});
|
|
92
|
+
return connecting;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* 连接 Redis(应在应用启动时调用一次)
|
|
96
|
+
*/
|
|
97
|
+
async function connectRedis() {
|
|
98
|
+
await getClient();
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* 断开 Redis 连接
|
|
102
|
+
*/
|
|
103
|
+
async function disconnectRedis() {
|
|
104
|
+
const c = client;
|
|
105
|
+
client = null;
|
|
106
|
+
if (c?.isOpen) {
|
|
107
|
+
await c.quit();
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// ============ 常用操作封装 ============
|
|
111
|
+
exports.redis = {
|
|
112
|
+
/**
|
|
113
|
+
* 获取当前客户端原始实例(同步,不保证已连接;并发场景请使用 incr 等封装方法)
|
|
114
|
+
*/
|
|
115
|
+
get raw() {
|
|
116
|
+
return client;
|
|
117
|
+
},
|
|
118
|
+
/**
|
|
119
|
+
* 原子自增(发号器等场景)
|
|
120
|
+
*/
|
|
121
|
+
async incr(key) {
|
|
122
|
+
return (await getClient()).incr(key);
|
|
123
|
+
},
|
|
124
|
+
/**
|
|
125
|
+
* 设置键值对
|
|
126
|
+
* @param key 键
|
|
127
|
+
* @param value 值(字符串)
|
|
128
|
+
* @param ttl 过期时间(秒),不传则不过期
|
|
129
|
+
*/
|
|
130
|
+
async set(key, value, ttl) {
|
|
131
|
+
const c = await getClient();
|
|
132
|
+
if (ttl && ttl > 0) {
|
|
133
|
+
await c.setEx(key, ttl, value);
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
await c.set(key, value);
|
|
137
|
+
}
|
|
138
|
+
},
|
|
139
|
+
/**
|
|
140
|
+
* 获取值
|
|
141
|
+
* @param key 键
|
|
142
|
+
* @returns 值或 null
|
|
143
|
+
*/
|
|
144
|
+
async get(key) {
|
|
145
|
+
return (await getClient()).get(key);
|
|
146
|
+
},
|
|
147
|
+
/**
|
|
148
|
+
* 删除键
|
|
149
|
+
* @param keys 一个或多个键
|
|
150
|
+
* @returns 删除的键数量
|
|
151
|
+
*/
|
|
152
|
+
async del(...keys) {
|
|
153
|
+
return (await getClient()).del(keys);
|
|
154
|
+
},
|
|
155
|
+
/**
|
|
156
|
+
* 检查键是否存在
|
|
157
|
+
*/
|
|
158
|
+
async exists(key) {
|
|
159
|
+
const result = await (await getClient()).exists(key);
|
|
160
|
+
return result === 1;
|
|
161
|
+
},
|
|
162
|
+
/**
|
|
163
|
+
* 设置过期时间
|
|
164
|
+
* @param key 键
|
|
165
|
+
* @param ttl 过期时间(秒)
|
|
166
|
+
*/
|
|
167
|
+
async expire(key, ttl) {
|
|
168
|
+
const result = await (await getClient()).expire(key, ttl);
|
|
169
|
+
return result === 1;
|
|
170
|
+
},
|
|
171
|
+
/**
|
|
172
|
+
* 获取键的剩余过期时间(秒)
|
|
173
|
+
* @returns -2=不存在,-1=无过期,其他=剩余秒数
|
|
174
|
+
*/
|
|
175
|
+
async ttl(key) {
|
|
176
|
+
return (await getClient()).ttl(key);
|
|
177
|
+
},
|
|
178
|
+
// ============ JSON 操作 ============
|
|
179
|
+
/**
|
|
180
|
+
* 设置 JSON 对象(自动序列化)
|
|
181
|
+
* @param key 键
|
|
182
|
+
* @param value 对象
|
|
183
|
+
* @param ttl 过期时间(秒)
|
|
184
|
+
*/
|
|
185
|
+
async setJSON(key, value, ttl) {
|
|
186
|
+
await this.set(key, JSON.stringify(value), ttl);
|
|
187
|
+
},
|
|
188
|
+
/**
|
|
189
|
+
* 获取 JSON 对象(自动反序列化)
|
|
190
|
+
* @param key 键
|
|
191
|
+
* @returns 解析后的对象或 null
|
|
192
|
+
*/
|
|
193
|
+
async getJSON(key) {
|
|
194
|
+
const raw = await this.get(key);
|
|
195
|
+
if (raw === null)
|
|
196
|
+
return null;
|
|
197
|
+
try {
|
|
198
|
+
return JSON.parse(raw);
|
|
199
|
+
}
|
|
200
|
+
catch {
|
|
201
|
+
return null;
|
|
202
|
+
}
|
|
203
|
+
},
|
|
204
|
+
// ============ Hash 操作 ============
|
|
205
|
+
/**
|
|
206
|
+
* 设置 Hash 字段
|
|
207
|
+
*/
|
|
208
|
+
async hSet(key, field, value) {
|
|
209
|
+
await (await getClient()).hSet(key, field, value);
|
|
210
|
+
},
|
|
211
|
+
/**
|
|
212
|
+
* 获取 Hash 字段
|
|
213
|
+
*/
|
|
214
|
+
async hGet(key, field) {
|
|
215
|
+
return (await getClient()).hGet(key, field);
|
|
216
|
+
},
|
|
217
|
+
/**
|
|
218
|
+
* 获取整个 Hash
|
|
219
|
+
*/
|
|
220
|
+
async hGetAll(key) {
|
|
221
|
+
return (await getClient()).hGetAll(key);
|
|
222
|
+
},
|
|
223
|
+
/**
|
|
224
|
+
* 删除 Hash 字段
|
|
225
|
+
*/
|
|
226
|
+
async hDel(key, ...fields) {
|
|
227
|
+
return (await getClient()).hDel(key, fields);
|
|
228
|
+
},
|
|
229
|
+
// ============ 缓存辅助 ============
|
|
230
|
+
/**
|
|
231
|
+
* 缓存穿透防护:获取缓存,未命中则调用 fetcher 并缓存结果
|
|
232
|
+
* @param key 缓存键
|
|
233
|
+
* @param fetcher 数据获取函数
|
|
234
|
+
* @param ttl 缓存时间(秒),默认 300
|
|
235
|
+
*/
|
|
236
|
+
async getOrSet(key, fetcher, ttl = 300) {
|
|
237
|
+
const cached = await this.getJSON(key);
|
|
238
|
+
if (cached !== null)
|
|
239
|
+
return cached;
|
|
240
|
+
const data = await fetcher();
|
|
241
|
+
await this.setJSON(key, data, ttl);
|
|
242
|
+
return data;
|
|
243
|
+
},
|
|
244
|
+
};
|
|
245
|
+
exports.default = exports.redis;
|
|
246
|
+
//# sourceMappingURL=redisClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redisClient.js","sourceRoot":"","sources":["../../src/utils/redisClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 单据编号发号器
|
|
3
|
+
*
|
|
4
|
+
* 全系统单号统一格式:「前缀-日期-当日序号」,如 WB-20260811-001。
|
|
5
|
+
* 优先使用 Redis INCR(键 seq:{prefix}:{yyyyMMdd},当日首次发号时设置次日凌晨过期)保证并发唯一;
|
|
6
|
+
* Redis 不可用时降级为数据库序列表 sys_sequences 发号。
|
|
7
|
+
* 序号溢出 999 时自动扩展位数;单号列均有唯一索引兜底。
|
|
8
|
+
*/
|
|
9
|
+
/** 单据前缀定义(与 database-design.md 第10节一致) */
|
|
10
|
+
export declare const SEQ_PREFIX: {
|
|
11
|
+
/** 销售订单 */
|
|
12
|
+
readonly SALE_ORDER: "SO";
|
|
13
|
+
/** 仓发出库单 */
|
|
14
|
+
readonly OUTBOUND: "OB";
|
|
15
|
+
/** 销售出库单(无订单直出) */
|
|
16
|
+
readonly SALE_OUTBOUND: "SDO";
|
|
17
|
+
/** 运单(V4.0 替代发货批次) */
|
|
18
|
+
readonly WAYBILL: "WB";
|
|
19
|
+
/** 常规采购单 */
|
|
20
|
+
readonly PURCHASE_ORDER: "PO";
|
|
21
|
+
/** 采购入库单 */
|
|
22
|
+
readonly PURCHASE_RECEIPT: "PR";
|
|
23
|
+
/** 销售退货单 */
|
|
24
|
+
readonly SALE_RETURN: "SR";
|
|
25
|
+
/** 采购退货单 */
|
|
26
|
+
readonly PURCHASE_RETURN: "PRT";
|
|
27
|
+
/** 调拨单 */
|
|
28
|
+
readonly TRANSFER: "TR";
|
|
29
|
+
/** 盘点单 */
|
|
30
|
+
readonly STOCK_CHECK: "SC";
|
|
31
|
+
/** 应收单 */
|
|
32
|
+
readonly RECEIVABLE: "AR";
|
|
33
|
+
/** 应付单 */
|
|
34
|
+
readonly PAYABLE: "AP";
|
|
35
|
+
/** 费用单 */
|
|
36
|
+
readonly FEE: "FEE";
|
|
37
|
+
/** 商品SKU编码 */
|
|
38
|
+
readonly SKU: "SKU";
|
|
39
|
+
/** 门店编号 */
|
|
40
|
+
readonly STORE: "ST";
|
|
41
|
+
};
|
|
42
|
+
export type SeqPrefix = (typeof SEQ_PREFIX)[keyof typeof SEQ_PREFIX];
|
|
43
|
+
/**
|
|
44
|
+
* 生成下一个单据编号
|
|
45
|
+
*
|
|
46
|
+
* @param prefix 单据前缀(使用 SEQ_PREFIX 常量)
|
|
47
|
+
* @returns 形如 `SO-20260729-001` 的单号
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* const orderNo = await nextSequenceNo(SEQ_PREFIX.SALE_ORDER);
|
|
51
|
+
*/
|
|
52
|
+
export declare function nextSequenceNo(prefix: SeqPrefix): Promise<string>;
|
|
53
|
+
//# sourceMappingURL=sequence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sequence.d.ts","sourceRoot":"","sources":["../../src/utils/sequence.ts"],"names":[],"mappings":"AAIA;;;;;;;GAOG;AAEH,0CAA0C;AAC1C,eAAO,MAAM,UAAU;IACrB,WAAW;;IAEX,YAAY;;IAEZ,mBAAmB;;IAEnB,sBAAsB;;IAEtB,YAAY;;IAEZ,YAAY;;IAEZ,YAAY;;IAEZ,YAAY;;IAEZ,UAAU;;IAEV,UAAU;;IAEV,UAAU;;IAEV,UAAU;;IAEV,UAAU;;IAEV,cAAc;;IAEd,WAAW;;CAEH,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,OAAO,UAAU,CAAC,CAAC;AA0CrE;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAevE"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SEQ_PREFIX = void 0;
|
|
4
|
+
exports.nextSequenceNo = nextSequenceNo;
|
|
5
|
+
const database_1 = require("../config/database");
|
|
6
|
+
const redisClient_1 = require("./redisClient");
|
|
7
|
+
const logger_1 = require("./logger");
|
|
8
|
+
/**
|
|
9
|
+
* 单据编号发号器
|
|
10
|
+
*
|
|
11
|
+
* 全系统单号统一格式:「前缀-日期-当日序号」,如 WB-20260811-001。
|
|
12
|
+
* 优先使用 Redis INCR(键 seq:{prefix}:{yyyyMMdd},当日首次发号时设置次日凌晨过期)保证并发唯一;
|
|
13
|
+
* Redis 不可用时降级为数据库序列表 sys_sequences 发号。
|
|
14
|
+
* 序号溢出 999 时自动扩展位数;单号列均有唯一索引兜底。
|
|
15
|
+
*/
|
|
16
|
+
/** 单据前缀定义(与 database-design.md 第10节一致) */
|
|
17
|
+
exports.SEQ_PREFIX = {
|
|
18
|
+
/** 销售订单 */
|
|
19
|
+
SALE_ORDER: 'SO',
|
|
20
|
+
/** 仓发出库单 */
|
|
21
|
+
OUTBOUND: 'OB',
|
|
22
|
+
/** 销售出库单(无订单直出) */
|
|
23
|
+
SALE_OUTBOUND: 'SDO',
|
|
24
|
+
/** 运单(V4.0 替代发货批次) */
|
|
25
|
+
WAYBILL: 'WB',
|
|
26
|
+
/** 常规采购单 */
|
|
27
|
+
PURCHASE_ORDER: 'PO',
|
|
28
|
+
/** 采购入库单 */
|
|
29
|
+
PURCHASE_RECEIPT: 'PR',
|
|
30
|
+
/** 销售退货单 */
|
|
31
|
+
SALE_RETURN: 'SR',
|
|
32
|
+
/** 采购退货单 */
|
|
33
|
+
PURCHASE_RETURN: 'PRT',
|
|
34
|
+
/** 调拨单 */
|
|
35
|
+
TRANSFER: 'TR',
|
|
36
|
+
/** 盘点单 */
|
|
37
|
+
STOCK_CHECK: 'SC',
|
|
38
|
+
/** 应收单 */
|
|
39
|
+
RECEIVABLE: 'AR',
|
|
40
|
+
/** 应付单 */
|
|
41
|
+
PAYABLE: 'AP',
|
|
42
|
+
/** 费用单 */
|
|
43
|
+
FEE: 'FEE',
|
|
44
|
+
/** 商品SKU编码 */
|
|
45
|
+
SKU: 'SKU',
|
|
46
|
+
/** 门店编号 */
|
|
47
|
+
STORE: 'ST',
|
|
48
|
+
};
|
|
49
|
+
/** 获取当日日期串 yyyyMMdd */
|
|
50
|
+
function todayStr() {
|
|
51
|
+
const now = new Date();
|
|
52
|
+
const y = now.getFullYear();
|
|
53
|
+
const m = String(now.getMonth() + 1).padStart(2, '0');
|
|
54
|
+
const d = String(now.getDate()).padStart(2, '0');
|
|
55
|
+
return `${y}${m}${d}`;
|
|
56
|
+
}
|
|
57
|
+
/** 距离次日凌晨的剩余秒数(作为 Redis 键过期时间) */
|
|
58
|
+
function secondsUntilMidnight() {
|
|
59
|
+
const now = new Date();
|
|
60
|
+
const midnight = new Date(now.getFullYear(), now.getMonth(), now.getDate() + 1);
|
|
61
|
+
return Math.max(60, Math.floor((midnight.getTime() - now.getTime()) / 1000));
|
|
62
|
+
}
|
|
63
|
+
/** Redis 发号 */
|
|
64
|
+
async function nextFromRedis(seqKey) {
|
|
65
|
+
const key = `seq:${seqKey}`;
|
|
66
|
+
const value = await redisClient_1.redis.incr(key);
|
|
67
|
+
if (value === 1) {
|
|
68
|
+
await redisClient_1.redis.expire(key, secondsUntilMidnight());
|
|
69
|
+
}
|
|
70
|
+
return value;
|
|
71
|
+
}
|
|
72
|
+
/** 数据库序列表降级发号(upsert + 原子自增后读取) */
|
|
73
|
+
async function nextFromDb(seqKey) {
|
|
74
|
+
const result = await database_1.prisma.$transaction(async (tx) => {
|
|
75
|
+
await tx.sysSequence.upsert({
|
|
76
|
+
where: { seqKey },
|
|
77
|
+
update: { currentValue: { increment: 1 } },
|
|
78
|
+
create: { seqKey, currentValue: 1 },
|
|
79
|
+
});
|
|
80
|
+
const row = await tx.sysSequence.findUniqueOrThrow({ where: { seqKey } });
|
|
81
|
+
return row.currentValue;
|
|
82
|
+
});
|
|
83
|
+
return result;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* 生成下一个单据编号
|
|
87
|
+
*
|
|
88
|
+
* @param prefix 单据前缀(使用 SEQ_PREFIX 常量)
|
|
89
|
+
* @returns 形如 `SO-20260729-001` 的单号
|
|
90
|
+
*
|
|
91
|
+
* @example
|
|
92
|
+
* const orderNo = await nextSequenceNo(SEQ_PREFIX.SALE_ORDER);
|
|
93
|
+
*/
|
|
94
|
+
async function nextSequenceNo(prefix) {
|
|
95
|
+
const date = todayStr();
|
|
96
|
+
const seqKey = `${prefix}:${date}`;
|
|
97
|
+
let seq;
|
|
98
|
+
try {
|
|
99
|
+
seq = await nextFromRedis(seqKey);
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
logger_1.logger.warn(`[Sequence] Redis 发号失败,降级为数据库发号:${err.message}`);
|
|
103
|
+
seq = await nextFromDb(seqKey);
|
|
104
|
+
}
|
|
105
|
+
// 序号默认3位,溢出自动扩展位数
|
|
106
|
+
const seqStr = String(seq).padStart(3, '0');
|
|
107
|
+
return `${prefix}-${date}-${seqStr}`;
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=sequence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sequence.js","sourceRoot":"","sources":["../../src/utils/sequence.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** 校验短信配置是否完整(不抛出,返回缺失项说明;供调用方决定是否跳过) */
|
|
2
|
+
export declare function isSmsConfigured(): {
|
|
3
|
+
ok: boolean;
|
|
4
|
+
reason?: string;
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* 发送短信验证码/通知短信(单条)
|
|
8
|
+
* @param phone 接收手机号(如 13800138000)
|
|
9
|
+
* @param templateParams 模板变量(JSON 字符串,如 '{"name":"张三","date":"2026-08-20"}',与模板中 ${xxx} 一一对应)
|
|
10
|
+
* @returns 阿里云返回的 BizId
|
|
11
|
+
*/
|
|
12
|
+
export declare function sendSms(phone: string, templateParams?: Record<string, any>): Promise<string>;
|
|
13
|
+
/** 批量发送短信(逐条发送;阿里云短信 API 单次仅支持一个手机号) */
|
|
14
|
+
export declare function sendSmsBatch(phones: string[], templateParams?: Record<string, any>): Promise<number>;
|
|
15
|
+
//# sourceMappingURL=smsClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"smsClient.d.ts","sourceRoot":"","sources":["../../src/utils/smsClient.ts"],"names":[],"mappings":"AASA,yCAAyC;AACzC,wBAAgB,eAAe,IAAI;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAMlE;AAqBD;;;;;GAKG;AACH,wBAAsB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAelG;AAED,wCAAwC;AACxC,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAY1G"}
|