midway-fatcms 0.0.1-beta.14 → 0.0.1-beta.17

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 (85) 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 +15 -4
  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 +3 -0
  9. package/dist/index.js +3 -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 +4 -2
  29. package/dist/schedule/anonymousContext.d.ts +13 -0
  30. package/dist/schedule/anonymousContext.js +59 -0
  31. package/dist/schedule/index.d.ts +4 -4
  32. package/dist/schedule/index.js +9 -68
  33. package/dist/schedule/runSchedule.d.ts +6 -0
  34. package/dist/schedule/runSchedule.js +34 -0
  35. package/dist/schedule/scheduleNames.d.ts +8 -0
  36. package/dist/schedule/scheduleNames.js +17 -0
  37. package/dist/service/asyncTask/AsyncTaskRunnerService.d.ts +23 -0
  38. package/dist/service/asyncTask/AsyncTaskRunnerService.js +86 -13
  39. package/dist/service/asyncTask/AsyncTaskService.js +2 -1
  40. package/dist/service/crudstd/CrudStdService.d.ts +1 -0
  41. package/dist/service/crudstd/CrudStdService.js +27 -0
  42. package/dist/service/curd/CrudProQuick.d.ts +24 -0
  43. package/dist/service/curd/CrudProQuick.js +105 -0
  44. package/dist/service/curd/CurdMixByLinkToCustomService.d.ts +10 -1
  45. package/dist/service/curd/CurdMixByLinkToCustomService.js +71 -23
  46. package/dist/service/curd/CurdMixService.d.ts +1 -1
  47. package/dist/service/curd/CurdMixService.js +2 -2
  48. package/dist/service/curd/CurdMixUtils.js +35 -28
  49. package/dist/service/curd/CurdProService.d.ts +2 -10
  50. package/dist/service/curd/CurdProService.js +28 -143
  51. package/dist/service/curd/fixCfgModel.d.ts +3 -0
  52. package/dist/service/curd/fixCfgModel.js +107 -0
  53. package/package.json +1 -1
  54. package/src/configuration.ts +30 -10
  55. package/src/controller/gateway/AnyApiGatewayController.ts +1 -1
  56. package/src/controller/gateway/AsyncTaskController.ts +18 -5
  57. package/src/controller/gateway/CrudMtdGatewayController.ts +5 -5
  58. package/src/controller/manage/DocManageApi.ts +5 -5
  59. package/src/index.ts +3 -0
  60. package/src/libs/crud-pro/CrudPro.ts +8 -0
  61. package/src/libs/crud-pro/defaultConfigs.ts +2 -0
  62. package/src/libs/crud-pro/interfaces.ts +10 -1
  63. package/src/libs/crud-pro/models/ExecuteContext.ts +5 -2
  64. package/src/libs/crud-pro/models/ExecuteContextFunc.ts +12 -1
  65. package/src/libs/crud-pro/models/ResModel.ts +24 -0
  66. package/src/libs/crud-pro/services/CrudProCachedCfgService.ts +26 -17
  67. package/src/libs/crud-pro/services/CrudProServiceBase.ts +5 -8
  68. package/src/libs/crud-pro/services/CrudProTableMetaService.ts +43 -9
  69. package/src/libs/crud-pro/utils/DatabaseName.ts +35 -15
  70. package/src/libs/global-config/global-config.ts +12 -1
  71. package/src/models/AsyncTaskModel.ts +5 -2
  72. package/src/schedule/anonymousContext.ts +79 -0
  73. package/src/schedule/index.ts +13 -72
  74. package/src/schedule/runSchedule.ts +35 -0
  75. package/src/schedule/scheduleNames.ts +20 -0
  76. package/src/service/asyncTask/AsyncTaskRunnerService.ts +113 -19
  77. package/src/service/asyncTask/AsyncTaskService.ts +3 -2
  78. package/src/service/base/BaseService.ts +2 -2
  79. package/src/service/crudstd/CrudStdService.ts +34 -6
  80. package/src/service/curd/CrudProQuick.ts +137 -0
  81. package/src/service/curd/CurdMixByLinkToCustomService.ts +100 -49
  82. package/src/service/curd/CurdMixService.ts +3 -3
  83. package/src/service/curd/CurdMixUtils.ts +51 -38
  84. package/src/service/curd/CurdProService.ts +42 -186
  85. package/src/service/curd/fixCfgModel.ts +139 -0
