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.
- package/README.md +7 -0
- package/dist/configuration.d.ts +1 -0
- package/dist/configuration.js +21 -8
- package/dist/controller/base/BaseApiController.d.ts +1 -1
- package/dist/controller/gateway/AsyncTaskController.js +15 -4
- package/dist/controller/gateway/CrudMtdGatewayController.d.ts +3 -3
- package/dist/controller/gateway/CrudMtdGatewayController.js +5 -5
- package/dist/index.d.ts +3 -0
- package/dist/index.js +3 -0
- package/dist/libs/crud-pro/CrudPro.d.ts +1 -0
- package/dist/libs/crud-pro/CrudPro.js +5 -0
- package/dist/libs/crud-pro/defaultConfigs.js +2 -0
- package/dist/libs/crud-pro/interfaces.d.ts +6 -0
- package/dist/libs/crud-pro/models/ExecuteContext.d.ts +2 -1
- package/dist/libs/crud-pro/models/ExecuteContextFunc.d.ts +8 -1
- package/dist/libs/crud-pro/models/ExecuteContextFunc.js +8 -0
- package/dist/libs/crud-pro/models/ResModel.d.ts +16 -0
- package/dist/libs/crud-pro/models/ResModel.js +2 -0
- package/dist/libs/crud-pro/services/CrudProCachedCfgService.d.ts +1 -0
- package/dist/libs/crud-pro/services/CrudProCachedCfgService.js +22 -11
- package/dist/libs/crud-pro/services/CrudProServiceBase.d.ts +2 -6
- package/dist/libs/crud-pro/services/CrudProServiceBase.js +3 -2
- package/dist/libs/crud-pro/services/CrudProTableMetaService.d.ts +1 -0
- package/dist/libs/crud-pro/services/CrudProTableMetaService.js +31 -7
- package/dist/libs/crud-pro/utils/DatabaseName.js +24 -3
- package/dist/libs/global-config/global-config.d.ts +6 -0
- package/dist/libs/global-config/global-config.js +1 -0
- package/dist/models/AsyncTaskModel.d.ts +4 -2
- package/dist/schedule/anonymousContext.d.ts +13 -0
- package/dist/schedule/anonymousContext.js +59 -0
- package/dist/schedule/index.d.ts +4 -4
- package/dist/schedule/index.js +9 -68
- package/dist/schedule/runSchedule.d.ts +6 -0
- package/dist/schedule/runSchedule.js +34 -0
- package/dist/schedule/scheduleNames.d.ts +8 -0
- package/dist/schedule/scheduleNames.js +17 -0
- package/dist/service/asyncTask/AsyncTaskRunnerService.d.ts +23 -0
- package/dist/service/asyncTask/AsyncTaskRunnerService.js +86 -13
- package/dist/service/asyncTask/AsyncTaskService.js +2 -1
- package/dist/service/crudstd/CrudStdService.d.ts +1 -0
- package/dist/service/crudstd/CrudStdService.js +27 -0
- package/dist/service/curd/CrudProQuick.d.ts +24 -0
- package/dist/service/curd/CrudProQuick.js +105 -0
- package/dist/service/curd/CurdMixByLinkToCustomService.d.ts +10 -1
- package/dist/service/curd/CurdMixByLinkToCustomService.js +71 -23
- package/dist/service/curd/CurdMixService.d.ts +1 -1
- package/dist/service/curd/CurdMixService.js +2 -2
- package/dist/service/curd/CurdMixUtils.js +35 -28
- package/dist/service/curd/CurdProService.d.ts +2 -10
- package/dist/service/curd/CurdProService.js +28 -143
- package/dist/service/curd/fixCfgModel.d.ts +3 -0
- package/dist/service/curd/fixCfgModel.js +107 -0
- package/package.json +1 -1
- package/src/configuration.ts +30 -10
- package/src/controller/gateway/AnyApiGatewayController.ts +1 -1
- package/src/controller/gateway/AsyncTaskController.ts +18 -5
- package/src/controller/gateway/CrudMtdGatewayController.ts +5 -5
- package/src/controller/manage/DocManageApi.ts +5 -5
- package/src/index.ts +3 -0
- package/src/libs/crud-pro/CrudPro.ts +8 -0
- package/src/libs/crud-pro/defaultConfigs.ts +2 -0
- package/src/libs/crud-pro/interfaces.ts +10 -1
- package/src/libs/crud-pro/models/ExecuteContext.ts +5 -2
- package/src/libs/crud-pro/models/ExecuteContextFunc.ts +12 -1
- package/src/libs/crud-pro/models/ResModel.ts +24 -0
- package/src/libs/crud-pro/services/CrudProCachedCfgService.ts +26 -17
- package/src/libs/crud-pro/services/CrudProServiceBase.ts +5 -8
- package/src/libs/crud-pro/services/CrudProTableMetaService.ts +43 -9
- package/src/libs/crud-pro/utils/DatabaseName.ts +35 -15
- package/src/libs/global-config/global-config.ts +12 -1
- package/src/models/AsyncTaskModel.ts +5 -2
- package/src/schedule/anonymousContext.ts +79 -0
- package/src/schedule/index.ts +13 -72
- package/src/schedule/runSchedule.ts +35 -0
- package/src/schedule/scheduleNames.ts +20 -0
- package/src/service/asyncTask/AsyncTaskRunnerService.ts +113 -19
- package/src/service/asyncTask/AsyncTaskService.ts +3 -2
- package/src/service/base/BaseService.ts +2 -2
- package/src/service/crudstd/CrudStdService.ts +34 -6
- package/src/service/curd/CrudProQuick.ts +137 -0
- package/src/service/curd/CurdMixByLinkToCustomService.ts +100 -49
- package/src/service/curd/CurdMixService.ts +3 -3
- package/src/service/curd/CurdMixUtils.ts +51 -38
- package/src/service/curd/CurdProService.ts +42 -186
- 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;
|
package/dist/schedule/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
export {
|
|
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 };
|
package/dist/schedule/index.js
CHANGED
|
@@ -1,70 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
4
|
-
const
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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,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,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
|
-
|
|
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
|
-
|
|
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
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
19
|
+
(0, schedule_1.runScheduleTaskOnce)(scheduleNames_1.SCHEDULE_NAMES.asyncTaskRunnerService).then(schedule => {
|
|
19
20
|
console.log(schedule);
|
|
20
21
|
});
|
|
21
22
|
}
|
|
@@ -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
|
|
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
|
}
|