midway-fatcms 0.0.1-beta.13 → 0.0.1-beta.16

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 (86) hide show
  1. package/README.md +7 -0
  2. package/dist/configuration.d.ts +1 -0
  3. package/dist/configuration.js +21 -8
  4. package/dist/controller/base/BaseApiController.d.ts +1 -1
  5. package/dist/controller/gateway/AsyncTaskController.js +17 -6
  6. package/dist/controller/gateway/CrudMtdGatewayController.d.ts +3 -3
  7. package/dist/controller/gateway/CrudMtdGatewayController.js +5 -5
  8. package/dist/index.d.ts +7 -0
  9. package/dist/index.js +7 -0
  10. package/dist/libs/crud-pro/CrudPro.d.ts +1 -0
  11. package/dist/libs/crud-pro/CrudPro.js +5 -0
  12. package/dist/libs/crud-pro/defaultConfigs.js +2 -0
  13. package/dist/libs/crud-pro/interfaces.d.ts +6 -0
  14. package/dist/libs/crud-pro/models/ExecuteContext.d.ts +2 -1
  15. package/dist/libs/crud-pro/models/ExecuteContextFunc.d.ts +8 -1
  16. package/dist/libs/crud-pro/models/ExecuteContextFunc.js +8 -0
  17. package/dist/libs/crud-pro/models/ResModel.d.ts +16 -0
  18. package/dist/libs/crud-pro/models/ResModel.js +2 -0
  19. package/dist/libs/crud-pro/services/CrudProCachedCfgService.d.ts +1 -0
  20. package/dist/libs/crud-pro/services/CrudProCachedCfgService.js +22 -11
  21. package/dist/libs/crud-pro/services/CrudProServiceBase.d.ts +2 -6
  22. package/dist/libs/crud-pro/services/CrudProServiceBase.js +3 -2
  23. package/dist/libs/crud-pro/services/CrudProTableMetaService.d.ts +1 -0
  24. package/dist/libs/crud-pro/services/CrudProTableMetaService.js +31 -7
  25. package/dist/libs/crud-pro/utils/DatabaseName.js +24 -3
  26. package/dist/libs/global-config/global-config.d.ts +6 -0
  27. package/dist/libs/global-config/global-config.js +1 -0
  28. package/dist/models/AsyncTaskModel.d.ts +13 -11
  29. package/dist/models/AsyncTaskModel.js +23 -23
  30. package/dist/schedule/anonymousContext.d.ts +13 -0
  31. package/dist/schedule/anonymousContext.js +59 -0
  32. package/dist/schedule/index.d.ts +4 -4
  33. package/dist/schedule/index.js +9 -68
  34. package/dist/schedule/runSchedule.d.ts +6 -0
  35. package/dist/schedule/runSchedule.js +34 -0
  36. package/dist/schedule/scheduleNames.d.ts +8 -0
  37. package/dist/schedule/scheduleNames.js +17 -0
  38. package/dist/service/asyncTask/AsyncTaskRunnerService.d.ts +14 -0
  39. package/dist/service/asyncTask/AsyncTaskRunnerService.js +66 -16
  40. package/dist/service/asyncTask/AsyncTaskService.js +2 -1
  41. package/dist/service/crudstd/CrudStdService.d.ts +1 -0
  42. package/dist/service/crudstd/CrudStdService.js +27 -0
  43. package/dist/service/curd/CrudProQuick.d.ts +24 -0
  44. package/dist/service/curd/CrudProQuick.js +105 -0
  45. package/dist/service/curd/CurdMixByLinkToCustomService.d.ts +10 -1
  46. package/dist/service/curd/CurdMixByLinkToCustomService.js +71 -23
  47. package/dist/service/curd/CurdMixService.d.ts +1 -1
  48. package/dist/service/curd/CurdMixService.js +2 -2
  49. package/dist/service/curd/CurdMixUtils.js +35 -28
  50. package/dist/service/curd/CurdProService.d.ts +2 -10
  51. package/dist/service/curd/CurdProService.js +28 -143
  52. package/dist/service/curd/fixCfgModel.d.ts +3 -0
  53. package/dist/service/curd/fixCfgModel.js +107 -0
  54. package/package.json +1 -1
  55. package/src/configuration.ts +30 -10
  56. package/src/controller/gateway/AnyApiGatewayController.ts +1 -1
  57. package/src/controller/gateway/AsyncTaskController.ts +21 -8
  58. package/src/controller/gateway/CrudMtdGatewayController.ts +5 -5
  59. package/src/controller/manage/DocManageApi.ts +5 -5
  60. package/src/index.ts +7 -0
  61. package/src/libs/crud-pro/CrudPro.ts +8 -0
  62. package/src/libs/crud-pro/defaultConfigs.ts +2 -0
  63. package/src/libs/crud-pro/interfaces.ts +10 -1
  64. package/src/libs/crud-pro/models/ExecuteContext.ts +5 -2
  65. package/src/libs/crud-pro/models/ExecuteContextFunc.ts +12 -1
  66. package/src/libs/crud-pro/models/ResModel.ts +24 -0
  67. package/src/libs/crud-pro/services/CrudProCachedCfgService.ts +26 -17
  68. package/src/libs/crud-pro/services/CrudProServiceBase.ts +5 -8
  69. package/src/libs/crud-pro/services/CrudProTableMetaService.ts +43 -9
  70. package/src/libs/crud-pro/utils/DatabaseName.ts +35 -15
  71. package/src/libs/global-config/global-config.ts +12 -1
  72. package/src/models/AsyncTaskModel.ts +14 -11
  73. package/src/schedule/anonymousContext.ts +79 -0
  74. package/src/schedule/index.ts +13 -72
  75. package/src/schedule/runSchedule.ts +35 -0
  76. package/src/schedule/scheduleNames.ts +20 -0
  77. package/src/service/asyncTask/AsyncTaskRunnerService.ts +91 -24
  78. package/src/service/asyncTask/AsyncTaskService.ts +3 -2
  79. package/src/service/base/BaseService.ts +2 -2
  80. package/src/service/crudstd/CrudStdService.ts +34 -6
  81. package/src/service/curd/CrudProQuick.ts +137 -0
  82. package/src/service/curd/CurdMixByLinkToCustomService.ts +100 -49
  83. package/src/service/curd/CurdMixService.ts +3 -3
  84. package/src/service/curd/CurdMixUtils.ts +51 -38
  85. package/src/service/curd/CurdProService.ts +42 -186
  86. package/src/service/curd/fixCfgModel.ts +139 -0