@@ -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,31 @@
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
+ /**
11
+ * 更新任务状态或任务进度
12
+ * @param taskElement
13
+ * @private
14
+ */
15
+ private updateTaskStatus;
16
+ /**
17
+ * 获取当前进程可以处理的任务类型。
18
+ */
19
+ getHandlerTaskTypeList(): string[];
20
+ }
21
+ /**
22
+ * 业务可以扩展
23
+ */
24
+ export declare const ASYNC_TASK_RUNNER: AsyncTaskRunner;
4
25
  export declare class AsyncTaskRunnerService extends BaseService implements IScheduleService {
5
26
  protected ctx: Context;
6
27
  private curdProService;
28
+ fetchPendingTasks(): Promise<void>;
7
29
  runBySchedule(): Promise<void>;
8
30
  }
31
+ 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.SysAsyncTaskStatus.SUCCEEDED;
36
37
  }
37
38
  catch (error) {
38
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,68 @@ 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
+ /**
63
+ * 更新任务状态或任务进度
64
+ * @param taskElement
65
+ * @private
66
+ */
67
+ async updateTaskStatus(taskElement) {
68
+ return await schedule_1.ANONYMOUS_CONTEXT.runServiceAtAnonymousContext(async (ctx) => {
69
+ const curdProService = await ctx.requestContext.getAsync("curdProService");
70
+ const { SystemDbName, SystemDbType } = global_config_1.GLOBAL_STATIC_CONFIG.getConfig();
71
+ const { id, ...otherTaskProps } = taskElement;
72
+ const res = await curdProService.executeCrudByCfg({
73
+ condition: {
74
+ id: id
75
+ },
76
+ data: otherTaskProps
77
+ }, {
78
+ sqlTable: SystemTables_1.SystemTables.sys_async_tasks,
79
+ sqlSimpleName: keys_1.KeysOfSimpleSQL.SIMPLE_UPDATE,
80
+ sqlDatabase: SystemDbName,
81
+ sqlDbType: SystemDbType,
82
+ });
83
+ return res.getResModel().affected;
84
+ });
85
+ }
86
+ /**
87
+ * 获取当前进程可以处理的任务类型。
88
+ */
89
+ getHandlerTaskTypeList() {
90
+ const keys = this.taskHandlerMap.keys();
91
+ return [...keys];
50
92
  }
51
93
  }
52
- const ASYNC_TASK_RUNNER = new AsyncTaskRunner();
94
+ /**
95
+ * 业务可以扩展
96
+ */
97
+ exports.ASYNC_TASK_RUNNER = new AsyncTaskRunner();
98
+ /**
99
+ * Redis锁
100
+ */
53
101
  const LOCK_KEY_ASYNC_TASK_RUNNER = "LOCK_KEY_ASYNC_TASK_RUNNER";
54
102
  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') {
