midway-fatcms 0.0.1-beta.7 → 0.0.1-beta.70

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.
Files changed (530) hide show
  1. package/.eslintrc.json +14 -0
  2. package/.prettierrc.js +4 -0
  3. package/README.md +8 -1
  4. package/dist/config/config.default.d.ts +3 -3
  5. package/dist/config/config.default.js +171 -185
  6. package/dist/config/seed/aeskey.txt +1 -1
  7. package/dist/config/utils.d.ts +1 -1
  8. package/dist/config/utils.js +23 -23
  9. package/dist/configuration.d.ts +7 -6
  10. package/dist/configuration.js +113 -89
  11. package/dist/controller/base/BaseApiController.d.ts +42 -31
  12. package/dist/controller/base/BaseApiController.js +189 -141
  13. package/dist/controller/gateway/AnyApiGatewayController.d.ts +13 -13
  14. package/dist/controller/gateway/AnyApiGatewayController.js +55 -55
  15. package/dist/controller/gateway/AsyncTaskController.d.ts +20 -0
  16. package/dist/controller/gateway/AsyncTaskController.js +181 -0
  17. package/dist/controller/gateway/CrudMtdGatewayController.d.ts +21 -21
  18. package/dist/controller/gateway/CrudMtdGatewayController.js +122 -116
  19. package/dist/controller/gateway/CrudStdGatewayController.d.ts +39 -38
  20. package/dist/controller/gateway/CrudStdGatewayController.js +149 -137
  21. package/dist/controller/gateway/DocGatewayController.d.ts +27 -27
  22. package/dist/controller/gateway/DocGatewayController.js +179 -179
  23. package/dist/controller/gateway/FileController.d.ts +28 -25
  24. package/dist/controller/gateway/FileController.js +145 -129
  25. package/dist/controller/gateway/ProxyApiGatewayController.d.ts +18 -18
  26. package/dist/controller/gateway/ProxyApiGatewayController.js +78 -78
  27. package/dist/controller/gateway/PublicApiController.d.ts +33 -27
  28. package/dist/controller/gateway/PublicApiController.js +201 -167
  29. package/dist/controller/gateway/StaticController.d.ts +23 -24
  30. package/dist/controller/gateway/StaticController.js +286 -285
  31. package/dist/controller/helpers.controller.d.ts +39 -39
  32. package/dist/controller/helpers.controller.js +188 -188
  33. package/dist/controller/home.controller.d.ts +9 -9
  34. package/dist/controller/home.controller.js +72 -71
  35. package/dist/controller/manage/AnyApiMangeApi.d.ts +10 -10
  36. package/dist/controller/manage/AnyApiMangeApi.js +98 -98
  37. package/dist/controller/manage/AppLogMangeApi.d.ts +10 -10
  38. package/dist/controller/manage/AppLogMangeApi.js +88 -88
  39. package/dist/controller/manage/AppMangeApi.d.ts +12 -10
  40. package/dist/controller/manage/AppMangeApi.js +101 -88
  41. package/dist/controller/manage/AppPageMangeApi.d.ts +10 -10
  42. package/dist/controller/manage/AppPageMangeApi.js +87 -87
  43. package/dist/controller/manage/AppSchemaHistoryApi.d.ts +10 -10
  44. package/dist/controller/manage/AppSchemaHistoryApi.js +83 -83
  45. package/dist/controller/manage/CrudMethodsMangeApi.d.ts +10 -10
  46. package/dist/controller/manage/CrudMethodsMangeApi.js +84 -84
  47. package/dist/controller/manage/CrudStandardDesignApi.d.ts +46 -38
  48. package/dist/controller/manage/CrudStandardDesignApi.js +395 -354
  49. package/dist/controller/manage/DataDictManageApi.d.ts +15 -15
  50. package/dist/controller/manage/DataDictManageApi.js +133 -133
  51. package/dist/controller/manage/DeployManageApi.d.ts +19 -19
  52. package/dist/controller/manage/DeployManageApi.js +180 -178
  53. package/dist/controller/manage/DocLibManageApi.d.ts +10 -10
  54. package/dist/controller/manage/DocLibManageApi.js +104 -104
  55. package/dist/controller/manage/DocManageApi.d.ts +11 -11
  56. package/dist/controller/manage/DocManageApi.js +130 -130
  57. package/dist/controller/manage/FileManageApi.d.ts +13 -13
  58. package/dist/controller/manage/FileManageApi.js +77 -77
  59. package/dist/controller/manage/LowCodeTplManageApi.d.ts +13 -13
  60. package/dist/controller/manage/LowCodeTplManageApi.js +86 -86
  61. package/dist/controller/manage/MenuManageApi.d.ts +10 -10
  62. package/dist/controller/manage/MenuManageApi.js +93 -93
  63. package/dist/controller/manage/ProxyApiMangeApi.d.ts +10 -10
  64. package/dist/controller/manage/ProxyApiMangeApi.js +87 -87
  65. package/dist/controller/manage/SuperAdminManageApi.d.ts +24 -24
  66. package/dist/controller/manage/SuperAdminManageApi.js +153 -153
  67. package/dist/controller/manage/SysConfigMangeApi.d.ts +12 -11
  68. package/dist/controller/manage/SysConfigMangeApi.js +133 -126
  69. package/dist/controller/manage/SystemInfoManageApi.d.ts +12 -12
  70. package/dist/controller/manage/SystemInfoManageApi.js +72 -66
  71. package/dist/controller/manage/UserAccountManageApi.d.ts +16 -14
  72. package/dist/controller/manage/UserAccountManageApi.js +153 -124
  73. package/dist/controller/manage/WorkbenchMangeApi.d.ts +11 -11
  74. package/dist/controller/manage/WorkbenchMangeApi.js +103 -103
  75. package/dist/controller/myinfo/AuthController.d.ts +33 -37
  76. package/dist/controller/myinfo/AuthController.js +136 -189
  77. package/dist/controller/myinfo/MyInfoController.d.ts +13 -13
  78. package/dist/controller/myinfo/MyInfoController.js +51 -51
  79. package/dist/controller/render/AppRenderController.d.ts +12 -11
  80. package/dist/controller/render/AppRenderController.js +87 -87
  81. package/dist/controller/test.controller.d.ts +8 -8
  82. package/dist/controller/test.controller.js +51 -51
  83. package/dist/filter/default.filter.d.ts +7 -7
  84. package/dist/filter/default.filter.js +23 -23
  85. package/dist/filter/notfound.filter.d.ts +5 -5
  86. package/dist/filter/notfound.filter.js +20 -20
  87. package/dist/index.d.ts +104 -94
  88. package/dist/index.js +122 -112
  89. package/dist/interface.d.ts +29 -27
  90. package/dist/interface.js +3 -3
  91. package/dist/libs/crud-pro/CrudPro.d.ts +37 -36
  92. package/dist/libs/crud-pro/CrudPro.js +136 -131
  93. package/dist/libs/crud-pro/defaultConfigs.d.ts +4 -4
  94. package/dist/libs/crud-pro/defaultConfigs.js +15 -13
  95. package/dist/libs/crud-pro/exceptions.d.ts +106 -104
  96. package/dist/libs/crud-pro/exceptions.js +119 -117
  97. package/dist/libs/crud-pro/interfaces.d.ts +166 -157
  98. package/dist/libs/crud-pro/interfaces.js +12 -12
  99. package/dist/libs/crud-pro/models/ExecuteContext.d.ts +49 -42
  100. package/dist/libs/crud-pro/models/ExecuteContext.js +79 -79
  101. package/dist/libs/crud-pro/models/ExecuteContextFunc.d.ts +38 -31
  102. package/dist/libs/crud-pro/models/ExecuteContextFunc.js +72 -64
  103. package/dist/libs/crud-pro/models/FuncContext.d.ts +18 -18
  104. package/dist/libs/crud-pro/models/FuncContext.js +6 -6
  105. package/dist/libs/crud-pro/models/RequestCfgModel.d.ts +65 -65
  106. package/dist/libs/crud-pro/models/RequestCfgModel.js +81 -81
  107. package/dist/libs/crud-pro/models/RequestModel.d.ts +25 -25
  108. package/dist/libs/crud-pro/models/RequestModel.js +113 -113
  109. package/dist/libs/crud-pro/models/ResModel.d.ts +16 -0
  110. package/dist/libs/crud-pro/models/ResModel.js +2 -0
  111. package/dist/libs/crud-pro/models/ServiceHub.d.ts +20 -20
  112. package/dist/libs/crud-pro/models/ServiceHub.js +2 -2
  113. package/dist/libs/crud-pro/models/SqlCfgModel.d.ts +23 -22
  114. package/dist/libs/crud-pro/models/SqlCfgModel.js +40 -40
  115. package/dist/libs/crud-pro/models/SqlSegArg.d.ts +6 -6
  116. package/dist/libs/crud-pro/models/SqlSegArg.js +12 -12
  117. package/dist/libs/crud-pro/models/Transaction.d.ts +30 -29
  118. package/dist/libs/crud-pro/models/Transaction.js +74 -67
  119. package/dist/libs/crud-pro/models/TransactionMySQL.d.ts +28 -28
  120. package/dist/libs/crud-pro/models/TransactionMySQL.js +76 -76
  121. package/dist/libs/crud-pro/models/TransactionPostgres.d.ts +28 -28
  122. package/dist/libs/crud-pro/models/TransactionPostgres.js +85 -85
  123. package/dist/libs/crud-pro/models/TransactionSqlServer.d.ts +34 -34
  124. package/dist/libs/crud-pro/models/TransactionSqlServer.js +92 -92
  125. package/dist/libs/crud-pro/models/keys.d.ts +110 -106
  126. package/dist/libs/crud-pro/models/keys.js +154 -149
  127. package/dist/libs/crud-pro/services/CrudProCachedCfgService.d.ts +11 -10
  128. package/dist/libs/crud-pro/services/CrudProCachedCfgService.js +73 -61
  129. package/dist/libs/crud-pro/services/CrudProExecuteFuncService.d.ts +9 -9
  130. package/dist/libs/crud-pro/services/CrudProExecuteFuncService.js +125 -112
  131. package/dist/libs/crud-pro/services/CrudProExecuteSqlService.d.ts +17 -17
  132. package/dist/libs/crud-pro/services/CrudProExecuteSqlService.js +225 -227
  133. package/dist/libs/crud-pro/services/CrudProFieldUpdateService.d.ts +9 -9
  134. package/dist/libs/crud-pro/services/CrudProFieldUpdateService.js +51 -51
  135. package/dist/libs/crud-pro/services/CrudProFieldValidateService.d.ts +13 -13
  136. package/dist/libs/crud-pro/services/CrudProFieldValidateService.js +148 -148
  137. package/dist/libs/crud-pro/services/CrudProGenSqlCondition.d.ts +24 -24
  138. package/dist/libs/crud-pro/services/CrudProGenSqlCondition.js +355 -342
  139. package/dist/libs/crud-pro/services/CrudProGenSqlService.d.ts +25 -25
  140. package/dist/libs/crud-pro/services/CrudProGenSqlService.js +165 -174
  141. package/dist/libs/crud-pro/services/CrudProOriginToExecuteSql.d.ts +32 -32
  142. package/dist/libs/crud-pro/services/CrudProOriginToExecuteSql.js +339 -333
  143. package/dist/libs/crud-pro/services/CrudProServiceBase.d.ts +24 -28
  144. package/dist/libs/crud-pro/services/CrudProServiceBase.js +88 -78
  145. package/dist/libs/crud-pro/services/CrudProTableMetaService.d.ts +9 -8
  146. package/dist/libs/crud-pro/services/CrudProTableMetaService.js +78 -53
  147. package/dist/libs/crud-pro/services/CurdProServiceHub.d.ts +32 -32
  148. package/dist/libs/crud-pro/services/CurdProServiceHub.js +64 -64
  149. package/dist/libs/crud-pro/sql.txt +120 -120
  150. package/dist/libs/crud-pro/utils/CompareUtils.d.ts +9 -9
  151. package/dist/libs/crud-pro/utils/CompareUtils.js +25 -25
  152. package/dist/libs/crud-pro/utils/DatabaseName.d.ts +9 -9
  153. package/dist/libs/crud-pro/utils/DatabaseName.js +50 -29
  154. package/dist/libs/crud-pro/utils/DateTimeUtils.d.ts +7 -7
  155. package/dist/libs/crud-pro/utils/DateTimeUtils.js +21 -21
  156. package/dist/libs/crud-pro/utils/MemoryRefreshCache.d.ts +19 -19
  157. package/dist/libs/crud-pro/utils/MemoryRefreshCache.js +47 -47
  158. package/dist/libs/crud-pro/utils/MessageParseUtils.d.ts +5 -5
  159. package/dist/libs/crud-pro/utils/MessageParseUtils.js +33 -33
  160. package/dist/libs/crud-pro/utils/MixinUtils.d.ts +39 -39
  161. package/dist/libs/crud-pro/utils/MixinUtils.js +255 -255
  162. package/dist/libs/crud-pro/utils/ModelUtils.d.ts +11 -11
  163. package/dist/libs/crud-pro/utils/ModelUtils.js +54 -49
  164. package/dist/libs/crud-pro/utils/MultiKeyMap.d.ts +11 -11
  165. package/dist/libs/crud-pro/utils/MultiKeyMap.js +63 -63
  166. package/dist/libs/crud-pro/utils/SqlFuncUtils.d.ts +5 -5
  167. package/dist/libs/crud-pro/utils/SqlFuncUtils.js +29 -29
  168. package/dist/libs/crud-pro/utils/TypeUtils.d.ts +40 -40
  169. package/dist/libs/crud-pro/utils/TypeUtils.js +166 -166
  170. package/dist/libs/crud-pro/utils/ValidateUtils.d.ts +3 -3
  171. package/dist/libs/crud-pro/utils/ValidateUtils.js +165 -165
  172. package/dist/libs/crud-pro/utils/pool/MySQLUtils.d.ts +3 -3
  173. package/dist/libs/crud-pro/utils/pool/MySQLUtils.js +19 -19
  174. package/dist/libs/crud-pro/utils/pool/PostgresUtils.d.ts +3 -3
  175. package/dist/libs/crud-pro/utils/pool/PostgresUtils.js +20 -20
  176. package/dist/libs/crud-pro/utils/pool/SqlServerUtils.d.ts +3 -3
  177. package/dist/libs/crud-pro/utils/pool/SqlServerUtils.js +20 -20
  178. package/dist/libs/crud-pro/utils/sqlConvert/convertColumnName.d.ts +4 -4
  179. package/dist/libs/crud-pro/utils/sqlConvert/convertColumnName.js +35 -21
  180. package/dist/libs/crud-pro/utils/sqlConvert/convertMix.d.ts +3 -0
  181. package/dist/libs/crud-pro/utils/sqlConvert/convertMix.js +22 -0
  182. package/dist/libs/crud-pro/utils/sqlConvert/convertMsSql.d.ts +2 -2
  183. package/dist/libs/crud-pro/utils/sqlConvert/convertMsSql.js +14 -11
  184. package/dist/libs/crud-pro/utils/sqlConvert/convertPgSql.d.ts +2 -2
  185. package/dist/libs/crud-pro/utils/sqlConvert/convertPgSql.js +14 -11
  186. package/dist/libs/crud-pro/utils/sqlConvert/convertPgType.d.ts +2 -2
  187. package/dist/libs/crud-pro/utils/sqlConvert/convertPgType.js +128 -128
  188. package/dist/libs/global-config/global-config.d.ts +69 -19
  189. package/dist/libs/global-config/global-config.js +36 -25
  190. package/dist/libs/utils/AsymmetricCrypto.d.ts +76 -0
  191. package/dist/libs/utils/AsymmetricCrypto.js +261 -0
  192. package/dist/libs/utils/base64.d.ts +9 -0
  193. package/dist/libs/utils/base64.js +42 -0
  194. package/dist/libs/utils/common-dto.d.ts +18 -18
  195. package/dist/libs/utils/common-dto.js +40 -40
  196. package/dist/libs/utils/crypto-utils.d.ts +3 -3
  197. package/dist/libs/utils/crypto-utils.js +46 -46
  198. package/dist/libs/utils/errorToString.d.ts +2 -0
  199. package/dist/libs/utils/errorToString.js +57 -0
  200. package/dist/libs/utils/fatcms-request.d.ts +30 -30
  201. package/dist/libs/utils/fatcms-request.js +104 -104
  202. package/dist/libs/utils/format-url.d.ts +2 -0
  203. package/dist/libs/utils/format-url.js +13 -0
  204. package/dist/libs/utils/functions.d.ts +5 -4
  205. package/dist/libs/utils/functions.js +72 -63
  206. package/dist/libs/utils/ordernum-utils.d.ts +2 -2
  207. package/dist/libs/utils/ordernum-utils.js +13 -13
  208. package/dist/libs/utils/parseConfig.d.ts +8 -7
  209. package/dist/libs/utils/parseConfig.js +47 -44
  210. package/dist/libs/utils/parseCreateSql.d.ts +10 -5
  211. package/dist/libs/utils/parseCreateSql.js +87 -86
  212. package/dist/libs/utils/render-utils.d.ts +37 -28
  213. package/dist/libs/utils/render-utils.js +154 -135
  214. package/dist/middleware/forbidden.middleware.d.ts +10 -10
  215. package/dist/middleware/forbidden.middleware.js +54 -70
  216. package/dist/middleware/global.middleware.d.ts +10 -10
  217. package/dist/middleware/global.middleware.js +273 -246
  218. package/dist/middleware/permission.middleware.d.ts +18 -18
  219. package/dist/middleware/permission.middleware.js +74 -74
  220. package/dist/middleware/rediscache.middleware.d.ts +3 -0
  221. package/dist/middleware/rediscache.middleware.js +77 -0
  222. package/dist/middleware/redislock.middleware.d.ts +7 -0
  223. package/dist/middleware/redislock.middleware.js +72 -0
  224. package/dist/middleware/tx.middleware.d.ts +9 -9
  225. package/dist/middleware/tx.middleware.js +40 -40
  226. package/dist/models/AsyncTaskModel.d.ts +74 -0
  227. package/dist/models/AsyncTaskModel.js +31 -0
  228. package/dist/models/RedisKeys.d.ts +15 -0
  229. package/dist/models/RedisKeys.js +18 -0
  230. package/dist/models/SystemEntities.d.ts +117 -98
  231. package/dist/models/SystemEntities.js +17 -2
  232. package/dist/models/SystemPerm.d.ts +95 -95
  233. package/dist/models/SystemPerm.js +100 -100
  234. package/dist/models/SystemTables.d.ts +25 -24
  235. package/dist/models/SystemTables.js +28 -27
  236. package/dist/models/WorkbenchInfoTools.d.ts +7 -0
  237. package/dist/models/WorkbenchInfoTools.js +20 -0
  238. package/dist/models/bizmodels.d.ts +132 -69
  239. package/dist/models/bizmodels.js +54 -34
  240. package/dist/models/contextLogger.d.ts +27 -25
  241. package/dist/models/contextLogger.js +119 -112
  242. package/dist/models/devops.d.ts +12 -12
  243. package/dist/models/devops.js +19 -19
  244. package/dist/models/userSession.d.ts +64 -61
  245. package/dist/models/userSession.js +167 -165
  246. package/dist/schedule/anonymousContext.d.ts +14 -0
  247. package/dist/schedule/anonymousContext.js +61 -0
  248. package/dist/schedule/index.d.ts +4 -3
  249. package/dist/schedule/index.js +10 -69
  250. package/dist/schedule/runSchedule.d.ts +12 -0
  251. package/dist/schedule/runSchedule.js +68 -0
  252. package/dist/schedule/scheduleNames.d.ts +13 -0
  253. package/dist/schedule/scheduleNames.js +17 -0
  254. package/dist/service/AuthService.d.ts +71 -70
  255. package/dist/service/AuthService.js +270 -251
  256. package/dist/service/EnumInfoService.d.ts +31 -30
  257. package/dist/service/EnumInfoService.js +120 -126
  258. package/dist/service/FileCenterService.d.ts +43 -43
  259. package/dist/service/FileCenterService.js +351 -351
  260. package/dist/service/SysAppService.d.ts +14 -0
  261. package/dist/service/SysAppService.js +96 -0
  262. package/dist/service/SysConfigService.d.ts +10 -7
  263. package/dist/service/SysConfigService.js +64 -47
  264. package/dist/service/UserAccountService.d.ts +23 -23
  265. package/dist/service/UserAccountService.js +107 -107
  266. package/dist/service/UserSessionService.d.ts +43 -16
  267. package/dist/service/UserSessionService.js +163 -85
  268. package/dist/service/VisitStatService.d.ts +14 -14
  269. package/dist/service/VisitStatService.js +158 -167
  270. package/dist/service/WorkbenchService.d.ts +59 -20
  271. package/dist/service/WorkbenchService.js +249 -155
  272. package/dist/service/anyapi/AnyApiSandboxService.d.ts +15 -15
  273. package/dist/service/anyapi/AnyApiSandboxService.js +122 -122
  274. package/dist/service/anyapi/AnyApiService.d.ts +27 -27
  275. package/dist/service/anyapi/AnyApiService.js +181 -181
  276. package/dist/service/asyncTask/AsyncTaskRunnerService.d.ts +50 -0
  277. package/dist/service/asyncTask/AsyncTaskRunnerService.js +287 -0
  278. package/dist/service/asyncTask/AsyncTaskService.d.ts +7 -0
  279. package/dist/service/asyncTask/AsyncTaskService.js +34 -0
  280. package/dist/service/asyncTask/handler/ExcelInfoModel.d.ts +10 -0
  281. package/dist/service/asyncTask/handler/ExcelInfoModel.js +2 -0
  282. package/dist/service/asyncTask/handler/ExportExcelAsyncTaskHandler.d.ts +7 -0
  283. package/dist/service/asyncTask/handler/ExportExcelAsyncTaskHandler.js +216 -0
  284. package/dist/service/asyncTask/handler/ExportExcelByInnerHttpHandler.d.ts +36 -0
  285. package/dist/service/asyncTask/handler/ExportExcelByInnerHttpHandler.js +141 -0
  286. package/dist/service/asyncTask/handler/ExportExcelByStdCrudHandler.d.ts +46 -0
  287. package/dist/service/asyncTask/handler/ExportExcelByStdCrudHandler.js +135 -0
  288. package/dist/service/base/ApiBaseService.d.ts +15 -15
  289. package/dist/service/base/ApiBaseService.js +50 -50
  290. package/dist/service/base/ApiRateLimiter.d.ts +10 -10
  291. package/dist/service/base/ApiRateLimiter.js +51 -51
  292. package/dist/service/base/BaseService.d.ts +41 -29
  293. package/dist/service/base/BaseService.js +101 -79
  294. package/dist/service/base/cache/CacheServiceFactory.d.ts +23 -0
  295. package/dist/service/base/cache/CacheServiceFactory.js +83 -0
  296. package/dist/service/base/cache/CtxCache.d.ts +18 -0
  297. package/dist/service/base/cache/CtxCache.js +37 -0
  298. package/dist/service/base/cache/DiskCache.d.ts +19 -0
  299. package/dist/service/base/cache/DiskCache.js +74 -0
  300. package/dist/service/base/cache/MemoryCache.d.ts +12 -0
  301. package/dist/service/base/cache/MemoryCache.js +58 -0
  302. package/dist/service/base/cache/NoneCache.d.ts +10 -0
  303. package/dist/service/base/cache/NoneCache.js +19 -0
  304. package/dist/service/base/cache/RedisCache.d.ts +14 -0
  305. package/dist/service/base/cache/RedisCache.js +31 -0
  306. package/dist/service/crudstd/CrudStdActionService.d.ts +17 -17
  307. package/dist/service/crudstd/CrudStdActionService.js +32 -32
  308. package/dist/service/crudstd/CrudStdConstant.d.ts +58 -58
  309. package/dist/service/crudstd/CrudStdConstant.js +64 -64
  310. package/dist/service/crudstd/CrudStdRelationService.d.ts +10 -10
  311. package/dist/service/crudstd/CrudStdRelationService.js +121 -85
  312. package/dist/service/crudstd/CrudStdService.d.ts +60 -50
  313. package/dist/service/crudstd/CrudStdService.js +376 -186
  314. package/dist/service/curd/CrudProQuick.d.ts +50 -0
  315. package/dist/service/curd/CrudProQuick.js +163 -0
  316. package/dist/service/curd/CurdMixByAccountService.d.ts +13 -9
  317. package/dist/service/curd/CurdMixByAccountService.js +151 -89
  318. package/dist/service/curd/CurdMixByDictService.d.ts +12 -13
  319. package/dist/service/curd/CurdMixByDictService.js +114 -113
  320. package/dist/service/curd/CurdMixByLinkToCustomService.d.ts +30 -22
  321. package/dist/service/curd/CurdMixByLinkToCustomService.js +202 -154
  322. package/dist/service/curd/CurdMixBySysConfigService.d.ts +13 -9
  323. package/dist/service/curd/CurdMixBySysConfigService.js +116 -80
  324. package/dist/service/curd/CurdMixByWorkbenchService.d.ts +11 -10
  325. package/dist/service/curd/CurdMixByWorkbenchService.js +80 -78
  326. package/dist/service/curd/CurdMixService.d.ts +28 -17
  327. package/dist/service/curd/CurdMixService.js +100 -76
  328. package/dist/service/curd/CurdMixUtils.d.ts +57 -28
  329. package/dist/service/curd/CurdMixUtils.js +331 -201
  330. package/dist/service/curd/CurdProService.d.ts +32 -39
  331. package/dist/service/curd/CurdProService.js +212 -322
  332. package/dist/service/curd/fixCfgModel.d.ts +3 -0
  333. package/dist/service/curd/fixCfgModel.js +104 -0
  334. package/dist/service/proxyapi/ProxyApiLoadService.d.ts +21 -21
  335. package/dist/service/proxyapi/ProxyApiLoadService.js +167 -167
  336. package/dist/service/proxyapi/ProxyApiService.d.ts +61 -60
  337. package/dist/service/proxyapi/ProxyApiService.js +294 -260
  338. package/dist/service/proxyapi/ProxyApiUtils.d.ts +15 -15
  339. package/dist/service/proxyapi/ProxyApiUtils.js +34 -34
  340. package/dist/service/proxyapi/RouteHandler.d.ts +5 -5
  341. package/dist/service/proxyapi/RouteHandler.js +9 -9
  342. package/dist/service/proxyapi/RouteTrie.d.ts +12 -12
  343. package/dist/service/proxyapi/RouteTrie.js +63 -63
  344. package/dist/service/proxyapi/WeightedRandom.d.ts +9 -9
  345. package/dist/service/proxyapi/WeightedRandom.js +31 -31
  346. package/dist/service/proxyapi/WeightedRoundRobin.d.ts +8 -8
  347. package/dist/service/proxyapi/WeightedRoundRobin.js +32 -32
  348. package/dist/views/404_app.html +31 -31
  349. package/dist/views/404_workbench.html +34 -34
  350. package/index.d.ts +10 -10
  351. package/package.json +87 -75
  352. package/src/config/config.default.ts +191 -203
  353. package/src/config/seed/aeskey.txt +1 -1
  354. package/src/config/utils.ts +22 -23
  355. package/src/configuration.ts +109 -83
  356. package/src/controller/base/BaseApiController.ts +209 -145
  357. package/src/controller/gateway/AnyApiGatewayController.ts +33 -33
  358. package/src/controller/gateway/AsyncTaskController.ts +157 -0
  359. package/src/controller/gateway/CrudMtdGatewayController.ts +116 -107
  360. package/src/controller/gateway/CrudStdGatewayController.ts +113 -101
  361. package/src/controller/gateway/DocGatewayController.ts +173 -173
  362. package/src/controller/gateway/FileController.ts +123 -110
  363. package/src/controller/gateway/ProxyApiGatewayController.ts +47 -47
  364. package/src/controller/gateway/PublicApiController.ts +179 -145
  365. package/src/controller/gateway/StaticController.ts +296 -328
  366. package/src/controller/helpers.controller.ts +161 -161
  367. package/src/controller/home.controller.ts +66 -69
  368. package/src/controller/manage/AnyApiMangeApi.ts +66 -66
  369. package/src/controller/manage/AppLogMangeApi.ts +53 -53
  370. package/src/controller/manage/AppMangeApi.ts +66 -53
  371. package/src/controller/manage/AppPageMangeApi.ts +52 -52
  372. package/src/controller/manage/AppSchemaHistoryApi.ts +49 -49
  373. package/src/controller/manage/CrudMethodsMangeApi.ts +49 -49
  374. package/src/controller/manage/CrudStandardDesignApi.ts +406 -398
  375. package/src/controller/manage/DataDictManageApi.ts +78 -78
  376. package/src/controller/manage/DeployManageApi.ts +175 -182
  377. package/src/controller/manage/DocLibManageApi.ts +69 -69
  378. package/src/controller/manage/DocManageApi.ts +99 -99
  379. package/src/controller/manage/FileManageApi.ts +45 -45
  380. package/src/controller/manage/LowCodeTplManageApi.ts +52 -52
  381. package/src/controller/manage/MenuManageApi.ts +58 -63
  382. package/src/controller/manage/ProxyApiMangeApi.ts +52 -52
  383. package/src/controller/manage/SuperAdminManageApi.ts +139 -147
  384. package/src/controller/manage/SysConfigMangeApi.ts +103 -98
  385. package/src/controller/manage/SystemInfoManageApi.ts +53 -48
  386. package/src/controller/manage/UserAccountManageApi.ts +122 -88
  387. package/src/controller/manage/WorkbenchMangeApi.ts +72 -72
  388. package/src/controller/myinfo/AuthController.ts +108 -174
  389. package/src/controller/myinfo/MyInfoController.ts +32 -32
  390. package/src/controller/render/AppRenderController.ts +72 -79
  391. package/src/controller/test.controller.ts +37 -37
  392. package/src/filter/default.filter.ts +13 -13
  393. package/src/filter/notfound.filter.ts +10 -10
  394. package/src/index.ts +108 -99
  395. package/src/interface.ts +33 -31
  396. package/src/libs/crud-pro/CrudPro.ts +165 -158
  397. package/src/libs/crud-pro/defaultConfigs.ts +15 -13
  398. package/src/libs/crud-pro/exceptions.ts +126 -124
  399. package/src/libs/crud-pro/interfaces.ts +194 -183
  400. package/src/libs/crud-pro/models/ExecuteContext.ts +120 -111
  401. package/src/libs/crud-pro/models/ExecuteContextFunc.ts +96 -86
  402. package/src/libs/crud-pro/models/FuncContext.ts +21 -21
  403. package/src/libs/crud-pro/models/RequestCfgModel.ts +141 -141
  404. package/src/libs/crud-pro/models/RequestModel.ts +141 -141
  405. package/src/libs/crud-pro/models/ResModel.ts +19 -0
  406. package/src/libs/crud-pro/models/ServiceHub.ts +32 -32
  407. package/src/libs/crud-pro/models/SqlCfgModel.ts +53 -52
  408. package/src/libs/crud-pro/models/SqlSegArg.ts +13 -13
  409. package/src/libs/crud-pro/models/Transaction.ts +81 -74
  410. package/src/libs/crud-pro/models/TransactionMySQL.ts +79 -79
  411. package/src/libs/crud-pro/models/TransactionPostgres.ts +91 -91
  412. package/src/libs/crud-pro/models/TransactionSqlServer.ts +102 -107
  413. package/src/libs/crud-pro/models/keys.ts +165 -159
  414. package/src/libs/crud-pro/services/CrudProCachedCfgService.ts +83 -75
  415. package/src/libs/crud-pro/services/CrudProExecuteFuncService.ts +145 -128
  416. package/src/libs/crud-pro/services/CrudProExecuteSqlService.ts +264 -279
  417. package/src/libs/crud-pro/services/CrudProFieldUpdateService.ts +60 -60
  418. package/src/libs/crud-pro/services/CrudProFieldValidateService.ts +180 -180
  419. package/src/libs/crud-pro/services/CrudProGenSqlCondition.ts +374 -373
  420. package/src/libs/crud-pro/services/CrudProGenSqlService.ts +185 -202
  421. package/src/libs/crud-pro/services/CrudProOriginToExecuteSql.ts +399 -397
  422. package/src/libs/crud-pro/services/CrudProServiceBase.ts +104 -98
  423. package/src/libs/crud-pro/services/CrudProTableMetaService.ts +86 -59
  424. package/src/libs/crud-pro/services/CurdProServiceHub.ts +92 -92
  425. package/src/libs/crud-pro/sql.txt +120 -120
  426. package/src/libs/crud-pro/utils/CompareUtils.ts +23 -23
  427. package/src/libs/crud-pro/utils/DatabaseName.ts +60 -40
  428. package/src/libs/crud-pro/utils/DateTimeUtils.ts +20 -20
  429. package/src/libs/crud-pro/utils/MemoryRefreshCache.ts +64 -64
  430. package/src/libs/crud-pro/utils/MessageParseUtils.ts +33 -33
  431. package/src/libs/crud-pro/utils/MixinUtils.ts +285 -285
  432. package/src/libs/crud-pro/utils/ModelUtils.ts +60 -55
  433. package/src/libs/crud-pro/utils/MultiKeyMap.ts +72 -72
  434. package/src/libs/crud-pro/utils/SqlFuncUtils.ts +29 -29
  435. package/src/libs/crud-pro/utils/TypeUtils.ts +188 -188
  436. package/src/libs/crud-pro/utils/ValidateUtils.ts +165 -167
  437. package/src/libs/crud-pro/utils/pool/MySQLUtils.ts +20 -20
  438. package/src/libs/crud-pro/utils/pool/PostgresUtils.ts +22 -22
  439. package/src/libs/crud-pro/utils/pool/SqlServerUtils.ts +22 -22
  440. package/src/libs/crud-pro/utils/sqlConvert/convertColumnName.ts +39 -26
  441. package/src/libs/crud-pro/utils/sqlConvert/convertMix.ts +24 -0
  442. package/src/libs/crud-pro/utils/sqlConvert/convertMsSql.ts +13 -11
  443. package/src/libs/crud-pro/utils/sqlConvert/convertPgSql.ts +14 -11
  444. package/src/libs/crud-pro/utils/sqlConvert/convertPgType.ts +127 -129
  445. package/src/libs/global-config/global-config.ts +108 -47
  446. package/src/libs/utils/AsymmetricCrypto.ts +310 -0
  447. package/src/libs/utils/base64.ts +40 -0
  448. package/src/libs/utils/common-dto.ts +52 -52
  449. package/src/libs/utils/crypto-utils.ts +50 -52
  450. package/src/libs/utils/errorToString.ts +61 -0
  451. package/src/libs/utils/fatcms-request.ts +103 -115
  452. package/src/libs/utils/format-url.ts +16 -0
  453. package/src/libs/utils/functions.ts +78 -67
  454. package/src/libs/utils/ordernum-utils.ts +14 -18
  455. package/src/libs/utils/parseConfig.ts +58 -62
  456. package/src/libs/utils/parseCreateSql.ts +91 -91
  457. package/src/libs/utils/render-utils.ts +216 -184
  458. package/src/middleware/forbidden.middleware.ts +52 -71
  459. package/src/middleware/global.middleware.ts +301 -278
  460. package/src/middleware/permission.middleware.ts +80 -81
  461. package/src/middleware/rediscache.middleware.ts +91 -0
  462. package/src/middleware/redislock.middleware.ts +83 -0
  463. package/src/middleware/tx.middleware.ts +30 -30
  464. package/src/models/AsyncTaskModel.ts +85 -0
  465. package/src/models/RedisKeys.ts +16 -0
  466. package/src/models/SystemEntities.ts +137 -115
  467. package/src/models/SystemPerm.ts +104 -105
  468. package/src/models/SystemTables.ts +26 -26
  469. package/src/models/WorkbenchInfoTools.ts +19 -0
  470. package/src/models/bizmodels.ts +163 -89
  471. package/src/models/contextLogger.ts +141 -132
  472. package/src/models/devops.ts +17 -17
  473. package/src/models/userSession.ts +221 -216
  474. package/src/schedule/anonymousContext.ts +75 -0
  475. package/src/schedule/index.ts +5 -73
  476. package/src/schedule/runSchedule.ts +74 -0
  477. package/src/schedule/scheduleNames.ts +15 -0
  478. package/src/service/AuthService.ts +299 -275
  479. package/src/service/EnumInfoService.ts +124 -134
  480. package/src/service/FileCenterService.ts +395 -400
  481. package/src/service/SysAppService.ts +88 -0
  482. package/src/service/SysConfigService.ts +51 -38
  483. package/src/service/UserAccountService.ts +107 -110
  484. package/src/service/UserSessionService.ts +163 -81
  485. package/src/service/VisitStatService.ts +166 -183
  486. package/src/service/WorkbenchService.ts +277 -165
  487. package/src/service/anyapi/AnyApiSandboxService.ts +121 -121
  488. package/src/service/anyapi/AnyApiService.ts +186 -189
  489. package/src/service/asyncTask/AsyncTaskRunnerService.ts +319 -0
  490. package/src/service/asyncTask/AsyncTaskService.ts +21 -0
  491. package/src/service/asyncTask/handler/ExcelInfoModel.ts +11 -0
  492. package/src/service/asyncTask/handler/ExportExcelAsyncTaskHandler.ts +245 -0
  493. package/src/service/asyncTask/handler/ExportExcelByInnerHttpHandler.ts +159 -0
  494. package/src/service/asyncTask/handler/ExportExcelByStdCrudHandler.ts +158 -0
  495. package/src/service/base/ApiBaseService.ts +42 -42
  496. package/src/service/base/ApiRateLimiter.ts +59 -59
  497. package/src/service/base/BaseService.ts +95 -74
  498. package/src/service/base/cache/CacheServiceFactory.ts +86 -0
  499. package/src/service/base/cache/CtxCache.ts +45 -0
  500. package/src/service/base/cache/DiskCache.ts +82 -0
  501. package/src/service/base/cache/MemoryCache.ts +68 -0
  502. package/src/service/base/cache/NoneCache.ts +24 -0
  503. package/src/service/base/cache/RedisCache.ts +41 -0
  504. package/src/service/crudstd/CrudStdActionService.ts +27 -27
  505. package/src/service/crudstd/CrudStdConstant.ts +62 -62
  506. package/src/service/crudstd/CrudStdRelationService.ts +131 -78
  507. package/src/service/crudstd/CrudStdService.ts +458 -198
  508. package/src/service/curd/CrudProQuick.ts +189 -0
  509. package/src/service/curd/CurdMixByAccountService.ts +161 -88
  510. package/src/service/curd/CurdMixByDictService.ts +115 -119
  511. package/src/service/curd/CurdMixByLinkToCustomService.ts +221 -167
  512. package/src/service/curd/CurdMixBySysConfigService.ts +121 -83
  513. package/src/service/curd/CurdMixByWorkbenchService.ts +71 -72
  514. package/src/service/curd/CurdMixService.ts +97 -65
  515. package/src/service/curd/CurdMixUtils.ts +383 -248
  516. package/src/service/curd/CurdProService.ts +231 -379
  517. package/src/service/curd/fixCfgModel.ts +120 -0
  518. package/src/service/proxyapi/ProxyApiLoadService.ts +170 -173
  519. package/src/service/proxyapi/ProxyApiService.ts +298 -262
  520. package/src/service/proxyapi/ProxyApiUtils.ts +32 -32
  521. package/src/service/proxyapi/RouteHandler.ts +8 -8
  522. package/src/service/proxyapi/RouteTrie.ts +74 -74
  523. package/src/service/proxyapi/WeightedRandom.ts +37 -37
  524. package/src/service/proxyapi/WeightedRoundRobin.ts +44 -44
  525. package/src/views/404_app.html +31 -31
  526. package/src/views/404_workbench.html +34 -34
  527. package/tsconfig.json +32 -0
  528. package/dist/service/base/RedisCacheService.d.ts +0 -13
  529. package/dist/service/base/RedisCacheService.js +0 -50
  530. package/src/service/base/RedisCacheService.ts +0 -38
