midway-fatcms 0.0.1-beta.6 → 0.0.1-beta.61

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 (500) 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 +160 -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 +37 -31
  12. package/dist/controller/base/BaseApiController.js +164 -138
  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 +38 -38
  20. package/dist/controller/gateway/CrudStdGatewayController.js +129 -137
  21. package/dist/controller/gateway/DocGatewayController.d.ts +27 -27
  22. package/dist/controller/gateway/DocGatewayController.js +179 -174
  23. package/dist/controller/gateway/FileController.d.ts +26 -25
  24. package/dist/controller/gateway/FileController.js +129 -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 +31 -27
  28. package/dist/controller/gateway/PublicApiController.js +179 -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 +10 -10
  40. package/dist/controller/manage/AppMangeApi.js +88 -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 -176
  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 -149
  67. package/dist/controller/manage/SysConfigMangeApi.d.ts +11 -11
  68. package/dist/controller/manage/SysConfigMangeApi.js +126 -124
  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 +14 -14
  72. package/dist/controller/manage/UserAccountManageApi.js +129 -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 +11 -11
  80. package/dist/controller/render/AppRenderController.js +92 -85
  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 +103 -93
  88. package/dist/index.js +121 -111
  89. package/dist/interface.d.ts +27 -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 +104 -104
  96. package/dist/libs/crud-pro/exceptions.js +117 -117
  97. package/dist/libs/crud-pro/interfaces.d.ts +163 -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 +22 -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 +106 -106
  126. package/dist/libs/crud-pro/models/keys.js +149 -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 +112 -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 +340 -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 +334 -333
  143. package/dist/libs/crud-pro/services/CrudProServiceBase.d.ts +24 -28
  144. package/dist/libs/crud-pro/services/CrudProServiceBase.js +90 -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 +49 -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 +21 -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 +11 -11
  184. package/dist/libs/crud-pro/utils/sqlConvert/convertPgSql.d.ts +2 -2
  185. package/dist/libs/crud-pro/utils/sqlConvert/convertPgSql.js +11 -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 -0
  189. package/dist/libs/global-config/global-config.js +36 -0
  190. package/dist/libs/utils/base64.d.ts +9 -0
  191. package/dist/libs/utils/base64.js +42 -0
  192. package/dist/libs/utils/common-dto.d.ts +18 -18
  193. package/dist/libs/utils/common-dto.js +40 -40
  194. package/dist/libs/utils/crypto-utils.d.ts +3 -3
  195. package/dist/libs/utils/crypto-utils.js +46 -46
  196. package/dist/libs/utils/errorToString.d.ts +2 -0
  197. package/dist/libs/utils/errorToString.js +57 -0
  198. package/dist/libs/utils/fatcms-request.d.ts +30 -30
  199. package/dist/libs/utils/fatcms-request.js +104 -104
  200. package/dist/libs/utils/functions.d.ts +5 -4
  201. package/dist/libs/utils/functions.js +72 -63
  202. package/dist/libs/utils/ordernum-utils.d.ts +2 -2
  203. package/dist/libs/utils/ordernum-utils.js +13 -13
  204. package/dist/libs/utils/parseConfig.d.ts +7 -7
  205. package/dist/libs/utils/parseConfig.js +44 -44
  206. package/dist/libs/utils/parseCreateSql.d.ts +10 -5
  207. package/dist/libs/utils/parseCreateSql.js +87 -86
  208. package/dist/libs/utils/render-utils.d.ts +28 -28
  209. package/dist/libs/utils/render-utils.js +133 -135
  210. package/dist/middleware/forbidden.middleware.d.ts +10 -10
  211. package/dist/middleware/forbidden.middleware.js +54 -70
  212. package/dist/middleware/global.middleware.d.ts +10 -10
  213. package/dist/middleware/global.middleware.js +266 -246
  214. package/dist/middleware/permission.middleware.d.ts +18 -18
  215. package/dist/middleware/permission.middleware.js +74 -74
  216. package/dist/middleware/rediscache.middleware.d.ts +3 -0
  217. package/dist/middleware/rediscache.middleware.js +77 -0
  218. package/dist/middleware/redislock.middleware.d.ts +7 -0
  219. package/dist/middleware/redislock.middleware.js +72 -0
  220. package/dist/middleware/tx.middleware.d.ts +9 -9
  221. package/dist/middleware/tx.middleware.js +40 -40
  222. package/dist/models/AsyncTaskModel.d.ts +74 -0
  223. package/dist/models/AsyncTaskModel.js +31 -0
  224. package/dist/models/RedisKeys.d.ts +15 -0
  225. package/dist/models/RedisKeys.js +18 -0
  226. package/dist/models/SystemEntities.d.ts +105 -98
  227. package/dist/models/SystemEntities.js +9 -2
  228. package/dist/models/SystemPerm.d.ts +95 -95
  229. package/dist/models/SystemPerm.js +100 -100
  230. package/dist/models/SystemTables.d.ts +25 -27
  231. package/dist/models/SystemTables.js +28 -30
  232. package/dist/models/bizmodels.d.ts +99 -69
  233. package/dist/models/bizmodels.js +39 -34
  234. package/dist/models/contextLogger.d.ts +25 -25
  235. package/dist/models/contextLogger.js +112 -112
  236. package/dist/models/devops.d.ts +12 -12
  237. package/dist/models/devops.js +19 -19
  238. package/dist/models/userSession.d.ts +62 -61
  239. package/dist/models/userSession.js +165 -165
  240. package/dist/schedule/anonymousContext.d.ts +14 -0
  241. package/dist/schedule/anonymousContext.js +59 -0
  242. package/dist/schedule/index.d.ts +4 -3
  243. package/dist/schedule/index.js +10 -69
  244. package/dist/schedule/runSchedule.d.ts +12 -0
  245. package/dist/schedule/runSchedule.js +68 -0
  246. package/dist/schedule/scheduleNames.d.ts +13 -0
  247. package/dist/schedule/scheduleNames.js +17 -0
  248. package/dist/service/AuthService.d.ts +71 -70
  249. package/dist/service/AuthService.js +259 -248
  250. package/dist/service/EnumInfoService.d.ts +30 -30
  251. package/dist/service/EnumInfoService.js +127 -123
  252. package/dist/service/FileCenterService.d.ts +43 -43
  253. package/dist/service/FileCenterService.js +351 -347
  254. package/dist/service/SysConfigService.d.ts +7 -7
  255. package/dist/service/SysConfigService.js +47 -45
  256. package/dist/service/UserAccountService.d.ts +23 -23
  257. package/dist/service/UserAccountService.js +107 -103
  258. package/dist/service/UserSessionService.d.ts +38 -16
  259. package/dist/service/UserSessionService.js +157 -85
  260. package/dist/service/VisitStatService.d.ts +14 -14
  261. package/dist/service/VisitStatService.js +158 -165
  262. package/dist/service/WorkbenchService.d.ts +53 -20
  263. package/dist/service/WorkbenchService.js +211 -153
  264. package/dist/service/anyapi/AnyApiSandboxService.d.ts +15 -15
  265. package/dist/service/anyapi/AnyApiSandboxService.js +122 -122
  266. package/dist/service/anyapi/AnyApiService.d.ts +27 -27
  267. package/dist/service/anyapi/AnyApiService.js +181 -179
  268. package/dist/service/asyncTask/AsyncTaskRunnerService.d.ts +50 -0
  269. package/dist/service/asyncTask/AsyncTaskRunnerService.js +287 -0
  270. package/dist/service/asyncTask/AsyncTaskService.d.ts +7 -0
  271. package/dist/service/asyncTask/AsyncTaskService.js +34 -0
  272. package/dist/service/asyncTask/handler/ExcelInfoModel.d.ts +10 -0
  273. package/dist/service/asyncTask/handler/ExcelInfoModel.js +2 -0
  274. package/dist/service/asyncTask/handler/ExportExcelAsyncTaskHandler.d.ts +7 -0
  275. package/dist/service/asyncTask/handler/ExportExcelAsyncTaskHandler.js +216 -0
  276. package/dist/service/asyncTask/handler/ExportExcelByInnerHttpHandler.d.ts +36 -0
  277. package/dist/service/asyncTask/handler/ExportExcelByInnerHttpHandler.js +141 -0
  278. package/dist/service/asyncTask/handler/ExportExcelByStdCrudHandler.d.ts +46 -0
  279. package/dist/service/asyncTask/handler/ExportExcelByStdCrudHandler.js +135 -0
  280. package/dist/service/base/ApiBaseService.d.ts +15 -15
  281. package/dist/service/base/ApiBaseService.js +50 -50
  282. package/dist/service/base/ApiRateLimiter.d.ts +10 -10
  283. package/dist/service/base/ApiRateLimiter.js +51 -51
  284. package/dist/service/base/BaseService.d.ts +41 -29
  285. package/dist/service/base/BaseService.js +101 -79
  286. package/dist/service/base/RedisCacheService.d.ts +20 -13
  287. package/dist/service/base/RedisCacheService.js +57 -50
  288. package/dist/service/crudstd/CrudStdActionService.d.ts +17 -17
  289. package/dist/service/crudstd/CrudStdActionService.js +32 -32
  290. package/dist/service/crudstd/CrudStdConstant.d.ts +58 -58
  291. package/dist/service/crudstd/CrudStdConstant.js +64 -64
  292. package/dist/service/crudstd/CrudStdRelationService.d.ts +10 -10
  293. package/dist/service/crudstd/CrudStdRelationService.js +112 -85
  294. package/dist/service/crudstd/CrudStdService.d.ts +69 -50
  295. package/dist/service/crudstd/CrudStdService.js +392 -182
  296. package/dist/service/curd/CrudProQuick.d.ts +44 -0
  297. package/dist/service/curd/CrudProQuick.js +147 -0
  298. package/dist/service/curd/CurdMixByAccountService.d.ts +9 -9
  299. package/dist/service/curd/CurdMixByAccountService.js +92 -87
  300. package/dist/service/curd/CurdMixByDictService.d.ts +13 -13
  301. package/dist/service/curd/CurdMixByDictService.js +114 -111
  302. package/dist/service/curd/CurdMixByLinkToCustomService.d.ts +31 -22
  303. package/dist/service/curd/CurdMixByLinkToCustomService.js +203 -154
  304. package/dist/service/curd/CurdMixBySysConfigService.d.ts +9 -9
  305. package/dist/service/curd/CurdMixBySysConfigService.js +80 -78
  306. package/dist/service/curd/CurdMixByWorkbenchService.d.ts +10 -10
  307. package/dist/service/curd/CurdMixByWorkbenchService.js +78 -76
  308. package/dist/service/curd/CurdMixService.d.ts +28 -17
  309. package/dist/service/curd/CurdMixService.js +100 -76
  310. package/dist/service/curd/CurdMixUtils.d.ts +51 -28
  311. package/dist/service/curd/CurdMixUtils.js +277 -201
  312. package/dist/service/curd/CurdProService.d.ts +32 -39
  313. package/dist/service/curd/CurdProService.js +212 -322
  314. package/dist/service/curd/fixCfgModel.d.ts +3 -0
  315. package/dist/service/curd/fixCfgModel.js +104 -0
  316. package/dist/service/proxyapi/ProxyApiLoadService.d.ts +21 -21
  317. package/dist/service/proxyapi/ProxyApiLoadService.js +167 -164
  318. package/dist/service/proxyapi/ProxyApiService.d.ts +61 -60
  319. package/dist/service/proxyapi/ProxyApiService.js +294 -260
  320. package/dist/service/proxyapi/ProxyApiUtils.d.ts +15 -15
  321. package/dist/service/proxyapi/ProxyApiUtils.js +34 -34
  322. package/dist/service/proxyapi/RouteHandler.d.ts +5 -5
  323. package/dist/service/proxyapi/RouteHandler.js +9 -9
  324. package/dist/service/proxyapi/RouteTrie.d.ts +12 -12
  325. package/dist/service/proxyapi/RouteTrie.js +63 -63
  326. package/dist/service/proxyapi/WeightedRandom.d.ts +9 -9
  327. package/dist/service/proxyapi/WeightedRandom.js +31 -31
  328. package/dist/service/proxyapi/WeightedRoundRobin.d.ts +8 -8
  329. package/dist/service/proxyapi/WeightedRoundRobin.js +32 -32
  330. package/dist/views/404_app.html +31 -31
  331. package/dist/views/404_workbench.html +34 -34
  332. package/index.d.ts +10 -10
  333. package/package.json +87 -75
  334. package/src/config/config.default.ts +179 -203
  335. package/src/config/seed/aeskey.txt +1 -1
  336. package/src/config/utils.ts +22 -23
  337. package/src/configuration.ts +109 -83
  338. package/src/controller/base/BaseApiController.ts +170 -145
  339. package/src/controller/gateway/AnyApiGatewayController.ts +33 -33
  340. package/src/controller/gateway/AsyncTaskController.ts +157 -0
  341. package/src/controller/gateway/CrudMtdGatewayController.ts +116 -107
  342. package/src/controller/gateway/CrudStdGatewayController.ts +87 -101
  343. package/src/controller/gateway/DocGatewayController.ts +173 -165
  344. package/src/controller/gateway/FileController.ts +109 -110
  345. package/src/controller/gateway/ProxyApiGatewayController.ts +47 -47
  346. package/src/controller/gateway/PublicApiController.ts +157 -145
  347. package/src/controller/gateway/StaticController.ts +296 -328
  348. package/src/controller/helpers.controller.ts +161 -161
  349. package/src/controller/home.controller.ts +66 -71
  350. package/src/controller/manage/AnyApiMangeApi.ts +66 -66
  351. package/src/controller/manage/AppLogMangeApi.ts +53 -53
  352. package/src/controller/manage/AppMangeApi.ts +53 -53
  353. package/src/controller/manage/AppPageMangeApi.ts +52 -52
  354. package/src/controller/manage/AppSchemaHistoryApi.ts +49 -49
  355. package/src/controller/manage/CrudMethodsMangeApi.ts +49 -49
  356. package/src/controller/manage/CrudStandardDesignApi.ts +406 -398
  357. package/src/controller/manage/DataDictManageApi.ts +78 -78
  358. package/src/controller/manage/DeployManageApi.ts +175 -179
  359. package/src/controller/manage/DocLibManageApi.ts +69 -69
  360. package/src/controller/manage/DocManageApi.ts +99 -99
  361. package/src/controller/manage/FileManageApi.ts +45 -45
  362. package/src/controller/manage/LowCodeTplManageApi.ts +52 -52
  363. package/src/controller/manage/MenuManageApi.ts +58 -63
  364. package/src/controller/manage/ProxyApiMangeApi.ts +52 -52
  365. package/src/controller/manage/SuperAdminManageApi.ts +139 -138
  366. package/src/controller/manage/SysConfigMangeApi.ts +95 -95
  367. package/src/controller/manage/SystemInfoManageApi.ts +53 -48
  368. package/src/controller/manage/UserAccountManageApi.ts +94 -88
  369. package/src/controller/manage/WorkbenchMangeApi.ts +72 -72
  370. package/src/controller/myinfo/AuthController.ts +108 -174
  371. package/src/controller/myinfo/MyInfoController.ts +32 -32
  372. package/src/controller/render/AppRenderController.ts +81 -76
  373. package/src/controller/test.controller.ts +37 -37
  374. package/src/filter/default.filter.ts +13 -13
  375. package/src/filter/notfound.filter.ts +10 -10
  376. package/src/index.ts +107 -99
  377. package/src/interface.ts +31 -31
  378. package/src/libs/crud-pro/CrudPro.ts +165 -158
  379. package/src/libs/crud-pro/defaultConfigs.ts +15 -13
  380. package/src/libs/crud-pro/exceptions.ts +124 -124
  381. package/src/libs/crud-pro/interfaces.ts +190 -183
  382. package/src/libs/crud-pro/models/ExecuteContext.ts +120 -111
  383. package/src/libs/crud-pro/models/ExecuteContextFunc.ts +96 -86
  384. package/src/libs/crud-pro/models/FuncContext.ts +21 -21
  385. package/src/libs/crud-pro/models/RequestCfgModel.ts +141 -141
  386. package/src/libs/crud-pro/models/RequestModel.ts +141 -141
  387. package/src/libs/crud-pro/models/ResModel.ts +19 -0
  388. package/src/libs/crud-pro/models/ServiceHub.ts +32 -32
  389. package/src/libs/crud-pro/models/SqlCfgModel.ts +52 -52
  390. package/src/libs/crud-pro/models/SqlSegArg.ts +13 -13
  391. package/src/libs/crud-pro/models/Transaction.ts +81 -74
  392. package/src/libs/crud-pro/models/TransactionMySQL.ts +79 -79
  393. package/src/libs/crud-pro/models/TransactionPostgres.ts +91 -91
  394. package/src/libs/crud-pro/models/TransactionSqlServer.ts +102 -107
  395. package/src/libs/crud-pro/models/keys.ts +159 -159
  396. package/src/libs/crud-pro/services/CrudProCachedCfgService.ts +83 -75
  397. package/src/libs/crud-pro/services/CrudProExecuteFuncService.ts +128 -128
  398. package/src/libs/crud-pro/services/CrudProExecuteSqlService.ts +262 -279
  399. package/src/libs/crud-pro/services/CrudProFieldUpdateService.ts +60 -60
  400. package/src/libs/crud-pro/services/CrudProFieldValidateService.ts +180 -180
  401. package/src/libs/crud-pro/services/CrudProGenSqlCondition.ts +354 -373
  402. package/src/libs/crud-pro/services/CrudProGenSqlService.ts +185 -202
  403. package/src/libs/crud-pro/services/CrudProOriginToExecuteSql.ts +393 -397
  404. package/src/libs/crud-pro/services/CrudProServiceBase.ts +106 -98
  405. package/src/libs/crud-pro/services/CrudProTableMetaService.ts +86 -59
  406. package/src/libs/crud-pro/services/CurdProServiceHub.ts +92 -92
  407. package/src/libs/crud-pro/sql.txt +120 -120
  408. package/src/libs/crud-pro/utils/CompareUtils.ts +23 -23
  409. package/src/libs/crud-pro/utils/DatabaseName.ts +60 -40
  410. package/src/libs/crud-pro/utils/DateTimeUtils.ts +20 -20
  411. package/src/libs/crud-pro/utils/MemoryRefreshCache.ts +64 -64
  412. package/src/libs/crud-pro/utils/MessageParseUtils.ts +33 -33
  413. package/src/libs/crud-pro/utils/MixinUtils.ts +285 -285
  414. package/src/libs/crud-pro/utils/ModelUtils.ts +55 -55
  415. package/src/libs/crud-pro/utils/MultiKeyMap.ts +72 -72
  416. package/src/libs/crud-pro/utils/SqlFuncUtils.ts +29 -29
  417. package/src/libs/crud-pro/utils/TypeUtils.ts +188 -188
  418. package/src/libs/crud-pro/utils/ValidateUtils.ts +165 -167
  419. package/src/libs/crud-pro/utils/pool/MySQLUtils.ts +20 -20
  420. package/src/libs/crud-pro/utils/pool/PostgresUtils.ts +22 -22
  421. package/src/libs/crud-pro/utils/pool/SqlServerUtils.ts +22 -22
  422. package/src/libs/crud-pro/utils/sqlConvert/convertColumnName.ts +21 -26
  423. package/src/libs/crud-pro/utils/sqlConvert/convertMix.ts +24 -0
  424. package/src/libs/crud-pro/utils/sqlConvert/convertMsSql.ts +9 -11
  425. package/src/libs/crud-pro/utils/sqlConvert/convertPgSql.ts +9 -11
  426. package/src/libs/crud-pro/utils/sqlConvert/convertPgType.ts +127 -129
  427. package/src/libs/global-config/global-config.ts +108 -0
  428. package/src/libs/utils/base64.ts +40 -0
  429. package/src/libs/utils/common-dto.ts +52 -52
  430. package/src/libs/utils/crypto-utils.ts +50 -52
  431. package/src/libs/utils/errorToString.ts +61 -0
  432. package/src/libs/utils/fatcms-request.ts +103 -115
  433. package/src/libs/utils/functions.ts +78 -67
  434. package/src/libs/utils/ordernum-utils.ts +14 -18
  435. package/src/libs/utils/parseConfig.ts +54 -62
  436. package/src/libs/utils/parseCreateSql.ts +91 -91
  437. package/src/libs/utils/render-utils.ts +175 -184
  438. package/src/middleware/forbidden.middleware.ts +52 -71
  439. package/src/middleware/global.middleware.ts +293 -278
  440. package/src/middleware/permission.middleware.ts +80 -81
  441. package/src/middleware/rediscache.middleware.ts +91 -0
  442. package/src/middleware/redislock.middleware.ts +83 -0
  443. package/src/middleware/tx.middleware.ts +30 -30
  444. package/src/models/AsyncTaskModel.ts +85 -0
  445. package/src/models/RedisKeys.ts +16 -0
  446. package/src/models/SystemEntities.ts +123 -115
  447. package/src/models/SystemPerm.ts +104 -105
  448. package/src/models/SystemTables.ts +26 -30
  449. package/src/models/bizmodels.ts +121 -89
  450. package/src/models/contextLogger.ts +132 -132
  451. package/src/models/devops.ts +17 -17
  452. package/src/models/userSession.ts +217 -216
  453. package/src/schedule/anonymousContext.ts +73 -0
  454. package/src/schedule/index.ts +5 -73
  455. package/src/schedule/runSchedule.ts +74 -0
  456. package/src/schedule/scheduleNames.ts +15 -0
  457. package/src/service/AuthService.ts +283 -270
  458. package/src/service/EnumInfoService.ts +130 -129
  459. package/src/service/FileCenterService.ts +395 -394
  460. package/src/service/SysConfigService.ts +37 -34
  461. package/src/service/UserAccountService.ts +107 -100
  462. package/src/service/UserSessionService.ts +157 -81
  463. package/src/service/VisitStatService.ts +166 -179
  464. package/src/service/WorkbenchService.ts +220 -160
  465. package/src/service/anyapi/AnyApiSandboxService.ts +121 -121
  466. package/src/service/anyapi/AnyApiService.ts +186 -184
  467. package/src/service/asyncTask/AsyncTaskRunnerService.ts +319 -0
  468. package/src/service/asyncTask/AsyncTaskService.ts +21 -0
  469. package/src/service/asyncTask/handler/ExcelInfoModel.ts +11 -0
  470. package/src/service/asyncTask/handler/ExportExcelAsyncTaskHandler.ts +245 -0
  471. package/src/service/asyncTask/handler/ExportExcelByInnerHttpHandler.ts +159 -0
  472. package/src/service/asyncTask/handler/ExportExcelByStdCrudHandler.ts +158 -0
  473. package/src/service/base/ApiBaseService.ts +42 -42
  474. package/src/service/base/ApiRateLimiter.ts +59 -59
  475. package/src/service/base/BaseService.ts +95 -74
  476. package/src/service/base/RedisCacheService.ts +42 -38
  477. package/src/service/crudstd/CrudStdActionService.ts +27 -27
  478. package/src/service/crudstd/CrudStdConstant.ts +62 -62
  479. package/src/service/crudstd/CrudStdRelationService.ts +118 -78
  480. package/src/service/crudstd/CrudStdService.ts +477 -188
  481. package/src/service/curd/CrudProQuick.ts +170 -0
  482. package/src/service/curd/CurdMixByAccountService.ts +89 -83
  483. package/src/service/curd/CurdMixByDictService.ts +114 -113
  484. package/src/service/curd/CurdMixByLinkToCustomService.ts +219 -167
  485. package/src/service/curd/CurdMixBySysConfigService.ts +78 -78
  486. package/src/service/curd/CurdMixByWorkbenchService.ts +71 -68
  487. package/src/service/curd/CurdMixService.ts +97 -65
  488. package/src/service/curd/CurdMixUtils.ts +314 -248
  489. package/src/service/curd/CurdProService.ts +231 -379
  490. package/src/service/curd/fixCfgModel.ts +120 -0
  491. package/src/service/proxyapi/ProxyApiLoadService.ts +170 -165
  492. package/src/service/proxyapi/ProxyApiService.ts +298 -262
  493. package/src/service/proxyapi/ProxyApiUtils.ts +32 -32
  494. package/src/service/proxyapi/RouteHandler.ts +8 -8
  495. package/src/service/proxyapi/RouteTrie.ts +74 -74
  496. package/src/service/proxyapi/WeightedRandom.ts +37 -37
  497. package/src/service/proxyapi/WeightedRoundRobin.ts +44 -44
  498. package/src/views/404_app.html +31 -31
  499. package/src/views/404_workbench.html +34 -34
  500. package/tsconfig.json +32 -0
@@ -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
+ }