103
+ async fetchPendingTasks() {
104
+ const { SystemDbName, SystemDbType } = global_config_1.GLOBAL_STATIC_CONFIG.getConfig();
105
+ // 只获取本进程能够处理的任务类型。
106
+ const taskTypeList = exports.ASYNC_TASK_RUNNER.getHandlerTaskTypeList();
107
+ if (taskTypeList.length === 0) {
61
108
  return Promise.resolve();
62
109
  }
63
- const { SystemDbName, SystemDbType } = global_config_1.GLOBAL_STATIC_CONFIG.getConfig();
110
+ // 查询等待处理的任务。
64
111
  const queryRes = await this.curdProService.executeCrudByCfg({
65
112
  condition: {
66
- task_status: AsyncTaskModel_1.SysAsyncTaskStatus.PENDING
113
+ task_status: AsyncTaskModel_1.SysAsyncTaskStatus.PENDING,
114
+ task_type: {
115
+ "$in": taskTypeList
116
+ }
67
117
  },
118
+ orderBy: 'id+',
68
119
  limit: 10
69
120
  }, {
70
121
  sqlTable: SystemTables_1.SystemTables.sys_async_tasks,
@@ -77,6 +128,7 @@ let AsyncTaskRunnerService = class AsyncTaskRunnerService extends BaseService_1.
77
128
  return Promise.resolve();
78
129
  }
79
130
  const taskIds = taskList.map(elem => elem.id).filter(Boolean);
131
+ // 将状态更新为处理中。防止其它进程重复处理。
80
132
  await this.curdProService.executeCrudByCfg({
81
133
  condition: {
82
134
  id: {
@@ -92,7 +144,28 @@ let AsyncTaskRunnerService = class AsyncTaskRunnerService extends BaseService_1.
92
144
  sqlDatabase: SystemDbName,
93
145
  sqlDbType: SystemDbType,
94
146
  });
95
- ASYNC_TASK_RUNNER.executeTaskList(taskList);
147
+ // 开始执行。
148
+ exports.ASYNC_TASK_RUNNER.executeTaskList(taskList).then(() => {
149
+ console.log("ASYNC_TASK_RUNNER finished taskIds ==> " + JSON.stringify(taskIds));
150
+ });
151
+ }
152
+ async runBySchedule() {
153
+ if (exports.ASYNC_TASK_RUNNER.isBusy) {
154
+ return Promise.resolve();
155
+ }
156
+ // 这里的过期时间1分钟即可。fetchPendingTasks函数不可能超过一分钟。
157
+ // 因为这里只是从数据库中获取一批任务,放到自己的任务队列里。还没触发执行。
158
+ const lock = await this.redisService.set(LOCK_KEY_ASYNC_TASK_RUNNER, 1, "EX", 60, "NX");
159
+ if (lock !== 'OK') {
160
+ return Promise.resolve();
161
+ }
162
+ try {
163
+ await this.fetchPendingTasks();
164
+ }
165
+ catch (e) {
166
+ console.error("fetchPendingTasks error", (0, errorToString_1.errorToString)(e));
167
+ }
168
+ await this.redisService.del(LOCK_KEY_ASYNC_TASK_RUNNER);
96
169
  return Promise.resolve();
97
170
  }
98
171
  };
@@ -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
+ }
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CrudProQuick = void 0;
4
+ const keys_1 = require("../../libs/crud-pro/models/keys");
5
+ class CrudProQuick {
6
+ constructor(curdPro, sqlDatabase, sqlDbType, sqlTable) {
7
+ this.baseCfgModel = {};
8
+ this.sqlDatabase = sqlDatabase;
9
+ this.sqlDbType = sqlDbType;
10
+ this.curdPro = curdPro;
11
+ this.sqlTable = sqlTable; // 全局sqlTable为空时,单独调用时就必须传sqlTable参数。
12
+ }
13
+ setBaseCfgModel(baseCfgModel) {
14
+ Object.assign(this.baseCfgModel, baseCfgModel);
15
+ }
16
+ async executeCrudByCfg(reqJson, cfgModel2) {
17
+ const cfgModel = { ...this.baseCfgModel };
18
+ Object.assign(cfgModel, cfgModel2);
19
+ cfgModel.method = 'CrudProQuickAnonymous';
20
+ cfgModel.updateCfg = {};
21
+ cfgModel.sqlDatabase = this.sqlDatabase;
22
+ cfgModel.sqlDbType = this.sqlDbType;
23
+ if (!cfgModel.sqlTable) {
24
+ cfgModel.sqlTable = this.sqlTable;
25
+ }
26
+ if (!cfgModel.sqlTable) {
27
+ throw new Error('[CrudProQuick] sqlTable not found');
28
+ }
29
+ return await this.curdPro.executeCrudByCfg(reqJson, cfgModel);
30
+ }
31
+ async getOne(reqJson, sqlTable) {
32
+ const cfgModel = {
33
+ sqlTable,
34
+ sqlSimpleName: keys_1.KeysOfSimpleSQL.SIMPLE_QUERY_ONE,
35
+ };
36
+ const res = await this.executeCrudByCfg(reqJson, cfgModel);
37
+ return res.getOneObj();
38
+ }
39
+ async getList(reqJson, sqlTable) {
40
+ const cfgModel = {
41
+ sqlTable,
42
+ sqlSimpleName: keys_1.KeysOfSimpleSQL.SIMPLE_QUERY,
43
+ };
44
+ const res = await this.executeCrudByCfg(reqJson, cfgModel);
45
+ return res.getResRows();
46
+ }
47
+ async getListPage(reqJson, sqlTable) {
48
+ const cfgModel = {
49
+ sqlTable,
50
+ sqlSimpleName: keys_1.KeysOfSimpleSQL.SIMPLE_QUERY_PAGE,
51
+ };
52
+ const res = await this.executeCrudByCfg(reqJson, cfgModel);
53
+ return res.getResModel(); // 因为它有2个返回值
54
+ }
55
+ async getTotalCount(reqJson, sqlTable) {
56
+ const cfgModel = {
57
+ sqlTable,
58
+ sqlSimpleName: keys_1.KeysOfSimpleSQL.SIMPLE_QUERY_COUNT,
59
+ };
60
+ const res = await this.executeCrudByCfg(reqJson, cfgModel);
61
+ return res.getResModel().total_count;
62
+ }
63
+ async insertObject(reqJson, sqlTable) {
64
+ const cfgModel = {
65
+ sqlTable,
66
+ sqlSimpleName: keys_1.KeysOfSimpleSQL.SIMPLE_INSERT,
67
+ };
68
+ const res = await this.executeCrudByCfg(reqJson, cfgModel);
69
+ return res.getResModel().affected;
70
+ }
71
+ async updateObject(reqJson, sqlTable) {
72
+ const cfgModel = {
73
+ sqlTable,
74
+ sqlSimpleName: keys_1.KeysOfSimpleSQL.SIMPLE_UPDATE,
75
+ };
76
+ const res = await this.executeCrudByCfg(reqJson, cfgModel);
77
+ return res.getResModel().affected;
78
+ }
79
+ async insertOrUpdate(reqJson, sqlTable) {
80
+ const cfgModel = {
81
+ sqlTable,
82
+ sqlSimpleName: keys_1.KeysOfSimpleSQL.SIMPLE_INSERT_OR_UPDATE,
83
+ };
84
+ const res = await this.executeCrudByCfg(reqJson, cfgModel);
85
+ return res.getResModel(); // 因为它有三个返回值
86
+ }
87
+ async deleteObject(reqJson, sqlTable) {
88
+ const cfgModel = {
89
+ sqlTable,
90
+ sqlSimpleName: keys_1.KeysOfSimpleSQL.SIMPLE_DELETE,
91
+ };
92
+ const res = await this.executeCrudByCfg(reqJson, cfgModel);
93
+ return res.getResModel().affected;
94
+ }
95
+ async executeSQL(executeSql, args) {
96
+ const sqlCfgModel = {
97
+ executeSql: executeSql,
98
+ executeSqlArgs: args,
99
+ sqlDatabase: this.sqlDatabase,
100
+ sqlDbType: this.sqlDbType,
101
+ };
102
+ return await this.curdPro.executeSQL(sqlCfgModel);
103
+ }
104
+ }
105
+ exports.CrudProQuick = CrudProQuick;
@@ -1,7 +1,7 @@
1
1
  import { Context } from '@midwayjs/koa';
2
2
  import { CurdProService } from './CurdProService';
3
3
  import { ExecuteContext, IExecuteContextHandler } from '../../libs/crud-pro/models/ExecuteContext';
4
- import { RedisCacheService } from "../base/RedisCacheService";
4
+ import { RedisCacheService } from '../base/RedisCacheService';
5
5
  export declare class CurdMixByLinkToCustomService implements IExecuteContextHandler {
6
6
  protected ctx: Context;
7
7
  protected curdProService: CurdProService;
@@ -13,10 +13,19 @@ export declare class CurdMixByLinkToCustomService implements IExecuteContextHand
13
13
  * code形如:mysql_________fatcms~~~sys_perm_role~~~role_code,role_name,xxx_name
14
14
  * code形如:fatcms~~~sys_perm_role~~~role_code,role_name,xxx_name
15
15
  * code形如:fatcms~~~sys_perm_role~~~id,*
16
+ * code形如:GET_BY_CRUD_METHOD~~~GetActiveLineEnum~~~id,*
17
+ * code形如:GET_BY_CRUD_METHOD~~~GetActiveLineEnum~~~id,name
16
18
  * 【数据库】~~~【表名】~~~【value】,【label】,【style】
17
19
  * @param code
18
20
  * @private
19
21
  */
20
22
  private queryInfoByLinkToCustomImpl;
23
+ /**
24
+ *
25
+ * @param code
26
+ * code形如:GET_BY_CRUD_METHOD~~~GetActiveLineEnum~~~id,*
27
+ * code形如:GET_BY_CRUD_METHOD~~~GetActiveLineEnum~~~id,name
28
+ */
29
+ private queryInfoByLinkToCustomByCrudMethod;
21
30
  private loadInfoByLinkToCustomMap;
22
31
  }