@@ -0,0 +1,319 @@
1
+ import * as moment from 'moment';
2
+ import { Inject, Provide } from '@midwayjs/core';
3
+ import { Context, IMidwayKoaContext } from '@midwayjs/koa';
4
+ import { BaseService } from '@/service/base/BaseService';
5
+ import { IScheduleService } from '@/interface';
6
+ import { CurdProService } from '@/service/curd/CurdProService';
7
+ import { ISysAsyncTaskHandler, SysAsyncTaskEntity, SysAsyncTaskPartial, SysAsyncTaskStatus } from '@/models/AsyncTaskModel';
8
+ import { GLOBAL_STATIC_CONFIG } from '@/libs/global-config/global-config';
9
+ import { SystemTables } from '@/models/SystemTables';
10
+ import { KeysOfSimpleSQL } from '@/libs/crud-pro/models/keys';
11
+ import { errorToString } from '@/libs/utils/errorToString';
12
+ import { ANONYMOUS_CONTEXT } from '@/schedule';
13
+ import { RedisKeys } from '@/models/RedisKeys';
14
+ import { getCurrentFullMoment } from '@/libs/utils/functions';
15
+ import { ExportExcelAsyncTaskHandler } from './handler/ExportExcelAsyncTaskHandler';
16
+
17
+ const END_STATUS_LIST = [SysAsyncTaskStatus.PART_SUCCEEDED, SysAsyncTaskStatus.SUCCEEDED, SysAsyncTaskStatus.FAILED, SysAsyncTaskStatus.CANCELLED, SysAsyncTaskStatus.PAUSED];
18
+
19
+ class AsyncTaskRunner {
20
+ isBusy = false;
21
+ taskHandlerMap: Map<string, ISysAsyncTaskHandler> = new Map();
22
+
23
+ async executeTaskList(taskList: SysAsyncTaskEntity[]) {
24
+ if (!taskList || taskList.length === 0) {
25
+ return;
26
+ }
27
+
28
+ this.isBusy = true;
29
+
30
+ for (let i = 0; i < taskList.length; i++) {
31
+ const taskElement = taskList[i];
32
+ taskElement.task_status = SysAsyncTaskStatus.RUNNING;
33
+
34
+ try {
35
+ // 1. 更新当前这个任务的状态
36
+ await this.updateTaskStatus(taskElement, {
37
+ task_status: taskElement.task_status,
38
+ started_at: getCurrentFullMoment(),
39
+ updated_at: getCurrentFullMoment(),
40
+ });
41
+
42
+ // 任务状态的设置在自定义的执行器里面。
43
+ await this.executeTask(taskElement);
44
+
45
+ // 当前不是终止状态,并且没有异常就设置成成功。
46
+ if (!END_STATUS_LIST.includes(taskElement.task_status)) {
47
+ taskElement.task_status = SysAsyncTaskStatus.SUCCEEDED;
48
+ }
49
+ } catch (error) {
50
+ taskElement.task_status = SysAsyncTaskStatus.FAILED;
51
+ taskElement.error_message = errorToString(error);
52
+ }
53
+
54
+ try {
55
+ // 2. 更新当前这个任务的状态
56
+ await this.updateTaskStatus(taskElement, {
57
+ task_status: taskElement.task_status,
58
+ error_message: taskElement.error_message,
59
+ updated_at: getCurrentFullMoment(),
60
+ completed_at: getCurrentFullMoment(),
61
+ });
62
+ } catch (error) {
63
+ ANONYMOUS_CONTEXT.getApp().getCoreLogger().error('[AsyncTaskRunner] executeTaskList error', error);
64
+ }
65
+ }
66
+
67
+ this.isBusy = false;
68
+ }
69
+
70
+ private async executeTask(taskElement: SysAsyncTaskEntity) {
71
+ const taskType = taskElement.task_type;
72
+ const taskHandler = this.taskHandlerMap.get(taskType);
73
+ if (!taskHandler) {
74
+ throw new Error('TaskHandler not found , taskType = ' + taskType);
75
+ }
76
+ const updateTaskStatus = (updatePartials: SysAsyncTaskPartial) => {
77
+ return this.updateTaskStatus(taskElement, updatePartials);
78
+ };
79
+ await taskHandler.execute({ task: taskElement, updateTaskStatus });
80
+ }
81
+
82
+ /**
83
+ * 更新任务状态或任务进度
84
+ * @param taskElement
85
+ * @param updatePartials
86
+ * @private
87
+ */
88
+ private async updateTaskStatus(taskElement: SysAsyncTaskEntity, updatePartials: SysAsyncTaskPartial) {
89
+ if (!updatePartials) {
90
+ throw new Error('updatePartials not found');
91
+ }
92
+ return await ANONYMOUS_CONTEXT.runServiceAtAnonymousContext(async (ctx: IMidwayKoaContext) => {
93
+ const curdProService: CurdProService = await ctx.requestContext.getAsync('curdProService');
94
+ const { SystemDbName, SystemDbType } = GLOBAL_STATIC_CONFIG.getConfig();
95
+
96
+ // 一定要有一个更新时间字段
97
+ updatePartials.updated_at = getCurrentFullMoment();
98
+
99
+ const res = await curdProService.executeCrudByCfg(
100
+ {
101
+ condition: {
102
+ id: taskElement.id,
103
+ },
104
+ data: updatePartials,
105
+ },
106
+ {
107
+ sqlTable: SystemTables.sys_async_tasks,
108
+ sqlSimpleName: KeysOfSimpleSQL.SIMPLE_UPDATE,
109
+ sqlDatabase: SystemDbName,
110
+ sqlDbType: SystemDbType,
111
+ }
112
+ );
113
+ return res.getResModel().affected;
114
+ });
115
+ }
116
+
117
+ /**
118
+ * 获取当前进程可以处理的任务类型。
119
+ */
120
+ public getHandlerTaskTypeList(): string[] {
121
+ const keys = this.taskHandlerMap.keys();
122
+ return [...keys];
123
+ }
124
+ }
125
+
126
+ /**
127
+ * 业务可以扩展
128
+ */
129
+ export const ASYNC_TASK_RUNNER = new AsyncTaskRunner();
130
+
131
+ //内置的异步任务处理器:EXCEL导出
132
+ ASYNC_TASK_RUNNER.taskHandlerMap.set('EXCEL_EXPORT', new ExportExcelAsyncTaskHandler());
133
+
134
+ /**
135
+ * Redis锁
136
+ */
137
+ const ASYNC_TASK_LOCK = RedisKeys.ASYNC_TASK_LOCK;
138
+ const ASYNC_TASK_TIMEOUT_LOCK = RedisKeys.ASYNC_TASK_TIMEOUT_LOCK;
139
+
140
+ /**
141
+ * 上次检查异步任务的时间点
142
+ */
143
+ const ASYNC_TASK_RUNTIME_OBJ = {
144
+ LAST_CHECK_ASYNC_TASK_UPDATE_TIME: 0,
145
+ };
146
+
147
+ @Provide()
148
+ export class AsyncTaskRunnerService extends BaseService implements IScheduleService {
149
+ @Inject()
150
+ protected ctx: Context;
151
+
152
+ @Inject()
153
+ private curdProService: CurdProService;
154
+
155
+ /**
156
+ * 定时任务执行
157
+ */
158
+ async runBySchedule() {
159
+ await this.runByScheduleForPendingTasks();
160
+ await this.runByScheduleForTimeoutTasks();
161
+ }
162
+
163
+ /**
164
+ * 更新超时的任务状态
165
+ * @returns
166
+ */
167
+ private async runByScheduleForTimeoutTasks() {
168
+ const { SystemDbName, SystemDbType } = GLOBAL_STATIC_CONFIG.getConfig();
169
+
170
+ // 每隔一小时执行一次,即可。
171
+ const lock = await this.redisService.set(ASYNC_TASK_TIMEOUT_LOCK, 1, 'EX', 60 * 60, 'NX');
172
+ if (lock !== 'OK') {
173
+ return Promise.resolve();
174
+ }
175
+
176
+ const timeoutTime = moment().subtract(24, 'hours').format('YYYY-MM-DD HH:mm:ss.SSS');
177
+ await this.curdProService.executeCrudByCfg(
178
+ {
179
+ condition: {
180
+ task_status: SysAsyncTaskStatus.RUNNING, // 虽然状态是RUNNING,但是已经超过24小时没有进展了。
181
+ updated_at: {
182
+ $lt: timeoutTime,
183
+ },
184
+ },
185
+ data: {
186
+ task_status: SysAsyncTaskStatus.FAILED,
187
+ error_message: '任务超时',
188
+ },
189
+ },
190
+ {
191
+ sqlTable: SystemTables.sys_async_tasks,
192
+ sqlSimpleName: KeysOfSimpleSQL.SIMPLE_UPDATE,
193
+ sqlDatabase: SystemDbName,
194
+ sqlDbType: SystemDbType,
195
+ }
196
+ );
197
+ }
198
+
199
+ /**
200
+ * 检查是否有新任务。如果有,就从数据库中获取一批任务,放到自己的任务队列里。
201
+ * @returns
202
+ */
203
+ private async runByScheduleForPendingTasks() {
204
+ // 1. 当前很忙
205
+ if (ASYNC_TASK_RUNNER.isBusy) {
206
+ return Promise.resolve();
207
+ }
208
+
209
+ // 2. 发现了新任务
210
+ const isExistNewTask = await this.isExistNewTask();
211
+ if (!isExistNewTask) {
212
+ return Promise.resolve();
213
+ }
214
+
215
+ // 这里的过期时间1分钟即可。fetchPendingTasks函数不可能超过一分钟。
216
+ // 因为这里只是从数据库中获取一批任务,放到自己的任务队列里。还没触发执行。
217
+ const lock = await this.redisService.set(ASYNC_TASK_LOCK, 1, 'EX', 60, 'NX');
218
+ if (lock !== 'OK') {
219
+ return Promise.resolve();
220
+ }
221
+
222
+ try {
223
+ await this.fetchPendingTasks();
224
+ } catch (e) {
225
+ console.error('[AsyncTaskRunnerService] fetchPendingTasks error', errorToString(e));
226
+ }
227
+
228
+ await this.redisService.del(ASYNC_TASK_LOCK);
229
+
230
+ return Promise.resolve();
231
+ }
232
+
233
+ async fetchPendingTasks(): Promise<void> {
234
+ const { SystemDbName, SystemDbType } = GLOBAL_STATIC_CONFIG.getConfig();
235
+
236
+ // 只获取本进程能够处理的任务类型。
237
+ const taskTypeList = ASYNC_TASK_RUNNER.getHandlerTaskTypeList();
238
+ if (taskTypeList.length === 0) {
239
+ return Promise.resolve();
240
+ }
241
+
242
+ // 查询等待处理的任务。
243
+ const queryRes = await this.curdProService.executeCrudByCfg(
244
+ {
245
+ condition: {
246
+ task_status: SysAsyncTaskStatus.PENDING,
247
+ task_type: {
248
+ $in: taskTypeList,
249
+ },
250
+ },
251
+ orderBy: 'id+',
252
+ limit: 10,
253
+ },
254
+ {
255
+ sqlTable: SystemTables.sys_async_tasks,
256
+ sqlSimpleName: KeysOfSimpleSQL.SIMPLE_QUERY_PAGE,
257
+ sqlDatabase: SystemDbName,
258
+ sqlDbType: SystemDbType,
259
+ }
260
+ );
261
+
262
+ const taskList = queryRes.getResRows();
263
+
264
+ if (taskList.length === 0) {
265
+ return Promise.resolve();
266
+ }
267
+ const taskIds = taskList.map(elem => elem.id).filter(Boolean);
268
+
269
+ // 将状态更新为处理中。防止其它进程重复处理。
270
+ await this.curdProService.executeCrudByCfg(
271
+ {
272
+ condition: {
273
+ id: {
274
+ $in: taskIds,
275
+ },
276
+ },
277
+ data: {
278
+ task_status: SysAsyncTaskStatus.RUNNING,
279
+ },
280
+ },
281
+ {
282
+ sqlTable: SystemTables.sys_async_tasks,
283
+ sqlSimpleName: KeysOfSimpleSQL.SIMPLE_UPDATE,
284
+ sqlDatabase: SystemDbName,
285
+ sqlDbType: SystemDbType,
286
+ }
287
+ );
288
+
289
+ // 开始执行。
290
+ await ASYNC_TASK_RUNNER.executeTaskList(taskList).then(() => {
291
+ console.log('[AsyncTaskRunnerService] ASYNC_TASK_RUNNER finished taskIds ==> ' + JSON.stringify(taskIds));
292
+ });
293
+ }
294
+
295
+ /**
296
+ * 是否存在新任务
297
+ * @private
298
+ */
299
+ private async isExistNewTask(): Promise<boolean> {
300
+ // 刚启动,没有检查过。
301
+ if (!ASYNC_TASK_RUNTIME_OBJ.LAST_CHECK_ASYNC_TASK_UPDATE_TIME) {
302
+ ASYNC_TASK_RUNTIME_OBJ.LAST_CHECK_ASYNC_TASK_UPDATE_TIME = Date.now();
303
+ return true;
304
+ }
305
+
306
+ //Redis没有任何内容
307
+ const updateTime = await this.redisService.get(RedisKeys.ASYNC_TASK_UPDATE_TIME);
308
+ if (!updateTime) {
309
+ ASYNC_TASK_RUNTIME_OBJ.LAST_CHECK_ASYNC_TASK_UPDATE_TIME = Date.now();
310
+ return false;
311
+ }
312
+
313
+ const updateTimeNumber = Number.parseInt(updateTime, 10);
314
+
315
+ const isExistNewTask: boolean = updateTimeNumber > ASYNC_TASK_RUNTIME_OBJ.LAST_CHECK_ASYNC_TASK_UPDATE_TIME;
316
+ ASYNC_TASK_RUNTIME_OBJ.LAST_CHECK_ASYNC_TASK_UPDATE_TIME = updateTimeNumber;
317
+ return isExistNewTask;
318
+ }
319
+ }
@@ -0,0 +1,21 @@
1
+ import { Inject, Provide } from '@midwayjs/core';
2
+ import { Context } from '@midwayjs/koa';
3
+ import { BaseService } from '@/service/base/BaseService';
4
+ import { runScheduleTaskOnce } from '@/schedule';
5
+ import { INNER_SCHEDULE_NAMES } from '@/schedule/scheduleNames';
6
+ import { RedisKeys } from '@/models/RedisKeys';
7
+
8
+ @Provide()
9
+ export class AsyncTaskService extends BaseService {
10
+ @Inject()
11
+ protected ctx: Context;
12
+
13
+ async startTask() {
14
+ await this.redisService.set(RedisKeys.ASYNC_TASK_UPDATE_TIME, `${Date.now()}`);
15
+ runScheduleTaskOnce(INNER_SCHEDULE_NAMES.asyncTaskRunnerService).then(schedule => {
16
+ console.log(schedule);
17
+ });
18
+ }
19
+
20
+ async cancelTask(id: number) {}
21
+ }
@@ -0,0 +1,11 @@
1
+ export interface IExcelHeaderInfo {
2
+ title: string;
3
+ dataIndex: string;
4
+ }
5
+
6
+ export interface IExcelAsyncTaskHandler {
7
+ getExcelHeader(): Promise<IExcelHeaderInfo[]>;
8
+ getPageSize(): Promise<number>;
9
+ getTotalCount(): Promise<number>;
10
+ getExcelDataList(pageNo: number, pageSize: number): Promise<any[]>;
11
+ }
@@ -0,0 +1,245 @@
1
+ import { IMidwayKoaContext } from '@midwayjs/koa';
2
+ import { ISysAsyncTaskHandler, SysAsyncTaskContext, SysAsyncTaskStatus } from '@/models/AsyncTaskModel';
3
+ import { ANONYMOUS_CONTEXT } from '@/schedule';
4
+ import { IExcelHeaderInfo, IExcelAsyncTaskHandler } from './ExcelInfoModel';
5
+ import { SysAsyncFileFormat } from '@/models/AsyncTaskModel';
6
+ import { ExportExcelByStdCrudHandler } from './ExportExcelByStdCrudHandler';
7
+ import { ExportExcelByInnerHttpHandler } from './ExportExcelByInnerHttpHandler';
8
+ import { IStdCrudExportInputParams, StdCrudExportInputParamsAppType } from '@/models/bizmodels';
9
+
10
+ import * as _ from 'lodash';
11
+ import * as fastcsv from 'fast-csv';
12
+ import * as fs from 'node:fs';
13
+ import * as fs2 from 'node:fs/promises';
14
+ import * as path from 'node:path';
15
+ import { parseJsonObject } from '@/libs/utils/functions';
16
+ import { UserSessionInfo } from '@/models/userSession';
17
+ import { errorToString } from '@/libs/utils/errorToString';
18
+
19
+ const indexRef = { current: 0 };
20
+
21
+ async function createFileFolder(distFileFolder: string) {
22
+ try {
23
+ await fs2.access(distFileFolder);
24
+ } catch (e) {
25
+ await fs2.mkdir(distFileFolder, { recursive: true });
26
+ }
27
+ }
28
+
29
+ function getExcelAsyncTaskHandler(asyncTaskContext: SysAsyncTaskContext, ctx: IMidwayKoaContext): IExcelAsyncTaskHandler {
30
+ const inputParams: IStdCrudExportInputParams = parseJsonObject(asyncTaskContext?.task?.input_params);
31
+ if (inputParams && inputParams.appType === StdCrudExportInputParamsAppType.STD_CRUD) {
32
+ return new ExportExcelByStdCrudHandler(asyncTaskContext, inputParams, ctx);
33
+ }
34
+ if (inputParams && inputParams.appType === StdCrudExportInputParamsAppType.INNER_HTTP) {
35
+ return new ExportExcelByInnerHttpHandler(asyncTaskContext, inputParams, ctx);
36
+ }
37
+ throw new Error('[getExcelAsyncTaskHandler]appType不支持;appType = ' + inputParams.appType);
38
+ }
39
+
40
+ /**
41
+ * 多实例,每个任务一个实例。
42
+ * 导出EXCEL异步任务:
43
+ */
44
+ class ExportExcelAsyncTask {
45
+ protected asyncTaskContext: SysAsyncTaskContext;
46
+ protected ctx: IMidwayKoaContext;
47
+ protected headerColumns: IExcelHeaderInfo[];
48
+ protected excelAsyncTaskHandler: IExcelAsyncTaskHandler;
49
+
50
+ constructor(asyncTaskContext: SysAsyncTaskContext, ctx: IMidwayKoaContext) {
51
+ this.asyncTaskContext = asyncTaskContext;
52
+ this.ctx = ctx;
53
+ this.excelAsyncTaskHandler = getExcelAsyncTaskHandler(asyncTaskContext, ctx);
54
+ }
55
+
56
+ private getDistFileFolder() {
57
+ const app = ANONYMOUS_CONTEXT.getApp();
58
+ const config = app.getConfig();
59
+ const fatcmsExportExcelTmpFilePath = config.fatcmsExportExcelTmpFilePath;
60
+ if (!fatcmsExportExcelTmpFilePath) {
61
+ return path.join(__dirname, '../../tmp');
62
+ }
63
+ return fatcmsExportExcelTmpFilePath;
64
+ }
65
+
66
+ async executeWithContext() {
67
+ const taskElement = this.asyncTaskContext.task;
68
+ const taskId = _.get(this.asyncTaskContext, 'task.id');
69
+
70
+ this.ctx.logger.info('[ExportExcelAsyncTask] executeWithContext start, taskId=' + taskId);
71
+
72
+ const pageSize = await this.excelAsyncTaskHandler.getPageSize();
73
+
74
+ const fileName = await this.getExcelFileName(); // 文件名
75
+ const distFileFolder = this.getDistFileFolder();
76
+ await createFileFolder(distFileFolder);
77
+ const diskFilePath = path.resolve(distFileFolder, fileName); // 磁盘文件路径
78
+
79
+ const totalCount = await this.getTotalCount();
80
+
81
+ await this.asyncTaskContext.updateTaskStatus({
82
+ output_total_records: totalCount,
83
+ output_file_format: SysAsyncFileFormat.CSV,
84
+ output_file_path: diskFilePath,
85
+ });
86
+
87
+ this.headerColumns = await this.getExcelHeader();
88
+
89
+ const ws = fs.createWriteStream(diskFilePath, {
90
+ encoding: 'utf-8',
91
+ });
92
+
93
+ const csvStream = fastcsv.format({ writeHeaders: false, headers: false, delimiter: ',' });
94
+ csvStream.pipe(ws);
95
+ csvStream.write('\ufeff'); // 写入BOM头,解决中文乱码问题
96
+
97
+ csvStream.write(this.formatToCsvHeader(this.headerColumns));
98
+
99
+ let processed_records = 0;
100
+
101
+ try {
102
+ if (typeof totalCount === 'number' && totalCount > 0) {
103
+ const batchCount = Math.ceil(totalCount / pageSize);
104
+ for (let i = 0; i < batchCount; i++) {
105
+ const num = await this.writeExcelBatchData(csvStream, i + 1, pageSize);
106
+ processed_records = processed_records + num;
107
+ const progress = Math.round((processed_records / totalCount) * 100);
108
+ await this.asyncTaskContext.updateTaskStatus({
109
+ processed_records,
110
+ progress,
111
+ });
112
+ }
113
+ }
114
+
115
+ taskElement.task_status = SysAsyncTaskStatus.SUCCEEDED;
116
+ } catch (error) {
117
+ taskElement.task_status = SysAsyncTaskStatus.FAILED;
118
+ taskElement.error_message = errorToString(error);
119
+ const progress = Math.round((processed_records / totalCount) * 100);
120
+ await this.asyncTaskContext.updateTaskStatus({
121
+ processed_records,
122
+ progress,
123
+ task_status: taskElement.task_status,
124
+ error_message: taskElement.error_message,
125
+ });
126
+ }
127
+
128
+ csvStream.end();
129
+ ws.on('finish', async () => {
130
+ this.ctx.logger.info('[ExportExcelAsyncTask] executeWithContext finish, taskId=' + taskId);
131
+ const fsStat = await fs2.stat(diskFilePath);
132
+ const output_file_size = fsStat.size;
133
+ this.asyncTaskContext.updateTaskStatus({
134
+ output_file_size,
135
+ });
136
+ });
137
+ this.ctx.logger.info('[ExportExcelAsyncTask] executeWithContext end, taskId=' + taskId);
138
+ }
139
+
140
+ private formatToCsvHeader(headerColumns: IExcelHeaderInfo[]): string[] {
141
+ return headerColumns.map(item => {
142
+ return item.title;
143
+ });
144
+ }
145
+
146
+ private async writeExcelBatchData(csvStream: fastcsv.CsvFormatterStream<any, any>, pageNo: number, pageSize: number): Promise<number> {
147
+ const dataList: any[] = await this.getExcelDataList(pageNo, pageSize);
148
+ for (let i = 0; i < dataList.length; i++) {
149
+ const csvRow = this.formatToCsvRow(dataList[i]);
150
+ csvStream.write(csvRow);
151
+ }
152
+ return dataList.length;
153
+ }
154
+
155
+ private formatToCsvRow(rowObj: any): string[] {
156
+ return this.headerColumns.map(obj => {
157
+ const dataIndex = obj.dataIndex;
158
+ const value = _.get(rowObj, dataIndex);
159
+ if (typeof value === 'undefined' || value === null) {
160
+ return '';
161
+ }
162
+ if (typeof value !== 'string') {
163
+ // boolean , number
164
+ return '' + value;
165
+ }
166
+ return value;
167
+ });
168
+ }
169
+
170
+ /**
171
+ * 获取文件名
172
+ * @returns 文件名
173
+ */
174
+ private async getExcelFileName() {
175
+ indexRef.current = indexRef.current + 1;
176
+ if (indexRef.current > 100000) {
177
+ indexRef.current = 1;
178
+ }
179
+ const num = `${indexRef.current}`.padStart(10, '0');
180
+ return `export_${Date.now()}_${num}.csv`;
181
+ }
182
+
183
+ /**
184
+ * 获取Excel的表头
185
+ * @returns
186
+ */
187
+ private async getExcelHeader(): Promise<IExcelHeaderInfo[]> {
188
+ return this.excelAsyncTaskHandler.getExcelHeader();
189
+ // const inputParams = parseJsonObject(this.asyncTaskContext?.task?.input_params);
190
+ // if (inputParams && inputParams.appType === 'STD_CRUD') {
191
+ // // const appCode = inputParams.appCode;
192
+ // console.log(this)
193
+ // }
194
+ // return [
195
+ // { title: 'ID', dataIndex: 'id' },
196
+ // { title: '姓名', dataIndex: 'name' },
197
+ // { title: '邮箱', dataIndex: 'email' }
198
+ // ]
199
+ }
200
+
201
+ /**
202
+ * 获取文件总数
203
+ */
204
+ private async getTotalCount(): Promise<number> {
205
+ const totalCount = await this.excelAsyncTaskHandler.getTotalCount();
206
+ // 最多导出10万条数据
207
+ return Math.min(totalCount, 10 * 10000);
208
+ }
209
+
210
+ /**
211
+ * 获取数据内容数组
212
+ * @param pageNo 当前页号,从1开始
213
+ * @param pageSize 每页获取的数量。
214
+ */
215
+ private async getExcelDataList(pageNo: number, pageSize: number): Promise<any[]> {
216
+ return this.excelAsyncTaskHandler.getExcelDataList(pageNo, pageSize);
217
+ // const dataList = [];
218
+ // for (var i = 0; i < pageSize; i++) {
219
+ // dataList.push({ id: i, name: 'nmae' + i, email: 'www.dss@dd.dom' })
220
+ // }
221
+ // return dataList;
222
+ }
223
+ }
224
+
225
+ /**
226
+ * 单例
227
+ */
228
+ export class ExportExcelAsyncTaskHandler implements ISysAsyncTaskHandler {
229
+ public async execute(asyncTaskContext: SysAsyncTaskContext): Promise<any> {
230
+ const taskId = _.get(asyncTaskContext, 'task.id');
231
+
232
+ console.log('[ExportExcelAsyncTaskHandler] execute, taskId=>' + taskId);
233
+
234
+ const res = await ANONYMOUS_CONTEXT.runServiceAtAnonymousContext(async (ctx: IMidwayKoaContext) => {
235
+ const createdUserSession = parseJsonObject(asyncTaskContext?.task?.created_user_session);
236
+ ctx.userSession = new UserSessionInfo(createdUserSession, false);
237
+ const task = new ExportExcelAsyncTask(asyncTaskContext, ctx);
238
+ return task.executeWithContext();
239
+ });
240
+ if (res.error) {
241
+ throw res.error;
242
+ }
243
+ return res.result;
244
+ }
245
+ }