Bpmnjs初尝试工作流计算
约 962 字大约 3 分钟
2024-09-25
bpmn-文档链接
框架应用
如果想让新增的属性全部属性通用,则:
...
{
"name": "BewitchedStartEvent",
"extends": [
"bpmn:BaseElement"
],
...
},监听事件
// 获取 eventBus 模块
const eventBus: any = bpmnModeler.value.get('eventBus');
// 监听用户通过属性面板修改属性的事件
eventBus.on('propertiesPanel.updated', function (event: any) {
const element = event.element;
const businessObject = element.businessObject;
// 监听特定属性变化
console.log('Property changed in properties panel:', businessObject.name);
console.log('Property changed in properties panel all:', businessObject);
});| 监听事件 | 事件内容 |
|---|---|
| propertiesPanel.updated | 属性面板中属性更新事件 |
| commandStack.element.updateProperties.postExecuted | 监听属性更改完成事件 |
算法
邻接矩阵的最长路径算法
// 不记录路径
int DP(int i){
if(dp[i] > 0) return dp[i];//dp[i]已计算完毕
for (int j = 0; j < n; ++j)//遍历i的所有出边
{
if(G[i][j] != INF){
dp[i] = max(dp[i], DP(j)+G[i][j]);
}
}
return dp[i];//返回计算完毕的dp[i]
}
// 记录路径
int DP(int i){
if(dp[i] > 0) return dp[i];//dp[i]已计算完毕
for (int j = 0; j < n; ++j)//遍历i的所有出边
{
if(G[i][j] != INF){
int temp = DP(j) + G[i][j];//单独计算,防止if调用DP函数两次
if(temp > dp[i]){
dp[i] = temp;
choice[i] = j;
}
}
}
return dp[i];//返回计算完毕的dp[i]
}
// 调用前,要先求出最大的dp[i],然后将i作为路径起点传人
void printPath(int i){
printf("%d\n", i);
while(choice[i] != -1){//choice初始化为-1
i = choice[i];
printf("->%d\n", i);
}
}int Dp(int i) {
if (vis[i]) return dp[i]; // 如果已经计算过 dp[i],直接返回
vis[i] = true; // 标记节点 i 已访问
// 遍历图中所有从节点 i 出发的边
for (int j = 0; j < n; ++j) {
if (G[i][j] != INF) { // 如果存在 i -> j 的边
dp[i] = max(dp[i], Dp(j) + G[i][j]); // 更新 dp[i] 为最大值
}
}
return dp[i]; // 返回从节点 i 出发到达终点的最长路径长度
}
int main() {
int fixed_endpoint = ...; // 固定终点,假设已知
memset(dp, -INF, sizeof(dp)); // 初始化 dp 数组为负无穷大,表示尚未计算
dp[fixed_endpoint] = 0; // 终点的最长路径为 0(到自身)
// 从所有节点中找出能到达终点的最长路径
int max_len = -INF;
for (int i = 0; i < n; ++i) {
max_len = max(max_len, Dp(i)); // 求出所有节点到终点的最长路径
}
cout << "最长路径长度为: " << max_len << endl;
return 0;
}计算日期差值
const calculateDate = (dateList: Date[]) => {
if (dateList.length < 2) {
console.log('日期数量不足2个,无法计算');
return;
}
// 获取日期的时间戳(毫秒)
const start = dateList[0].getTime();
const end = dateList[dateList.length - 1].getTime();
// 计算差异并转换为天数
const diffInMilliseconds = Math.abs(end - start);
const diffInDays = diffInMilliseconds / (1000 * 60 * 60 * 24);
// 返回天数(向下取整)
const days = Math.floor(diffInDays);
propsValue.value = `${days}天`;
};