vue2-client 1.22.2 → 1.22.3
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/.claude/settings.local.json +30 -30
- package/.env.his +19 -19
- package/.eslintrc.js +74 -74
- package/.history/.eslintrc_20260521171150.js +74 -0
- package/.history/.eslintrc_20260521171213.js +74 -0
- package/.history/src/base-client/components/common/HIS/HAddNativeForm/HAddNativeForm_20260601154443.vue +726 -0
- package/.history/src/base-client/components/common/HIS/HAddNativeForm/HAddNativeForm_20260601154700.vue +478 -0
- package/.history/src/base-client/components/common/HIS/HButtons/HButtons_20260512175435.vue +706 -0
- package/.history/src/base-client/components/common/HIS/HButtons/HButtons_20260512175450.vue +694 -0
- package/.history/src/base-client/components/common/HIS/HButtons/HButtons_20260611152602.vue +755 -0
- package/.history/src/base-client/components/common/HIS/HForm/HForm_20260513145941.vue +524 -0
- package/.history/src/base-client/components/common/HIS/HForm/HForm_20260513153133.vue +731 -0
- package/.history/src/base-client/components/common/HIS/HForm/HForm_20260513160316.vue +525 -0
- package/.history/src/base-client/components/common/HIS/HForm/HForm_20260601144150.vue +1046 -0
- package/.history/src/base-client/components/common/HIS/HFormTable/HFormTable_20260310142713.vue +512 -0
- package/.history/src/base-client/components/common/HIS/HFormTable/HFormTable_20260310145118.vue +511 -0
- package/.history/src/base-client/components/common/HIS/HFormTable/HFormTable_20260311094834.vue +696 -0
- package/.history/src/base-client/components/common/HIS/HFormTable/HFormTable_20260320143028.vue +693 -0
- package/.history/src/base-client/components/common/HIS/HFormTable/HFormTable_20260409101450.vue +677 -0
- package/.history/src/base-client/components/common/HIS/HTab/HTab_20260508164645.vue +758 -0
- package/.history/src/base-client/components/common/HIS/HTab/HTab_20260508164714.vue +693 -0
- package/.history/src/base-client/components/common/HIS/HTab/HTab_20260508171651.vue +716 -0
- package/.history/src/base-client/components/common/HIS/HTab/HTab_20260509133717.vue +695 -0
- package/.history/src/base-client/components/common/HIS/HTab/HTab_20260509171115.vue +664 -0
- package/.history/src/base-client/components/common/XAddNativeForm/XAddNativeForm_20260513140637.vue +1455 -0
- package/.history/src/base-client/components/common/XAddNativeForm/XAddNativeForm_20260513140935.vue +1441 -0
- package/.history/src/base-client/components/common/XAddNativeForm/XAddNativeForm_20260513150818.vue +1441 -0
- package/.history/src/base-client/components/common/XAddNativeForm/XAddNativeForm_20260513153119.vue +1442 -0
- package/.history/src/base-client/components/common/XAddNativeForm/XAddNativeForm_20260513153126.vue +1486 -0
- package/.history/src/base-client/components/common/XForm/XFormItem_20260513140854.vue +1607 -0
- package/.history/src/base-client/components/common/XMarkdownViewer/XMarkdownViewer_20260519140403.vue +643 -0
- package/.history/src/base-client/components/common/XMarkdownViewer/XMarkdownViewer_20260519140829.vue +628 -0
- package/.history/src/base-client/components/common/XMarkdownViewer/demo_20260519142824.vue +104 -0
- package/.history/src/base-client/components/common/XMarkdownViewer/demo_20260519143155.vue +102 -0
- package/.history/src/base-client/components/common/XReportGrid/XReport_20260309171231.vue +1241 -0
- package/.history/src/base-client/components/common/XReportGrid/XReport_20260309171441.vue +1223 -0
- package/.history/src/base-client/components/his/HAi/HAi_20260612174826.vue +472 -0
- package/.history/src/base-client/components/his/HAi/HAi_20260612175839.vue +538 -0
- package/.history/src/base-client/components/his/HAi/HAi_20260615103331.vue +650 -0
- package/.history/src/base-client/components/his/XHDescriptions/XHDescriptions_20260424134504.vue +1469 -0
- package/.history/src/base-client/components/his/XSidebar/XSidebar_20260610171133.vue +788 -0
- package/.history/src/base-client/components/his/XSidebar/XSidebar_20260610171151.vue +780 -0
- package/.history/src/base-client/components/his/XTransfer/XTransfer_20260511170841.vue +585 -0
- package/.history/src/base-client/components/his/XTransfer/XTransfer_20260511171138.vue +787 -0
- package/.history/src/base-client/components/his/XTransfer/XTransfer_20260512141830.vue +739 -0
- package/.history/src/components/STable/index_20260409155138.js +806 -0
- package/.history/src/components/STable/index_20260409155218.js +814 -0
- package/.history/src/expression/core/Expression_20260305164427.js +1371 -0
- package/.history/src/expression/core/Expression_20260305170258.js +1358 -0
- package/.history/src/expression/core/Program_20260305111830.js +944 -0
- package/.history/src/expression/core/Program_20260305112041.js +931 -0
- package/.history/src/logic/LogicRunner_20260304154306.js +170 -0
- package/.history/src/logic/LogicRunner_20260304155553.js +112 -0
- package/.history/src/logic/LogicRunner_20260305105834.js +112 -0
- package/.history/src/logic/LogicRunner_20260305112718.js +129 -0
- package/.history/src/logic/LogicRunner_20260305182436.js +133 -0
- package/.history/src/logic/LogicRunner_20260306151301.js +213 -0
- package/.history/src/logic/LogicRunner_20260306152419.js +213 -0
- package/.history/src/logic/plugins/common/DateTools_20260305154159.js +61 -0
- package/.history/src/logic/plugins/common/DateTools_20260305154217.js +44 -0
- package/.history/src/logic/plugins/common/DateTools_20260305161014.js +44 -0
- package/.history/src/logic/plugins/common/HttpTools_20260305164352.js +80 -0
- package/.history/src/logic/plugins/common/HttpTools_20260305170258.js +75 -0
- package/.history/src/logic/plugins/common/HttpTools_20260305171634.js +75 -0
- package/.history/src/logic/plugins/common/HttpTools_20260306152419.js +72 -0
- package/.history/src/services/api/restTools_20260427142149.js +245 -0
- package/.history/src/services/api/restTools_20260427142853.js +230 -0
- package/.history/src/services/api/restTools_20260519135558.js +230 -0
- package/.history/src/services/api/restTools_20260519140825.js +230 -0
- package/.history/src/services/api/restTools_20260519151223.js +230 -0
- package/.history/src/utils/indexedDB_20260306150918.js +593 -0
- package/.history/src/utils/indexedDB_20260306151301.js +586 -0
- package/.idea/af-vue2-client.iml +9 -0
- package/.idea/codeStyles/Project.xml +62 -0
- package/.idea/codeStyles/codeStyleConfig.xml +5 -0
- package/.idea/misc.xml +6 -0
- package/.idea/modules.xml +1 -1
- package/Components.md +60 -60
- package/index.js +31 -31
- package/jest-transform-stub.js +8 -8
- package/jest.setup.js +7 -7
- package/package.json +1 -1
- package/preview-input-box.html +180 -0
- package/src/assets/img/querySlotDemo.svg +15 -15
- package/src/base-client/components/common/AmapMarker/AmapPointRendering.vue +120 -120
- package/src/base-client/components/common/CitySelect/index.js +3 -3
- package/src/base-client/components/common/CitySelect/index.md +109 -109
- package/src/base-client/components/common/FormGroupEdit/index.js +3 -3
- package/src/base-client/components/common/FormGroupEdit/index.md +43 -43
- package/src/base-client/components/common/HIS/HButtons/HButtons.vue +55 -1
- package/src/base-client/components/common/HIS/HForm/HForm.vue +1186 -1186
- package/src/base-client/components/common/HIS/HTab/HTab.vue +88 -1
- package/src/base-client/components/common/JSONToTree/jsontotree.vue +271 -271
- package/src/base-client/components/common/PersonSetting/index.js +3 -3
- package/src/base-client/components/common/Tree/index.js +2 -2
- package/src/base-client/components/common/Upload/index.js +3 -3
- package/src/base-client/components/common/XAddNativeForm/index.md +146 -146
- package/src/base-client/components/common/XAddReport/XAddReport.vue +16 -1
- package/src/base-client/components/common/XCard/XCard.vue +64 -64
- package/src/base-client/components/common/XDataDrawer/XDataDrawer.vue +180 -180
- package/src/base-client/components/common/XDataDrawer/index.js +3 -3
- package/src/base-client/components/common/XDataDrawer/index.md +41 -41
- package/src/base-client/components/common/XDescriptions/index.js +3 -3
- package/src/base-client/components/common/XDescriptions/index.md +382 -382
- package/src/base-client/components/common/XForm/index.md +178 -178
- package/src/base-client/components/common/XInput/XInput.vue +32 -1
- package/src/base-client/components/common/XInspectionDetailDrawer/index.vue +1 -1
- package/src/base-client/components/common/XMarkdownViewer/demo.vue +102 -102
- package/src/base-client/components/common/XStepView/XStepView.vue +252 -252
- package/src/base-client/components/common/XStepView/index.js +3 -3
- package/src/base-client/components/common/XStepView/index.md +31 -31
- package/src/base-client/components/common/XTable/index.md +255 -255
- package/src/base-client/components/his/HAi/HAi.vue +1177 -436
- package/src/base-client/components/his/XList/XList.vue +337 -58
- package/src/base-client/components/his/XSidebar/XSidebar.vue +36 -12
- package/src/base-client/components/his/XTransfer/index.md +327 -327
- package/src/base-client/components/system/DictionaryDetailsView/DictionaryDetailsView.vue +232 -232
- package/src/base-client/plugins/Config.js +19 -19
- package/src/base-client/plugins/tabs-page-plugin.js +39 -39
- package/src/components/Charts/Bar.vue +62 -62
- package/src/components/Charts/ChartCard.vue +134 -134
- package/src/components/Charts/Liquid.vue +67 -67
- package/src/components/Charts/MiniArea.vue +39 -39
- package/src/components/Charts/MiniBar.vue +39 -39
- package/src/components/Charts/MiniProgress.vue +75 -75
- package/src/components/Charts/MiniSmoothArea.vue +40 -40
- package/src/components/Charts/Radar.vue +68 -68
- package/src/components/Charts/RankList.vue +77 -77
- package/src/components/Charts/TagCloud.vue +113 -113
- package/src/components/Charts/TransferBar.vue +64 -64
- package/src/components/Charts/Trend.vue +82 -82
- package/src/components/Charts/chart.less +12 -12
- package/src/components/Charts/smooth.area.less +13 -13
- package/src/components/NumberInfo/NumberInfo.vue +54 -54
- package/src/components/NumberInfo/index.js +3 -3
- package/src/components/NumberInfo/index.less +54 -54
- package/src/components/NumberInfo/index.md +43 -43
- package/src/components/STable/index.js +953 -953
- package/src/components/card/ChartCard.vue +79 -79
- package/src/components/chart/Bar.vue +60 -60
- package/src/components/chart/MiniArea.vue +67 -67
- package/src/components/chart/MiniBar.vue +59 -59
- package/src/components/chart/MiniProgress.vue +57 -57
- package/src/components/chart/Radar.vue +80 -80
- package/src/components/chart/RankingList.vue +60 -60
- package/src/components/chart/Trend.vue +79 -79
- package/src/components/chart/index.less +9 -9
- package/src/components/checkbox/ColorCheckbox.vue +157 -157
- package/src/components/input/IInput.vue +66 -66
- package/src/components/menu/SideMenu.vue +75 -75
- package/src/components/menu/menu.js +273 -273
- package/src/components/tool/AStepItem.vue +60 -60
- package/src/layouts/CommonLayout.vue +56 -56
- package/src/lib.js +1 -1
- package/src/mock/extend/index.js +84 -84
- package/src/mock/goods/index.js +108 -108
- package/src/pages/dashboard/workplace/WorkPlace.vue +141 -141
- package/src/pages/system/dictionary/index.vue +44 -44
- package/src/pages/system/monitor/loginInfor/index.vue +37 -37
- package/src/pages/system/monitor/operLog/index.vue +37 -37
- package/src/services/api/cas.js +79 -79
- package/src/store/modules/setting.js +119 -119
- package/src/utils/errorCode.js +6 -6
- package//350/277/201/347/247/273/346/227/245/345/277/227.md +15 -15
- package/.idea/MarsCodeWorkspaceAppSettings.xml +0 -7
- package/.idea/google-java-format.xml +0 -6
- package/.idea/inspectionProfiles/Project_Default.xml +0 -24
- package/.idea/jsLinters/eslint.xml +0 -6
- package/.idea/vue2-client.iml +0 -12
- package/.vscode/settings.json +0 -28
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import ServiceException from '../expression/exception/ServiceException'
|
|
2
|
+
import LogicConsole from '../expression/instances/LogicConsole'
|
|
3
|
+
import ExpressionRunner from '../expression/ExpressionRunner'
|
|
4
|
+
import { getLogicConfigByNameAsync } from '@vue2-client/services/api/common'
|
|
5
|
+
import * as Plugins from './plugins/index'
|
|
6
|
+
import Expression from '../expression/core/Expression'
|
|
7
|
+
|
|
8
|
+
export default class LogicRunner {
|
|
9
|
+
static logicConsoleInstance = new LogicConsole()
|
|
10
|
+
|
|
11
|
+
// 存储正在运行的 Logic 任务,key 为 logicName,value 为 { promise, abortController }
|
|
12
|
+
static runningTasks = new Map()
|
|
13
|
+
|
|
14
|
+
// 缓存 Logic 配置请求,key 为 logicName,value 为 Promise
|
|
15
|
+
static logicConfigCache = new Map()
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* 是否存在指定名称的Logic资源
|
|
19
|
+
*
|
|
20
|
+
* @param logicName Logic名称
|
|
21
|
+
* @return 是否存在
|
|
22
|
+
*/
|
|
23
|
+
static async has (logicName) {
|
|
24
|
+
const result = await LogicRunner.getLogic(logicName, false)
|
|
25
|
+
return result != null
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* 执行Logic
|
|
30
|
+
*
|
|
31
|
+
* @param logicName Logic名称
|
|
32
|
+
* @param param 参数
|
|
33
|
+
* @param mode 运行模式:undefined-普通模式,'ignore'-忽略重复,'cancel'-取消前一个
|
|
34
|
+
* @return 执行结果
|
|
35
|
+
*/
|
|
36
|
+
static async run (logicName, param, mode) {
|
|
37
|
+
const taskKey = logicName
|
|
38
|
+
|
|
39
|
+
// 模式1: ignore - 如果已存在运行中的任务,直接忽略当前调用
|
|
40
|
+
if (mode === 'ignore') {
|
|
41
|
+
if (LogicRunner.runningTasks.has(taskKey)) {
|
|
42
|
+
console.log(`[LogicRunner] ${logicName} 已在运行中,忽略本次调用`)
|
|
43
|
+
return null
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// 模式2: cancel - 如果已存在运行中的任务,中止之前的任务
|
|
48
|
+
if (mode === 'cancel') {
|
|
49
|
+
const existingTask = LogicRunner.runningTasks.get(taskKey)
|
|
50
|
+
if (existingTask && existingTask.abortController) {
|
|
51
|
+
console.log(`[LogicRunner] 取消 ${logicName} 的前一次运行`)
|
|
52
|
+
existingTask.abortController.abort()
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// 创建 AbortController 用于支持取消功能
|
|
57
|
+
const abortController = new AbortController()
|
|
58
|
+
const taskPromise = LogicRunner.executeLogic(logicName, param, abortController)
|
|
59
|
+
|
|
60
|
+
// 存储任务信息
|
|
61
|
+
LogicRunner.runningTasks.set(taskKey, { promise: taskPromise, abortController })
|
|
62
|
+
|
|
63
|
+
try {
|
|
64
|
+
const result = await taskPromise
|
|
65
|
+
return result
|
|
66
|
+
} finally {
|
|
67
|
+
// 任务完成后移除(如果是 cancel 模式,可能已经被新的任务覆盖)
|
|
68
|
+
const currentTask = LogicRunner.runningTasks.get(taskKey)
|
|
69
|
+
if (currentTask && currentTask.promise === taskPromise) {
|
|
70
|
+
LogicRunner.runningTasks.delete(taskKey)
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* 实际执行 Logic 的内部方法
|
|
77
|
+
*/
|
|
78
|
+
static async executeLogic (logicName, param, abortController) {
|
|
79
|
+
// 获取Logic资源(带缓存,避免重复请求)
|
|
80
|
+
const cachedConfig = LogicRunner.logicConfigCache.get(logicName)
|
|
81
|
+
let result
|
|
82
|
+
|
|
83
|
+
if (cachedConfig) {
|
|
84
|
+
// 使用缓存的配置
|
|
85
|
+
result = await cachedConfig
|
|
86
|
+
} else {
|
|
87
|
+
// 发起新请求并缓存
|
|
88
|
+
const configPromise = LogicRunner.getLogic(logicName, false)
|
|
89
|
+
LogicRunner.logicConfigCache.set(logicName, configPromise)
|
|
90
|
+
result = await configPromise
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
if (!result || !result.source) {
|
|
94
|
+
throw new ServiceException('Logic资源' + logicName + '未找到', 400)
|
|
95
|
+
}
|
|
96
|
+
// 预处理 source:移除换行符,将换行替换为分号,避免解析器报错
|
|
97
|
+
const source = result.source.replace(/[\r\n]+/g, ';')
|
|
98
|
+
const paramStr = Expression.toJSONString(param)
|
|
99
|
+
const logicLog = LogicConsole.createLogger('logic.' + logicName)
|
|
100
|
+
logicLog.info(`执行Logic[${logicName}],params: ${paramStr}`)
|
|
101
|
+
// 附加用户注册的对象到业务逻辑中
|
|
102
|
+
const plugins = {}
|
|
103
|
+
plugins.data = param
|
|
104
|
+
plugins.log = logicLog
|
|
105
|
+
plugins.ENV = result.$globalProp
|
|
106
|
+
plugins.logic = this
|
|
107
|
+
// 注入 abortSignal 到 plugins,用于支持取消操作
|
|
108
|
+
plugins.abortSignal = abortController.signal
|
|
109
|
+
Object.assign(plugins, Plugins.default)
|
|
110
|
+
|
|
111
|
+
// 使用 Promise 包装执行,以便监听 abort 信号
|
|
112
|
+
return new Promise((resolve, reject) => {
|
|
113
|
+
// 监听 abort 信号
|
|
114
|
+
const abortHandler = () => {
|
|
115
|
+
const error = new Error(`Logic[${logicName}] 被取消`)
|
|
116
|
+
error.name = 'AbortError'
|
|
117
|
+
reject(error)
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
if (abortController.signal.aborted) {
|
|
121
|
+
abortHandler()
|
|
122
|
+
return
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
abortController.signal.addEventListener('abort', abortHandler)
|
|
126
|
+
|
|
127
|
+
// 执行表达式
|
|
128
|
+
LogicRunner.runExpression(source, plugins)
|
|
129
|
+
.then(result => {
|
|
130
|
+
abortController.signal.removeEventListener('abort', abortHandler)
|
|
131
|
+
resolve(result)
|
|
132
|
+
})
|
|
133
|
+
.catch(error => {
|
|
134
|
+
abortController.signal.removeEventListener('abort', abortHandler)
|
|
135
|
+
// 如果是 abort 错误,不再重复抛出(避免 console 显示 unhandled promise rejection)
|
|
136
|
+
if (error.name === 'AbortError') {
|
|
137
|
+
return
|
|
138
|
+
}
|
|
139
|
+
reject(error)
|
|
140
|
+
})
|
|
141
|
+
})
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* 执行原生表达式
|
|
146
|
+
*
|
|
147
|
+
* @param source 表达式内容
|
|
148
|
+
* @param params 参数
|
|
149
|
+
* @return 执行结果
|
|
150
|
+
*/
|
|
151
|
+
static async runExpression (source, params) {
|
|
152
|
+
return await ExpressionRunner.run(source, params)
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
static async getLogic (logicName, isDev) {
|
|
156
|
+
return await getLogicConfigByNameAsync(logicName, undefined, isDev)
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* 清除指定 Logic 的缓存
|
|
161
|
+
*/
|
|
162
|
+
static clearCache (logicName) {
|
|
163
|
+
if (logicName) {
|
|
164
|
+
LogicRunner.logicConfigCache.delete(logicName)
|
|
165
|
+
} else {
|
|
166
|
+
// 清除所有缓存
|
|
167
|
+
LogicRunner.logicConfigCache.clear()
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import ServiceException from '../expression/exception/ServiceException'
|
|
2
|
+
import LogicConsole from '../expression/instances/LogicConsole'
|
|
3
|
+
import ExpressionRunner from '../expression/ExpressionRunner'
|
|
4
|
+
import { getLogicConfigByNameAsync } from '@vue2-client/services/api/common'
|
|
5
|
+
import * as Plugins from './plugins/index'
|
|
6
|
+
import Expression from '../expression/core/Expression'
|
|
7
|
+
|
|
8
|
+
export default class LogicRunner {
|
|
9
|
+
static logicConsoleInstance = new LogicConsole()
|
|
10
|
+
|
|
11
|
+
// 存储正在运行的 Logic 任务,key 为 logicName,value 为 { promise, abortController }
|
|
12
|
+
static runningTasks = new Map()
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* 是否存在指定名称的Logic资源
|
|
16
|
+
*
|
|
17
|
+
* @param logicName Logic名称
|
|
18
|
+
* @return 是否存在
|
|
19
|
+
*/
|
|
20
|
+
static async has (logicName) {
|
|
21
|
+
const result = await LogicRunner.getLogic(logicName, false)
|
|
22
|
+
return result != null
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* 执行Logic
|
|
27
|
+
*
|
|
28
|
+
* @param logicName Logic名称
|
|
29
|
+
* @param param 参数
|
|
30
|
+
* @param mode 运行模式:undefined-普通模式,'ignore'-忽略重复,'cancel'-取消前一个
|
|
31
|
+
* @return 执行结果
|
|
32
|
+
*/
|
|
33
|
+
static async run (logicName, param, mode) {
|
|
34
|
+
const taskKey = logicName
|
|
35
|
+
|
|
36
|
+
// 模式1: ignore - 如果已存在运行中的任务,直接忽略当前调用
|
|
37
|
+
if (mode === 'ignore') {
|
|
38
|
+
if (LogicRunner.runningTasks.has(taskKey)) {
|
|
39
|
+
console.log(`[LogicRunner] ${logicName} 已在运行中,忽略本次调用`)
|
|
40
|
+
return null
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// 模式2: cancel - 如果已存在运行中的任务,中止之前的任务
|
|
45
|
+
if (mode === 'cancel') {
|
|
46
|
+
const existingTask = LogicRunner.runningTasks.get(taskKey)
|
|
47
|
+
if (existingTask && existingTask.abortController) {
|
|
48
|
+
console.log(`[LogicRunner] 取消 ${logicName} 的前一次运行`)
|
|
49
|
+
existingTask.abortController.abort()
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// 创建 AbortController 用于支持取消功能
|
|
54
|
+
const abortController = new AbortController()
|
|
55
|
+
const taskPromise = LogicRunner.executeLogic(logicName, param, abortController)
|
|
56
|
+
|
|
57
|
+
// 存储任务信息
|
|
58
|
+
LogicRunner.runningTasks.set(taskKey, { promise: taskPromise, abortController })
|
|
59
|
+
|
|
60
|
+
try {
|
|
61
|
+
const result = await taskPromise
|
|
62
|
+
return result
|
|
63
|
+
} finally {
|
|
64
|
+
// 任务完成后移除(如果是 cancel 模式,可能已经被新的任务覆盖)
|
|
65
|
+
const currentTask = LogicRunner.runningTasks.get(taskKey)
|
|
66
|
+
if (currentTask && currentTask.promise === taskPromise) {
|
|
67
|
+
LogicRunner.runningTasks.delete(taskKey)
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* 实际执行 Logic 的内部方法
|
|
74
|
+
*/
|
|
75
|
+
static async executeLogic (logicName, param, abortController) {
|
|
76
|
+
// 获取Logic资源(传 shouldParseConfig: false,不触发服务端解析)
|
|
77
|
+
const result = await LogicRunner.getLogic(logicName, false)
|
|
78
|
+
if (!result || !result.source) {
|
|
79
|
+
throw new ServiceException('Logic资源' + logicName + '未找到', 400)
|
|
80
|
+
}
|
|
81
|
+
// 预处理 source:移除换行符,将换行替换为分号,避免解析器报错
|
|
82
|
+
const source = result.source.replace(/[\r\n]+/g, ';')
|
|
83
|
+
const paramStr = Expression.toJSONString(param)
|
|
84
|
+
const logicLog = LogicConsole.createLogger('logic.' + logicName)
|
|
85
|
+
logicLog.info(`执行Logic[${logicName}],params: ${paramStr}`)
|
|
86
|
+
// 附加用户注册的对象到业务逻辑中
|
|
87
|
+
const plugins = {}
|
|
88
|
+
plugins.data = param
|
|
89
|
+
plugins.log = logicLog
|
|
90
|
+
plugins.ENV = result.$globalProp
|
|
91
|
+
plugins.logic = this
|
|
92
|
+
// 注入 abortSignal 到 plugins,用于支持取消操作
|
|
93
|
+
plugins.abortSignal = abortController.signal
|
|
94
|
+
Object.assign(plugins, Plugins.default)
|
|
95
|
+
return LogicRunner.runExpression(source, plugins)
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* 执行原生表达式
|
|
100
|
+
*
|
|
101
|
+
* @param source 表达式内容
|
|
102
|
+
* @param params 参数
|
|
103
|
+
* @return 执行结果
|
|
104
|
+
*/
|
|
105
|
+
static async runExpression (source, params) {
|
|
106
|
+
return await ExpressionRunner.run(source, params)
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
static async getLogic (logicName, isDev) {
|
|
110
|
+
return await getLogicConfigByNameAsync(logicName, undefined, isDev)
|
|
111
|
+
}
|
|
112
|
+
}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import ServiceException from '../expression/exception/ServiceException'
|
|
2
|
+
import LogicConsole from '../expression/instances/LogicConsole'
|
|
3
|
+
import ExpressionRunner from '../expression/ExpressionRunner'
|
|
4
|
+
import { getLogicConfigByNameAsync } from '@vue2-client/services/api/common'
|
|
5
|
+
import * as Plugins from './plugins/index'
|
|
6
|
+
import Expression from '../expression/core/Expression'
|
|
7
|
+
|
|
8
|
+
export default class LogicRunner {
|
|
9
|
+
static logicConsoleInstance = new LogicConsole()
|
|
10
|
+
|
|
11
|
+
// 存储正在运行的 Logic 任务,key 为 logicName,value 为 { promise, abortController }
|
|
12
|
+
static runningTasks = new Map()
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* 是否存在指定名称的Logic资源
|
|
16
|
+
*
|
|
17
|
+
* @param logicName Logic名称
|
|
18
|
+
* @return 是否存在
|
|
19
|
+
*/
|
|
20
|
+
static async has (logicName) {
|
|
21
|
+
const result = await LogicRunner.getLogic(logicName, false)
|
|
22
|
+
return result != null
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* 执行Logic
|
|
27
|
+
*
|
|
28
|
+
* @param logicName Logic名称
|
|
29
|
+
* @param param 参数
|
|
30
|
+
* @param mode 运行模式:undefined-普通模式,'ignore'-忽略重复,'cancel'-取消前一个
|
|
31
|
+
* @return 执行结果
|
|
32
|
+
*/
|
|
33
|
+
static async run (logicName, param, mode) {
|
|
34
|
+
const taskKey = logicName
|
|
35
|
+
|
|
36
|
+
// 模式1: ignore - 如果已存在运行中的任务,直接忽略当前调用
|
|
37
|
+
if (mode === 'ignore') {
|
|
38
|
+
if (LogicRunner.runningTasks.has(taskKey)) {
|
|
39
|
+
console.log(`[LogicRunner] ${logicName} 已在运行中,忽略本次调用`)
|
|
40
|
+
return null
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// 模式2: cancel - 如果已存在运行中的任务,中止之前的任务
|
|
45
|
+
if (mode === 'cancel') {
|
|
46
|
+
const existingTask = LogicRunner.runningTasks.get(taskKey)
|
|
47
|
+
if (existingTask && existingTask.abortController) {
|
|
48
|
+
console.log(`[LogicRunner] 取消 ${logicName} 的前一次运行`)
|
|
49
|
+
existingTask.abortController.abort()
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// 创建 AbortController 用于支持取消功能
|
|
54
|
+
const abortController = new AbortController()
|
|
55
|
+
const taskPromise = LogicRunner.executeLogic(logicName, param, abortController)
|
|
56
|
+
|
|
57
|
+
// 存储任务信息
|
|
58
|
+
LogicRunner.runningTasks.set(taskKey, { promise: taskPromise, abortController })
|
|
59
|
+
|
|
60
|
+
try {
|
|
61
|
+
const result = await taskPromise
|
|
62
|
+
return result
|
|
63
|
+
} finally {
|
|
64
|
+
// 任务完成后移除(如果是 cancel 模式,可能已经被新的任务覆盖)
|
|
65
|
+
const currentTask = LogicRunner.runningTasks.get(taskKey)
|
|
66
|
+
if (currentTask && currentTask.promise === taskPromise) {
|
|
67
|
+
LogicRunner.runningTasks.delete(taskKey)
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* 实际执行 Logic 的内部方法
|
|
74
|
+
*/
|
|
75
|
+
static async executeLogic (logicName, param, abortController) {
|
|
76
|
+
// 获取Logic资源(传 shouldParseConfig: false,不触发服务端解析)
|
|
77
|
+
const result = await LogicRunner.getLogic(logicName, false)
|
|
78
|
+
if (!result || !result.source) {
|
|
79
|
+
throw new ServiceException('Logic资源' + logicName + '未找到', 400)
|
|
80
|
+
}
|
|
81
|
+
// 预处理 source:移除换行符,将换行替换为分号,避免解析器报错
|
|
82
|
+
const source = result.source.replace(/[\r\n]+/g, ';')
|
|
83
|
+
const paramStr = Expression.toJSONString(param)
|
|
84
|
+
const logicLog = LogicConsole.createLogger('logic.' + logicName)
|
|
85
|
+
logicLog.info(`执行Logic[${logicName}],params: ${paramStr}`)
|
|
86
|
+
// 附加用户注册的对象到业务逻辑中
|
|
87
|
+
const plugins = {}
|
|
88
|
+
plugins.data = param
|
|
89
|
+
plugins.log = logicLog
|
|
90
|
+
plugins.ENV = result.$globalProp
|
|
91
|
+
plugins.logic = this
|
|
92
|
+
// 注入 abortSignal 到 plugins,用于支持取消操作
|
|
93
|
+
plugins.abortSignal = abortController.signal
|
|
94
|
+
Object.assign(plugins, Plugins.default)
|
|
95
|
+
return LogicRunner.runExpression(source, plugins)
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* 执行原生表达式
|
|
100
|
+
*
|
|
101
|
+
* @param source 表达式内容
|
|
102
|
+
* @param params 参数
|
|
103
|
+
* @return 执行结果
|
|
104
|
+
*/
|
|
105
|
+
static async runExpression (source, params) {
|
|
106
|
+
return await ExpressionRunner.run(source, params)
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
static async getLogic (logicName, isDev) {
|
|
110
|
+
return await getLogicConfigByNameAsync(logicName, undefined, isDev)
|
|
111
|
+
}
|
|
112
|
+
}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import ServiceException from '../expression/exception/ServiceException'
|
|
2
|
+
import LogicConsole from '../expression/instances/LogicConsole'
|
|
3
|
+
import ExpressionRunner from '../expression/ExpressionRunner'
|
|
4
|
+
import { getLogicConfigByNameAsync } from '@vue2-client/services/api/common'
|
|
5
|
+
import * as Plugins from './plugins/index'
|
|
6
|
+
import Expression from '../expression/core/Expression'
|
|
7
|
+
|
|
8
|
+
export default class LogicRunner {
|
|
9
|
+
static logicConsoleInstance = new LogicConsole()
|
|
10
|
+
|
|
11
|
+
// 存储正在运行的 Logic 任务,key 为 logicName,value 为 { promise, abortController, status }
|
|
12
|
+
// status: 'running' - 运行中, 'completed' - 已完成(用于ignore模式判断)
|
|
13
|
+
static runningTasks = new Map()
|
|
14
|
+
|
|
15
|
+
// 任务完成后保持"已完成"状态的时间(毫秒),之后自动清理
|
|
16
|
+
static COMPLETED_STATUS_TTL = 3000
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* 是否存在指定名称的Logic资源
|
|
20
|
+
*
|
|
21
|
+
* @param logicName Logic名称
|
|
22
|
+
* @return 是否存在
|
|
23
|
+
*/
|
|
24
|
+
static async has (logicName) {
|
|
25
|
+
const result = await LogicRunner.getLogic(logicName, false)
|
|
26
|
+
return result != null
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* 执行Logic
|
|
31
|
+
*
|
|
32
|
+
* @param logicName Logic名称
|
|
33
|
+
* @param param 参数
|
|
34
|
+
* @param mode 运行模式:undefined-普通模式,'ignore'-忽略重复,'cancel'-取消前一个
|
|
35
|
+
* @return 执行结果
|
|
36
|
+
*/
|
|
37
|
+
static async run (logicName, param, mode) {
|
|
38
|
+
const taskKey = logicName
|
|
39
|
+
|
|
40
|
+
// 检查已存在的任务
|
|
41
|
+
const existingTask = LogicRunner.runningTasks.get(taskKey)
|
|
42
|
+
|
|
43
|
+
// 模式1: ignore - 如果已存在运行中的任务,直接忽略当前调用
|
|
44
|
+
if (mode === 'ignore') {
|
|
45
|
+
// 如果任务正在运行中,忽略本次调用
|
|
46
|
+
if (existingTask && existingTask.status === 'running') {
|
|
47
|
+
console.log(`[LogicRunner] ${logicName} 已在运行中,忽略本次调用`)
|
|
48
|
+
return null
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// 模式2: cancel - 如果已存在运行中的任务,中止之前的任务
|
|
53
|
+
if (mode === 'cancel') {
|
|
54
|
+
if (existingTask && existingTask.status === 'running') {
|
|
55
|
+
console.log(`[LogicRunner] 取消 ${logicName} 的前一次运行`)
|
|
56
|
+
if (existingTask.abortController) {
|
|
57
|
+
existingTask.abortController.abort()
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// 创建 AbortController 用于支持取消功能
|
|
63
|
+
const abortController = new AbortController()
|
|
64
|
+
const taskPromise = LogicRunner.executeLogic(logicName, param, abortController)
|
|
65
|
+
|
|
66
|
+
// 存储任务信息,设置状态为运行中
|
|
67
|
+
LogicRunner.runningTasks.set(taskKey, { promise: taskPromise, abortController, status: 'running' })
|
|
68
|
+
|
|
69
|
+
try {
|
|
70
|
+
const result = await taskPromise
|
|
71
|
+
return result
|
|
72
|
+
} finally {
|
|
73
|
+
// 任务完成后更新状态为已完成,而不是直接删除
|
|
74
|
+
const currentTask = LogicRunner.runningTasks.get(taskKey)
|
|
75
|
+
if (currentTask && currentTask.promise === taskPromise) {
|
|
76
|
+
currentTask.status = 'completed'
|
|
77
|
+
|
|
78
|
+
// 延迟删除任务,让 ignore 模式可以检测到"刚完成"的状态
|
|
79
|
+
setTimeout(() => {
|
|
80
|
+
const task = LogicRunner.runningTasks.get(taskKey)
|
|
81
|
+
if (task && task.status === 'completed') {
|
|
82
|
+
LogicRunner.runningTasks.delete(taskKey)
|
|
83
|
+
}
|
|
84
|
+
}, LogicRunner.COMPLETED_STATUS_TTL)
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* 实际执行 Logic 的内部方法
|
|
91
|
+
*/
|
|
92
|
+
static async executeLogic (logicName, param, abortController) {
|
|
93
|
+
// 获取Logic资源(传 shouldParseConfig: false,不触发服务端解析)
|
|
94
|
+
const result = await LogicRunner.getLogic(logicName, false)
|
|
95
|
+
if (!result || !result.source) {
|
|
96
|
+
throw new ServiceException('Logic资源' + logicName + '未找到', 400)
|
|
97
|
+
}
|
|
98
|
+
// 预处理 source:移除换行符,将换行替换为分号,避免解析器报错
|
|
99
|
+
const source = result.source.replace(/[\r\n]+/g, ';')
|
|
100
|
+
const paramStr = Expression.toJSONString(param)
|
|
101
|
+
const logicLog = LogicConsole.createLogger('logic.' + logicName)
|
|
102
|
+
logicLog.info(`执行Logic[${logicName}],params: ${paramStr}`)
|
|
103
|
+
// 附加用户注册的对象到业务逻辑中
|
|
104
|
+
const plugins = {}
|
|
105
|
+
plugins.data = param
|
|
106
|
+
plugins.log = logicLog
|
|
107
|
+
plugins.ENV = result.$globalProp
|
|
108
|
+
plugins.logic = this
|
|
109
|
+
// 注入 abortSignal 到 plugins,用于支持取消操作
|
|
110
|
+
plugins.abortSignal = abortController.signal
|
|
111
|
+
Object.assign(plugins, Plugins.default)
|
|
112
|
+
return LogicRunner.runExpression(source, plugins)
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* 执行原生表达式
|
|
117
|
+
*
|
|
118
|
+
* @param source 表达式内容
|
|
119
|
+
* @param params 参数
|
|
120
|
+
* @return 执行结果
|
|
121
|
+
*/
|
|
122
|
+
static async runExpression (source, params) {
|
|
123
|
+
return await ExpressionRunner.run(source, params)
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
static async getLogic (logicName, isDev) {
|
|
127
|
+
return await getLogicConfigByNameAsync(logicName, undefined, isDev)
|
|
128
|
+
}
|
|
129
|
+
}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import ServiceException from '../expression/exception/ServiceException'
|
|
2
|
+
import LogicConsole from '../expression/instances/LogicConsole'
|
|
3
|
+
import ExpressionRunner from '../expression/ExpressionRunner'
|
|
4
|
+
import { getLogicConfigByNameAsync } from '@vue2-client/services/api/common'
|
|
5
|
+
import * as Plugins from './plugins/index'
|
|
6
|
+
import Expression from '../expression/core/Expression'
|
|
7
|
+
|
|
8
|
+
export default class LogicRunner {
|
|
9
|
+
static logicConsoleInstance = new LogicConsole()
|
|
10
|
+
|
|
11
|
+
// 存储正在运行的 Logic 任务,key 为 logicName,value 为 { promise, abortController, status }
|
|
12
|
+
// status: 'running' - 运行中, 'completed' - 已完成(用于ignore模式判断)
|
|
13
|
+
static runningTasks = new Map()
|
|
14
|
+
|
|
15
|
+
// 任务完成后保持"已完成"状态的时间(毫秒),之后自动清理
|
|
16
|
+
static COMPLETED_STATUS_TTL = 3000
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* 是否存在指定名称的Logic资源
|
|
20
|
+
*
|
|
21
|
+
* @param logicName Logic名称
|
|
22
|
+
* @return 是否存在
|
|
23
|
+
*/
|
|
24
|
+
static async has (logicName) {
|
|
25
|
+
const result = await LogicRunner.getLogic(logicName, false)
|
|
26
|
+
return result != null
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* 执行Logic
|
|
31
|
+
*
|
|
32
|
+
* @param logicName Logic名称
|
|
33
|
+
* @param param 参数
|
|
34
|
+
* @param mode 运行模式:undefined-普通模式,'ignore'-忽略重复,'cancel'-取消前一个
|
|
35
|
+
* @return 执行结果
|
|
36
|
+
*/
|
|
37
|
+
static async run (logicName, param, mode) {
|
|
38
|
+
const taskKey = logicName
|
|
39
|
+
|
|
40
|
+
// 检查已存在的任务
|
|
41
|
+
const existingTask = LogicRunner.runningTasks.get(taskKey)
|
|
42
|
+
|
|
43
|
+
// 模式1: ignore - 如果已存在运行中的任务,直接忽略当前调用
|
|
44
|
+
if (mode === 'ignore') {
|
|
45
|
+
// 如果任务正在运行中,忽略本次调用
|
|
46
|
+
if (existingTask && existingTask.status === 'running') {
|
|
47
|
+
console.log(`[LogicRunner] ${logicName} 已在运行中,忽略本次调用`)
|
|
48
|
+
return null
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// 模式2: cancel - 如果已存在运行中的任务,中止之前的任务
|
|
53
|
+
if (mode === 'cancel') {
|
|
54
|
+
if (existingTask && existingTask.status === 'running') {
|
|
55
|
+
console.log(`[LogicRunner] 取消 ${logicName} 的前一次运行`)
|
|
56
|
+
if (existingTask.abortController) {
|
|
57
|
+
existingTask.abortController.abort()
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// 创建 AbortController 用于支持取消功能
|
|
63
|
+
const abortController = new AbortController()
|
|
64
|
+
const taskPromise = LogicRunner.executeLogic(logicName, param, abortController)
|
|
65
|
+
|
|
66
|
+
// 存储任务信息,设置状态为运行中
|
|
67
|
+
LogicRunner.runningTasks.set(taskKey, { promise: taskPromise, abortController, status: 'running' })
|
|
68
|
+
|
|
69
|
+
try {
|
|
70
|
+
const result = await taskPromise
|
|
71
|
+
return result
|
|
72
|
+
} finally {
|
|
73
|
+
// 任务完成后更新状态为已完成,而不是直接删除
|
|
74
|
+
const currentTask = LogicRunner.runningTasks.get(taskKey)
|
|
75
|
+
if (currentTask && currentTask.promise === taskPromise) {
|
|
76
|
+
currentTask.status = 'completed'
|
|
77
|
+
|
|
78
|
+
// 延迟删除任务,让 ignore 模式可以检测到"刚完成"的状态
|
|
79
|
+
setTimeout(() => {
|
|
80
|
+
const task = LogicRunner.runningTasks.get(taskKey)
|
|
81
|
+
if (task && task.status === 'completed') {
|
|
82
|
+
LogicRunner.runningTasks.delete(taskKey)
|
|
83
|
+
}
|
|
84
|
+
}, LogicRunner.COMPLETED_STATUS_TTL)
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* 实际执行 Logic 的内部方法
|
|
91
|
+
*/
|
|
92
|
+
static async executeLogic (logicName, param, abortController) {
|
|
93
|
+
// 获取Logic资源(传 shouldParseConfig: false,不触发服务端解析)
|
|
94
|
+
const result = await LogicRunner.getLogic(logicName, false)
|
|
95
|
+
if (!result || !result.source) {
|
|
96
|
+
throw new ServiceException('Logic资源' + logicName + '未找到', 400)
|
|
97
|
+
}
|
|
98
|
+
// 预处理 source:移除换行符,将换行替换为分号,避免解析器报错
|
|
99
|
+
const source = result.source.replace(/[\r\n]+/g, '')
|
|
100
|
+
const paramStr = Expression.toJSONString(param)
|
|
101
|
+
const logicLog = LogicConsole.createLogger('logic.' + logicName)
|
|
102
|
+
logicLog.info(`执行Logic[${logicName}],params: ${paramStr}`)
|
|
103
|
+
// 附加用户注册的对象到业务逻辑中
|
|
104
|
+
const plugins = {}
|
|
105
|
+
plugins.data = param
|
|
106
|
+
plugins.log = logicLog
|
|
107
|
+
plugins.ENV = result.$globalProp
|
|
108
|
+
plugins.logic = this
|
|
109
|
+
|
|
110
|
+
// 注入 abortSignal 到 plugins,用于支持取消操作
|
|
111
|
+
console.log('[LogicRunner.executeLogic] 设置 abortSignal:', abortController.signal)
|
|
112
|
+
plugins.abortSignal = abortController.signal
|
|
113
|
+
|
|
114
|
+
Object.assign(plugins, Plugins.default)
|
|
115
|
+
|
|
116
|
+
return await LogicRunner.runExpression(source, plugins)
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* 执行原生表达式
|
|
121
|
+
*
|
|
122
|
+
* @param source 表达式内容
|
|
123
|
+
* @param params 参数
|
|
124
|
+
* @return 执行结果
|
|
125
|
+
*/
|
|
126
|
+
static async runExpression (source, params) {
|
|
127
|
+
return await ExpressionRunner.run(source, params)
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
static async getLogic (logicName, isDev) {
|
|
131
|
+
return await getLogicConfigByNameAsync(logicName, undefined, isDev)
|
|
132
|
+
}
|
|
133
|
+
}
|