@@ -4,14 +4,14 @@ export interface SysAsyncTaskEntity {
4
4
  task_name: string;
5
5
  task_description: string | null;
6
6
  task_type: string;
7
- task_status: TaskStatus;
7
+ task_status: SysAsyncTaskStatus;
8
8
  input_params: any;
9
9
  output_result: any | null;
10
10
  input_file_path: string | null;
11
- input_file_format: FileFormat | null;
11
+ input_file_format: SysAsyncFileFormat | null;
12
12
  input_file_size: number | null;
13
13
  output_file_path: string | null;
14
- output_file_format: FileFormat | null;
14
+ output_file_format: SysAsyncFileFormat | null;
15
15
  output_file_size: number | null;
16
16
  input_total_records: number | null;
17
17
  output_total_records: number | null;
@@ -26,11 +26,12 @@ export interface SysAsyncTaskEntity {
26
26
  parent_task_id: number | null;
27
27
  created_at: Date;
28
28
  started_at: Date | null;
29
- completed_at: Date | null;
30
29
  updated_at: Date;
31
30
  expired_at: Date | null;
31
+ completed_at: Date | null;
32
+ created_user_session: string;
32
33
  }
33
- export declare enum TaskStatus {
34
+ export declare enum SysAsyncTaskStatus {
34
35
  PENDING = "PENDING",
35
36
  RUNNING = "RUNNING",
36
37
  SUCCEEDED = "SUCCEEDED",
@@ -38,7 +39,7 @@ export declare enum TaskStatus {
38
39
  CANCELLED = "CANCELLED",
39
40
  PAUSED = "PAUSED"
40
41
  }
41
- export declare enum FileFormat {
42
+ export declare enum SysAsyncFileFormat {
42
43
  XLSX = "xlsx",
43
44
  CSV = "csv",
44
45
  JSON = "json",
@@ -50,15 +51,16 @@ export declare enum FileFormat {
50
51
  PNG = "png",
51
52
  JPG = "jpg"
52
53
  }
53
- export interface ITaskHandler {
54
- execute(ctx: TaskContext): Promise<void>;
54
+ export interface ISysAsyncTaskHandler {
55
+ execute(asyncTaskContext: SysAsyncTaskContext): Promise<void>;
55
56
  }
56
- export interface TaskContext {
57
+ export interface SysAsyncTaskContext {
57
58
  task: SysAsyncTaskEntity;
59
+ updateTaskStatus: () => any;
58
60
  }
59
- export interface TaskHandlerConfig {
61
+ export interface SysAsyncTaskHandlerConfig {
60
62
  taskType: string;
61
- handler: ITaskHandler;
63
+ handler: ISysAsyncTaskHandler;
62
64
  maxRetries?: number;
63
65
  priority?: number;
64
66
  expireSeconds?: number;
@@ -1,25 +1,25 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.FileFormat = exports.TaskStatus = void 0;
4
- var TaskStatus;
5
- (function (TaskStatus) {
6
- TaskStatus["PENDING"] = "PENDING";
7
- TaskStatus["RUNNING"] = "RUNNING";
8
- TaskStatus["SUCCEEDED"] = "SUCCEEDED";
9
- TaskStatus["FAILED"] = "FAILED";
10
- TaskStatus["CANCELLED"] = "CANCELLED";
11
- TaskStatus["PAUSED"] = "PAUSED";
12
- })(TaskStatus = exports.TaskStatus || (exports.TaskStatus = {}));
13
- var FileFormat;
14
- (function (FileFormat) {
15
- FileFormat["XLSX"] = "xlsx";
16
- FileFormat["CSV"] = "csv";
17
- FileFormat["JSON"] = "json";
18
- FileFormat["PDF"] = "pdf";
19
- FileFormat["TXT"] = "txt";
20
- FileFormat["XML"] = "xml";
21
- FileFormat["ZIP"] = "zip";
22
- FileFormat["HTML"] = "html";
23
- FileFormat["PNG"] = "png";
24
- FileFormat["JPG"] = "jpg";
25
- })(FileFormat = exports.FileFormat || (exports.FileFormat = {}));
3
+ exports.SysAsyncFileFormat = exports.SysAsyncTaskStatus = void 0;
4
+ var SysAsyncTaskStatus;
5
+ (function (SysAsyncTaskStatus) {
6
+ SysAsyncTaskStatus["PENDING"] = "PENDING";
7
+ SysAsyncTaskStatus["RUNNING"] = "RUNNING";
8
+ SysAsyncTaskStatus["SUCCEEDED"] = "SUCCEEDED";
9
+ SysAsyncTaskStatus["FAILED"] = "FAILED";
10
+ SysAsyncTaskStatus["CANCELLED"] = "CANCELLED";
11
+ SysAsyncTaskStatus["PAUSED"] = "PAUSED";
12
+ })(SysAsyncTaskStatus = exports.SysAsyncTaskStatus || (exports.SysAsyncTaskStatus = {}));
13
+ var SysAsyncFileFormat;
14
+ (function (SysAsyncFileFormat) {
15
+ SysAsyncFileFormat["XLSX"] = "xlsx";
16
+ SysAsyncFileFormat["CSV"] = "csv";
17
+ SysAsyncFileFormat["JSON"] = "json";
18
+ SysAsyncFileFormat["PDF"] = "pdf";
19
+ SysAsyncFileFormat["TXT"] = "txt";
20
+ SysAsyncFileFormat["XML"] = "xml";
21
+ SysAsyncFileFormat["ZIP"] = "zip";
22
+ SysAsyncFileFormat["HTML"] = "html";
23
+ SysAsyncFileFormat["PNG"] = "png";
24
+ SysAsyncFileFormat["JPG"] = "jpg";
25
+ })(SysAsyncFileFormat = exports.SysAsyncFileFormat || (exports.SysAsyncFileFormat = {}));
@@ -0,0 +1,13 @@
1
+ import * as koa from '@midwayjs/koa';
2
+ export declare type RunServiceAtAnonymousContextRunner = (ctx: koa.IMidwayKoaContext) => any;
3
+ declare class AnonymousContext {
4
+ private app;
5
+ setApp(app: koa.Application): void;
6
+ getApp(): koa.IMidwayKoaApplication;
7
+ runServiceAtAnonymousContext(runner: RunServiceAtAnonymousContextRunner): Promise<{
8
+ result: any;
9
+ error: any;
10
+ }>;
11
+ }
12
+ declare const ANONYMOUS_CONTEXT: AnonymousContext;
13
+ export { ANONYMOUS_CONTEXT };
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ANONYMOUS_CONTEXT = void 0;
4
+ const contextLogger_1 = require("../models/contextLogger");
5
+ const Transaction_1 = require("../libs/crud-pro/models/Transaction");
6
+ const userSession_1 = require("../models/userSession");
7
+ const anonymousUserInfo = {
8
+ nickName: 'anonymous_user',
9
+ avatar: '',
10
+ roleCodes: [],
11
+ functionCodes: [],
12
+ loginName: 'anonymous_user',
13
+ sessionId: '',
14
+ accountId: '',
15
+ workbenchCode: '',
16
+ accountType: userSession_1.SYS_ACCOUNT_TYPE,
17
+ };
18
+ const anonymousWorkbenchInfo = {
19
+ id: 0,
20
+ workbench_code: 'anonymous_workbench',
21
+ workbench_name: 'anonymous_workbench',
22
+ workbench_domain: 'anonymous_workbench',
23
+ workbench_desc: 'anonymous_workbench',
24
+ html_content: 'anonymous_workbench',
25
+ status: 1,
26
+ workbench_type: 0,
27
+ };
28
+ class AnonymousContext {
29
+ setApp(app) {
30
+ this.app = app;
31
+ }
32
+ getApp() {
33
+ return this.app;
34
+ }
35
+ async runServiceAtAnonymousContext(runner) {
36
+ const app = this.app;
37
+ const ctx = app.createAnonymousContext();
38
+ ctx.app = app;
39
+ ctx.contextLogger = new contextLogger_1.ContextLogger(ctx);
40
+ ctx.transaction = new Transaction_1.Transaction();
41
+ ctx.userSession = new userSession_1.UserSessionInfo(anonymousUserInfo, true);
42
+ ctx.workbenchInfo = anonymousWorkbenchInfo;
43
+ let result = null;
44
+ let error = null;
45
+ try {
46
+ result = await runner(ctx);
47
+ }
48
+ catch (e) {
49
+ error = e;
50
+ ctx.logger.error(`runServiceAtAnonymousContext error `, e);
51
+ }
52
+ finally {
53
+ await ctx.transaction.releaseTx();
54
+ }
55
+ return { result: result, error: error };
56
+ }
57
+ }
58
+ const ANONYMOUS_CONTEXT = new AnonymousContext();
59
+ exports.ANONYMOUS_CONTEXT = ANONYMOUS_CONTEXT;
@@ -1,4 +1,4 @@
1
- import * as koa from '@midwayjs/koa';
2
- declare function runSchedule(app: koa.Application, serviceList: string[]): Promise<void>;
3
- declare function startSchedule(app: koa.Application, serviceList: string[]): Promise<void>;
4
- export { startSchedule, runSchedule };
1
+ import { startScheduleLoop, runScheduleTaskOnce } from './runSchedule';
2
+ import { ANONYMOUS_CONTEXT } from './anonymousContext';
3
+ import { ALL_SCHEDULE_NAMES, SCHEDULE_NAMES } from './scheduleNames';
4
+ export { ALL_SCHEDULE_NAMES, SCHEDULE_NAMES, ANONYMOUS_CONTEXT, startScheduleLoop, runScheduleTaskOnce };
@@ -1,70 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.runSchedule = exports.startSchedule = void 0;
4
- const contextLogger_1 = require("../models/contextLogger");
5
- const Transaction_1 = require("../libs/crud-pro/models/Transaction");
6
- const userSession_1 = require("../models/userSession");
7
- const scheduleUserInfo = {
8
- nickName: 'schedule_user',
9
- avatar: '',
10
- roleCodes: [],
11
- functionCodes: [],
12
- loginName: 'schedule_user',
13
- sessionId: '',
14
- accountId: '',
15
- workbenchCode: '',
16
- accountType: userSession_1.SYS_ACCOUNT_TYPE,
17
- };
18
- const scheduleWorkbenchInfo = {
19
- id: 0,
20
- workbench_code: 'schedule_workbench',
21
- workbench_name: 'schedule_workbench',
22
- workbench_domain: 'schedule_workbench',
23
- workbench_desc: 'schedule_workbench',
24
- html_content: 'schedule_workbench',
25
- status: 1,
26
- workbench_type: 0,
27
- };
28
- async function runScheduleService(app, serviceName) {
29
- const ctx = app.createAnonymousContext();
30
- ctx.app = app;
31
- ctx.contextLogger = new contextLogger_1.ContextLogger(ctx);
32
- ctx.transaction = new Transaction_1.Transaction();
33
- ctx.userSession = new userSession_1.UserSessionInfo(scheduleUserInfo, true);
34
- ctx.workbenchInfo = scheduleWorkbenchInfo;
35
- try {
36
- const serviceObject = await ctx.requestContext.getAsync(serviceName);
37
- if (serviceObject && serviceObject.runBySchedule) {
38
- await serviceObject.runBySchedule();
39
- }
40
- else {
41
- ctx.logger.error(`runSchedule error , serviceName = ${serviceName}, 没有找到服务`);
42
- }
43
- }
44
- catch (e) {
45
- ctx.logger.error(`runSchedule error , serviceName = ${serviceName}`, e);
46
- }
47
- finally {
48
- await ctx.transaction.releaseTx();
49
- }
50
- }
51
- async function runSchedule(app, serviceList) {
52
- for (let i = 0; i < serviceList.length; i++) {
53
- const serviceName = serviceList[i];
54
- try {
55
- await runScheduleService(app, serviceName);
56
- }
57
- catch (e) {
58
- const ctx = app.createAnonymousContext();
59
- ctx.logger.error(`runSchedule error , serviceName = ${serviceName}`, e);
60
- }
61
- }
62
- }
63
- exports.runSchedule = runSchedule;
64
- async function startSchedule(app, serviceList) {
65
- await runSchedule(app, serviceList);
66
- setInterval(() => {
67
- runSchedule(app, serviceList);
68
- }, 2 * 60 * 1000);
69
- }
70
- exports.startSchedule = startSchedule;
3
+ exports.runScheduleTaskOnce = exports.startScheduleLoop = exports.ANONYMOUS_CONTEXT = exports.SCHEDULE_NAMES = exports.ALL_SCHEDULE_NAMES = void 0;
4
+ const runSchedule_1 = require("./runSchedule");
5
+ Object.defineProperty(exports, "startScheduleLoop", { enumerable: true, get: function () { return runSchedule_1.startScheduleLoop; } });
6
+ Object.defineProperty(exports, "runScheduleTaskOnce", { enumerable: true, get: function () { return runSchedule_1.runScheduleTaskOnce; } });
7
+ const anonymousContext_1 = require("./anonymousContext");
8
+ Object.defineProperty(exports, "ANONYMOUS_CONTEXT", { enumerable: true, get: function () { return anonymousContext_1.ANONYMOUS_CONTEXT; } });
9
+ const scheduleNames_1 = require("./scheduleNames");
10
+ Object.defineProperty(exports, "ALL_SCHEDULE_NAMES", { enumerable: true, get: function () { return scheduleNames_1.ALL_SCHEDULE_NAMES; } });
11
+ Object.defineProperty(exports, "SCHEDULE_NAMES", { enumerable: true, get: function () { return scheduleNames_1.SCHEDULE_NAMES; } });
@@ -0,0 +1,6 @@
1
+ declare function runScheduleTaskOnce(serviceName: string): Promise<{
2
+ result: any;
3
+ error: any;
4
+ }>;
5
+ declare function startScheduleLoop(serviceList: string[]): Promise<void>;
6
+ export { startScheduleLoop, runScheduleTaskOnce };
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runScheduleTaskOnce = exports.startScheduleLoop = void 0;
4
+ const anonymousContext_1 = require("./anonymousContext");
5
+ async function runScheduleTaskOnce(serviceName) {
6
+ return await anonymousContext_1.ANONYMOUS_CONTEXT.runServiceAtAnonymousContext(async (ctx) => {
7
+ const serviceObject = await ctx.requestContext.getAsync(serviceName);
8
+ if (serviceObject && serviceObject.runBySchedule) {
9
+ await serviceObject.runBySchedule();
10
+ }
11
+ else {
12
+ ctx.logger.error(`runSchedule error , serviceName = ${serviceName}, 没有找到服务`);
13
+ }
14
+ });
15
+ }
16
+ exports.runScheduleTaskOnce = runScheduleTaskOnce;
17
+ async function runScheduleServiceList(serviceList) {
18
+ for (let i = 0; i < serviceList.length; i++) {
19
+ const serviceName = serviceList[i];
20
+ try {
21
+ await runScheduleTaskOnce(serviceName);
22
+ }
23
+ catch (e) {
24
+ anonymousContext_1.ANONYMOUS_CONTEXT.getApp().getCoreLogger().error(`runSchedule error , serviceName = ${serviceName}`, e);
25
+ }
26
+ }
27
+ }
28
+ async function startScheduleLoop(serviceList) {
29
+ await runScheduleServiceList(serviceList);
30
+ setInterval(() => {
31
+ runScheduleServiceList(serviceList);
32
+ }, 2 * 60 * 1000);
33
+ }
34
+ exports.startScheduleLoop = startScheduleLoop;
@@ -0,0 +1,8 @@
1
+ declare const SCHEDULE_NAMES: {
2
+ proxyApiLoadService: string;
3
+ workbenchService: string;
4
+ visitStatService: string;
5
+ asyncTaskRunnerService: string;
6
+ };
7
+ declare const ALL_SCHEDULE_NAMES: string[];
8
+ export { ALL_SCHEDULE_NAMES, SCHEDULE_NAMES, };
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SCHEDULE_NAMES = exports.ALL_SCHEDULE_NAMES = void 0;
4
+ const SCHEDULE_NAMES = {
5
+ proxyApiLoadService: 'proxyApiLoadService',
6
+ workbenchService: 'workbenchService',
7
+ visitStatService: 'visitStatService',
8
+ asyncTaskRunnerService: 'asyncTaskRunnerService',
9
+ };
10
+ exports.SCHEDULE_NAMES = SCHEDULE_NAMES;
11
+ const ALL_SCHEDULE_NAMES = [
12
+ SCHEDULE_NAMES.proxyApiLoadService,
13
+ SCHEDULE_NAMES.workbenchService,
14
+ SCHEDULE_NAMES.visitStatService,
15
+ SCHEDULE_NAMES.asyncTaskRunnerService
16
+ ];
17
+ exports.ALL_SCHEDULE_NAMES = ALL_SCHEDULE_NAMES;
@@ -1,8 +1,22 @@
1
1
  import { Context } from '@midwayjs/koa';
2
2
  import { BaseService } from "../../service/base/BaseService";
3
3
  import { IScheduleService } from "../../interface";
4
+ import { ISysAsyncTaskHandler, SysAsyncTaskEntity } from "../../models/AsyncTaskModel";
5
+ declare class AsyncTaskRunner {
6
+ isBusy: boolean;
7
+ taskHandlerMap: Map<string, ISysAsyncTaskHandler>;
8
+ executeTaskList(taskList: SysAsyncTaskEntity[]): Promise<void>;
9
+ private executeTask;
10
+ private updateTaskStatus;
11
+ }
12
+ /**
13
+ * 业务可以扩展
14
+ */
15
+ export declare const ASYNC_TASK_RUNNER: AsyncTaskRunner;
4
16
  export declare class AsyncTaskRunnerService extends BaseService implements IScheduleService {
5
17
  protected ctx: Context;
6
18
  private curdProService;
19
+ fetchPendingTasks(): Promise<void>;
7
20
  runBySchedule(): Promise<void>;
8
21
  }
22
+ export {};
@@ -9,7 +9,7 @@ var __metadata = (this && this.__metadata) || function (k, v) {
9
9
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.AsyncTaskRunnerService = void 0;
12
+ exports.AsyncTaskRunnerService = exports.ASYNC_TASK_RUNNER = void 0;
13
13
  const core_1 = require("@midwayjs/core");
14
14
  const BaseService_1 = require("../../service/base/BaseService");
15
15
  const CurdProService_1 = require("../../service/curd/CurdProService");
@@ -18,6 +18,7 @@ const global_config_1 = require("../../libs/global-config/global-config");
18
18
  const SystemTables_1 = require("../../models/SystemTables");
19
19
  const keys_1 = require("../../libs/crud-pro/models/keys");
20
20
  const errorToString_1 = require("../../libs/utils/errorToString");
21
+ const schedule_1 = require("../../schedule");
21
22
  class AsyncTaskRunner {
22
23
  constructor() {
23
24
  this.isBusy = false;
@@ -31,14 +32,21 @@ class AsyncTaskRunner {
31
32
  for (let i = 0; i < taskList.length; i++) {
32
33
  const taskElement = taskList[i];
33
34
  try {
35
+ // 任务状态的设置在自定义的执行器里面。
34
36
  await this.executeTask(taskElement);
35
- taskElement.task_status = AsyncTaskModel_1.TaskStatus.SUCCEEDED;
36
37
  }
37
38
  catch (error) {
38
- taskElement.task_status = AsyncTaskModel_1.TaskStatus.FAILED;
39
+ taskElement.task_status = AsyncTaskModel_1.SysAsyncTaskStatus.FAILED;
39
40
  taskElement.error_message = (0, errorToString_1.errorToString)(error);
40
41
  }
42
+ try {
43
+ await this.updateTaskStatus(taskElement);
44
+ }
45
+ catch (error) {
46
+ schedule_1.ANONYMOUS_CONTEXT.getApp().getCoreLogger().error("executeTaskList error", error);
47
+ }
41
48
  }
49
+ this.isBusy = false;
42
50
  }
43
51
  async executeTask(taskElement) {
44
52
  const taskType = taskElement.task_type;
@@ -46,25 +54,47 @@ class AsyncTaskRunner {
46
54
  if (!taskHandler) {
47
55
  throw new Error('TaskHandler not found , taskType = ' + taskType);
48
56
  }
49
- await taskHandler.execute({ task: taskElement });
57
+ const updateTaskStatus = () => {
58
+ return this.updateTaskStatus(taskElement);
59
+ };
60
+ await taskHandler.execute({ task: taskElement, updateTaskStatus });
61
+ }
62
+ async updateTaskStatus(taskElement) {
63
+ return await schedule_1.ANONYMOUS_CONTEXT.runServiceAtAnonymousContext(async (ctx) => {
64
+ const curdProService = await ctx.requestContext.getAsync("curdProService");
65
+ const { SystemDbName, SystemDbType } = global_config_1.GLOBAL_STATIC_CONFIG.getConfig();
66
+ const { id, ...otherTaskProps } = taskElement;
67
+ const res = await curdProService.executeCrudByCfg({
68
+ condition: {
69
+ id: id
70
+ },
71
+ data: otherTaskProps
72
+ }, {
73
+ sqlTable: SystemTables_1.SystemTables.sys_async_tasks,
74
+ sqlSimpleName: keys_1.KeysOfSimpleSQL.SIMPLE_UPDATE,
75
+ sqlDatabase: SystemDbName,
76
+ sqlDbType: SystemDbType,
77
+ });
78
+ return res.getResModel().affected;
79
+ });
50
80
  }
51
81
  }
52
- const ASYNC_TASK_RUNNER = new AsyncTaskRunner();
82
+ /**
83
+ * 业务可以扩展
84
+ */
85
+ exports.ASYNC_TASK_RUNNER = new AsyncTaskRunner();
86
+ /**
87
+ * Redis锁
88
+ */
53
89
  const LOCK_KEY_ASYNC_TASK_RUNNER = "LOCK_KEY_ASYNC_TASK_RUNNER";
54
90
  let AsyncTaskRunnerService = class AsyncTaskRunnerService extends BaseService_1.BaseService {
55
- async runBySchedule() {
56
- if (ASYNC_TASK_RUNNER.isBusy) {
57
- return Promise.resolve();
58
- }
59
- const lock = await this.redisService.set(LOCK_KEY_ASYNC_TASK_RUNNER, 1, "EX", 3600, "NX");
60
- if (lock !== 'OK') {
61
- return Promise.resolve();
62
- }
91
+ async fetchPendingTasks() {
63
92
  const { SystemDbName, SystemDbType } = global_config_1.GLOBAL_STATIC_CONFIG.getConfig();
64
93
  const queryRes = await this.curdProService.executeCrudByCfg({
65
94
  condition: {
66
- task_status: AsyncTaskModel_1.TaskStatus.PENDING
95
+ task_status: AsyncTaskModel_1.SysAsyncTaskStatus.PENDING
67
96
  },
97
+ orderBy: 'id+',
68
98
  limit: 10
69
99
  }, {
70
100
  sqlTable: SystemTables_1.SystemTables.sys_async_tasks,
@@ -84,7 +114,7 @@ let AsyncTaskRunnerService = class AsyncTaskRunnerService extends BaseService_1.
84
114
  }
85
115
  },
86
116
  data: {
87
- task_status: AsyncTaskModel_1.TaskStatus.RUNNING
117
+ task_status: AsyncTaskModel_1.SysAsyncTaskStatus.RUNNING
88
118
  }
89
119
  }, {
90
120
  sqlTable: SystemTables_1.SystemTables.sys_async_tasks,
@@ -92,7 +122,27 @@ let AsyncTaskRunnerService = class AsyncTaskRunnerService extends BaseService_1.
92
122
  sqlDatabase: SystemDbName,
93
123
  sqlDbType: SystemDbType,
94
124
  });
95
- ASYNC_TASK_RUNNER.executeTaskList(taskList);
125
+ exports.ASYNC_TASK_RUNNER.executeTaskList(taskList).then(() => {
126
+ console.log("ASYNC_TASK_RUNNER finished taskIds ==> " + JSON.stringify(taskIds));
127
+ });
128
+ }
129
+ async runBySchedule() {
130
+ if (exports.ASYNC_TASK_RUNNER.isBusy) {
131
+ return Promise.resolve();
132
+ }
133
+ // 这里的过期时间1分钟即可。fetchPendingTasks函数不可能超过一分钟。
134
+ // 因为这里只是从数据库中获取一批任务,放到自己的任务队列里。还没触发执行。
135
+ const lock = await this.redisService.set(LOCK_KEY_ASYNC_TASK_RUNNER, 1, "EX", 60, "NX");
136
+ if (lock !== 'OK') {
137
+ return Promise.resolve();
138
+ }
139
+ try {
140
+ await this.fetchPendingTasks();
141
+ }
142
+ catch (e) {
143
+ console.error("fetchPendingTasks error", (0, errorToString_1.errorToString)(e));
144
+ }
145
+ await this.redisService.del(LOCK_KEY_ASYNC_TASK_RUNNER);
96
146
  return Promise.resolve();
97
147
  }
98
148
  };
@@ -13,9 +13,10 @@ exports.AsyncTaskService = void 0;
13
13
  const core_1 = require("@midwayjs/core");
14
14
  const BaseService_1 = require("../../service/base/BaseService");
15
15
  const schedule_1 = require("../../schedule");
16
+ const scheduleNames_1 = require("../../schedule/scheduleNames");
16
17
  let AsyncTaskService = class AsyncTaskService extends BaseService_1.BaseService {
17
18
  async startTask() {
18
- (0, schedule_1.runSchedule)(this.app, ['asyncTaskRunnerService']).then(schedule => {
19
+ (0, schedule_1.runScheduleTaskOnce)(scheduleNames_1.SCHEDULE_NAMES.asyncTaskRunnerService).then(schedule => {
19
20
  console.log(schedule);
20
21
  });
21
22
  }
@@ -47,4 +47,5 @@ export declare class CrudStdService extends ApiBaseService {
47
47
  */
48
48
  getParsedCrudStdAppInfo(appCode: string): Promise<ICrudStdAppInfo>;
49
49
  private hasOperationPerm;
50
+ private fixDataFieldTypeBySqlTableField;
50
51
  }
@@ -22,6 +22,7 @@ const _ = require("lodash");
22
22
  const ApiBaseService_1 = require("../base/ApiBaseService");
23
23
  const DatabaseName_1 = require("../../libs/crud-pro/utils/DatabaseName");
24
24
  const global_config_1 = require("../../libs/global-config/global-config");
25
+ const MixinUtils_1 = require("../../libs/crud-pro/utils/MixinUtils");
25
26
  exports.SPECIAL_SETTING_KEY = {
26
27
  QUERY_LIST: 'QUERY_LIST',
27
28
  QUERY_ONE: 'QUERY_ONE',
@@ -54,6 +55,8 @@ let CrudStdService = class CrudStdService extends ApiBaseService_1.ApiBaseServic
54
55
  }
55
56
  // 根据用户配置,设置关联查询的数据信息。
56
57
  await this.crudStdRelationService.addCfgModelColumnsRelation(cfgModel, appInfo);
58
+ // 根据表结构的数据类型,修正数据类型
59
+ await this.fixDataFieldTypeBySqlTableField(params, cfgModel, appInfo, { dbType, dbName });
57
60
  // 业务系统自定义的修改cfgModel
58
61
  await global_config_1.GLOBAL_STATIC_CONFIG.getConfig().bizUpdateCfgModelForCrudStd(params, cfgModel, appInfo, this.ctx);
59
62
  return await this.curdMixService.executeCrudByCfg(params, cfgModel);
@@ -163,6 +166,30 @@ let CrudStdService = class CrudStdService extends ApiBaseService_1.ApiBaseServic
163
166
  }
164
167
  return true; // 无需鉴权
165
168
  }
169
+ async fixDataFieldTypeBySqlTableField(params, cfgModel, appInfo, arg3) {
170
+ const tableFields = _.get(appInfo, 'stdCrudCfgObj.tableFields');
171
+ const tableFieldMap = MixinUtils_1.MixinUtils.toMap(tableFields, (e) => {
172
+ return e.fieldIndex;
173
+ });
174
+ if (arg3.dbType === keys_1.SqlDbType.postgres) {
175
+ if (cfgModel.sqlSimpleName === keys_1.KeysOfSimpleSQL.SIMPLE_INSERT || cfgModel.sqlSimpleName === keys_1.KeysOfSimpleSQL.SIMPLE_UPDATE) {
176
+ const data = params.data || {};
177
+ const dataKeys = Object.keys(data);
178
+ for (let index = 0; index < dataKeys.length; index++) {
179
+ const dataKey = dataKeys[index];
180
+ const dataValue = data[dataKey];
181
+ const fieldInfo = tableFieldMap[dataKey];
182
+ const fieldType = ('' + _.get(fieldInfo, 'type')).toUpperCase();
183
+ if (fieldType === 'ARRAY') {
184
+ const dataValueArray = (0, functions_1.parseJsonObject)(dataValue);
185
+ if (Array.isArray(dataValueArray)) {
186
+ data[dataKey] = `{${dataValueArray.map(v => `"${v}"`).join(',')}}`;
187
+ }
188
+ }
189
+ }
190
+ }
191
+ }
192
+ }
166
193
  };
167
194
  __decorate([
168
195
  (0, core_1.Inject)(),
@@ -0,0 +1,24 @@
1
+ import { SqlDbType } from "../../libs/crud-pro/models/keys";
2
+ import { IRequestModel } from "../../libs/crud-pro/interfaces";
3
+ import { IRequestCfgModel2 } from "../../models/bizmodels";
4
+ import { CrudPro } from "../../libs/crud-pro/CrudPro";
5
+ import { ResModelAffected, ResModelStandard } from "../../libs/crud-pro/models/ResModel";
6
+ export declare class CrudProQuick {
7
+ private readonly curdPro;
8
+ private readonly sqlDbType;
9
+ private readonly sqlDatabase;
10
+ private readonly sqlTable?;
11
+ private baseCfgModel;
12
+ constructor(curdPro: CrudPro, sqlDatabase: string, sqlDbType: SqlDbType, sqlTable?: string);
13
+ setBaseCfgModel(baseCfgModel: IRequestCfgModel2): void;
14
+ private executeCrudByCfg;
15
+ getOne(reqJson: IRequestModel, sqlTable?: string): Promise<any>;
16
+ getList(reqJson: IRequestModel, sqlTable?: string): Promise<any[]>;
17
+ getListPage(reqJson: IRequestModel, sqlTable?: string): Promise<ResModelStandard>;
18
+ getTotalCount(reqJson: IRequestModel, sqlTable?: string): Promise<number>;
19
+ insertObject(reqJson: IRequestModel, sqlTable?: string): Promise<ResModelAffected>;
20
+ updateObject(reqJson: IRequestModel, sqlTable?: string): Promise<ResModelAffected>;
21
+ insertOrUpdate(reqJson: IRequestModel, sqlTable?: string): Promise<ResModelStandard>;
22
+ deleteObject(reqJson: IRequestModel, sqlTable?: string): Promise<ResModelAffected>;
23
+ executeSQL(executeSql: string, args?: any[]): Promise<any>;
24
+ }