1.配置使用xml

2.新增动态配置规则和节点方法
This commit is contained in:
chenweilong 2022-12-12 18:38:20 +08:00
parent 9f17c168ca
commit 30d011c74f
14 changed files with 575 additions and 67 deletions

View File

@ -0,0 +1,50 @@
package com.example.liteflow.mysql.bean;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.example.liteflow.mysql.entity.DynamicScriptEntity;
import com.example.liteflow.mysql.enums.NodeEnum;
import com.example.liteflow.mysql.service.DynamicScriptService;
import com.yomahub.liteflow.builder.LiteFlowNodeBuilder;
import com.yomahub.liteflow.flow.FlowBus;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.List;
/**
* @author: 陈韦龙
* @date: 2022年12月12日 17:21
*/
@Component
@Slf4j
public class AviatorEvaluatorRunner implements CommandLineRunner {
@Resource
private DynamicScriptService dynamicScriptService;
@Override
public void run(String... args) throws Exception {
List<DynamicScriptEntity> list = dynamicScriptService.list();
log.info("AviatorEvaluatorRunner-list = {}", list.size());
list.forEach(item -> {
String scriptId = item.getScriptId();
boolean containNode = FlowBus.containNode(scriptId);
if (!containNode) {
String scriptName = item.getScriptName();
String scriptClass = item.getScriptClass();
String nodeType = item.getNodeType();
if (NodeEnum.CommonNode.getName().equals(nodeType)) {
LiteFlowNodeBuilder.createCommonNode().setId(scriptId)
.setName(scriptName)
.setClazz(scriptClass)
.build();
} else if (NodeEnum.IfNode.getName().equals(nodeType)) {
LiteFlowNodeBuilder.createIfNode().setId(scriptId)
.setName(scriptName)
.setClazz(scriptClass)
.build();
}
}
});
}
}

View File

@ -0,0 +1,44 @@
package com.example.liteflow.mysql.controller;
import com.example.liteflow.mysql.model.dynamicScript.CreateDynamicScriptFrom;
import com.example.liteflow.mysql.service.DynamicScriptService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
* @author: 陈韦龙
* @date: 2022年12月12日 15:51
*/
@Slf4j
@RestController
@RequestMapping("/dynamicScript")
public class DynamicScriptController {
@Resource
private DynamicScriptService dynamicScriptService;
@PostMapping("/createCostCenterNode")
public void createCostCenterNode(@RequestBody CreateDynamicScriptFrom createDynamicScriptFrom) {
dynamicScriptService.createCostCenterNode(createDynamicScriptFrom);
}
@PostMapping("/createCostCenterIfNode")
public void createCostCenterIfNode(@RequestBody CreateDynamicScriptFrom createDynamicScriptFrom) {
dynamicScriptService.createCostCenterIfNode(createDynamicScriptFrom);
}
@PostMapping("/createProfitCenterNode")
public void createProfitCenterNode(@RequestBody CreateDynamicScriptFrom createDynamicScriptFrom) {
dynamicScriptService.createProfitCenterNode(createDynamicScriptFrom);
}
@PostMapping("/createProfitCenterIfNode")
public void createProfitCenterIfNode(@RequestBody CreateDynamicScriptFrom createDynamicScriptFrom) {
dynamicScriptService.createProfitCenterIfNode(createDynamicScriptFrom);
}
}

View File

@ -0,0 +1,56 @@
package com.example.liteflow.mysql.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
/**
*
* @TableName dynamic_script
*/
@TableName("dynamic_script")
@Data
public class DynamicScriptEntity {
/**
* 主键
*/
@TableId(value = "ID", type = IdType.ASSIGN_ID)
private String id;
/**
* 脚本Id
*/
@TableField("script_id")
private String scriptId;
/**
* 脚本名称
*/
@TableField("script_name")
private String scriptName;
/**
* 脚本对应类名
*/
@TableField("script_class")
private String scriptClass;
/**
* 脚本对应节点类型
*/
@TableField("node_type")
private String nodeType;
/**
* 脚本规则
*/
@TableField("script_role")
private String scriptRole;
/**
* 脚本内容
*/
@TableField("script_content")
private String scriptContent;
}

View File

@ -0,0 +1,19 @@
package com.example.liteflow.mysql.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.ToString;
/**
* @author: 陈韦龙
* @date: 2022年12月12日 17:24
*/
@Getter
@AllArgsConstructor
@ToString
public enum NodeEnum {
CommonNode("CommonNode"),
IfNode("IfNode"),
;
private final String name;
}

View File

@ -0,0 +1,17 @@
package com.example.liteflow.mysql.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.liteflow.mysql.entity.DynamicScriptEntity;
import org.apache.ibatis.annotations.Mapper;
/**
* @author 75349
* @description 针对表dynamic_script的数据库操作Mapper
* @createDate 2022-12-12 15:46:00
* @Entity generator.domain.DynamicScript
*/
@Mapper
public interface DynamicScriptMapper extends BaseMapper<DynamicScriptEntity> {
}

View File

@ -0,0 +1,13 @@
package com.example.liteflow.mysql.model;
import lombok.Data;
/**
* @author: 陈韦龙
* @date: 2022年12月12日 18:30
*/
@Data
public class SoutFrom {
private String code;
private String name;
}

View File

@ -0,0 +1,33 @@
package com.example.liteflow.mysql.model.dynamicScript;
import com.example.liteflow.mysql.model.SoutFrom;
import com.example.liteflow.mysql.model.role.Role;
import lombok.Data;
import java.util.List;
/**
* @author: 陈韦龙
* @date: 2022年12月12日 15:52
*/
@Data
public class CreateDynamicScriptFrom {
/**
* 脚本Id
*/
private String scriptId;
/**
* 脚本名称
*/
private String scriptName;
/**
* 规则
*/
private List<Role> roles;
/**
* 内容
*/
private SoutFrom content;
}

View File

@ -0,0 +1,36 @@
package com.example.liteflow.mysql.model.dynamicScript;
import com.example.liteflow.mysql.model.SoutFrom;
import com.example.liteflow.mysql.model.role.Role;
import lombok.Data;
import java.util.List;
/**
* @author: 陈韦龙
* @date: 2022年12月12日 15:52
*/
@Data
public class UpdateDynamicScriptFrom {
/**
* 主键
*/
private String id;
/**
* 脚本Id
*/
private String scriptId;
/**
* 脚本名称
*/
private String scriptName;
/**
* 规则
*/
private List<Role> roles;
/**
* 内容
*/
private SoutFrom content;
}

View File

@ -0,0 +1,21 @@
package com.example.liteflow.mysql.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.example.liteflow.mysql.entity.DynamicScriptEntity;
import com.example.liteflow.mysql.model.dynamicScript.CreateDynamicScriptFrom;
/**
* @author 75349
* @description 针对表dynamic_script的数据库操作Service
* @createDate 2022-12-12 15:46:00
*/
public interface DynamicScriptService extends IService<DynamicScriptEntity> {
void createCostCenterNode(CreateDynamicScriptFrom createDynamicScriptFrom);
void createCostCenterIfNode(CreateDynamicScriptFrom createDynamicScriptFrom);
void createProfitCenterNode(CreateDynamicScriptFrom createDynamicScriptFrom);
void createProfitCenterIfNode(CreateDynamicScriptFrom createDynamicScriptFrom);
}

View File

@ -0,0 +1,210 @@
package com.example.liteflow.mysql.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.liteflow.mysql.entity.DynamicScriptEntity;
import com.example.liteflow.mysql.enums.NodeEnum;
import com.example.liteflow.mysql.mapper.DynamicScriptMapper;
import com.example.liteflow.mysql.model.SoutFrom;
import com.example.liteflow.mysql.model.dynamicScript.CreateDynamicScriptFrom;
import com.example.liteflow.mysql.model.dynamicScript.UpdateDynamicScriptFrom;
import com.example.liteflow.mysql.model.role.Role;
import com.example.liteflow.mysql.service.DynamicScriptService;
import com.yomahub.liteflow.builder.LiteFlowNodeBuilder;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author 75349
* @description 针对表dynamic_script的数据库操作Service实现
* @createDate 2022-12-12 15:46:00
*/
@Service
public class DynamicScriptServiceImpl extends ServiceImpl<DynamicScriptMapper, DynamicScriptEntity>
implements DynamicScriptService {
private final static String costCenterCmp = "com.example.liteflow.mysql.cmp.costCenter.CostCenterCmp";
private final static String costCenterSoutCmp = "com.example.liteflow.mysql.cmp.costCenter.CostCenterSoutCmp";
private final static String profitCenterCmp = "com.example.liteflow.mysql.cmp.profitCenter.ProfitCenterCmp";
private final static String profitCenterSoutCmp = "com.example.liteflow.mysql.cmp.profitCenter.ProfitCenterSoutCmp";
@Override
public void createCostCenterNode(CreateDynamicScriptFrom createDynamicScriptFrom) {
String scriptId = createDynamicScriptFrom.getScriptId();
String scriptName = createDynamicScriptFrom.getScriptName();
SoutFrom content = createDynamicScriptFrom.getContent();
LambdaQueryWrapper<DynamicScriptEntity> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(DynamicScriptEntity::getScriptId, scriptId);
DynamicScriptEntity entity = this.getOne(queryWrapper);
if (ObjectUtil.isNotNull(entity)) {
UpdateDynamicScriptFrom updateDynamicScriptFrom = BeanUtil.toBean(createDynamicScriptFrom, UpdateDynamicScriptFrom.class);
updateDynamicScriptFrom.setId(entity.getId());
this.updateCostCenterNode(updateDynamicScriptFrom);
} else {
DynamicScriptEntity dynamicScriptEntity = new DynamicScriptEntity();
dynamicScriptEntity.setScriptId(scriptId);
dynamicScriptEntity.setScriptName(scriptName);
dynamicScriptEntity.setScriptContent(JSONUtil.toJsonStr(content));
dynamicScriptEntity.setNodeType(NodeEnum.CommonNode.getName());
dynamicScriptEntity.setScriptClass(costCenterSoutCmp);
this.save(dynamicScriptEntity);
LiteFlowNodeBuilder.createCommonNode().setId(scriptId)
.setName(scriptName)
.setClazz(costCenterSoutCmp)
.build();
}
}
@Override
public void createCostCenterIfNode(CreateDynamicScriptFrom createDynamicScriptFrom) {
String scriptId = createDynamicScriptFrom.getScriptId();
String scriptName = createDynamicScriptFrom.getScriptName();
List<Role> roles = createDynamicScriptFrom.getRoles();
LambdaQueryWrapper<DynamicScriptEntity> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(DynamicScriptEntity::getScriptId, scriptId);
DynamicScriptEntity entity = this.getOne(queryWrapper);
if (ObjectUtil.isNotNull(entity)) {
UpdateDynamicScriptFrom updateDynamicScriptFrom = BeanUtil.toBean(createDynamicScriptFrom, UpdateDynamicScriptFrom.class);
updateDynamicScriptFrom.setId(entity.getId());
this.updateCostCenterNode(updateDynamicScriptFrom);
} else {
DynamicScriptEntity dynamicScriptEntity = new DynamicScriptEntity();
dynamicScriptEntity.setScriptId(scriptId);
dynamicScriptEntity.setScriptName(scriptName);
dynamicScriptEntity.setScriptRole(JSONUtil.toJsonStr(roles));
dynamicScriptEntity.setNodeType(NodeEnum.IfNode.getName());
dynamicScriptEntity.setScriptClass(costCenterCmp);
this.save(dynamicScriptEntity);
LiteFlowNodeBuilder.createIfNode().setId(scriptId)
.setName(scriptName)
.setClazz(costCenterCmp)
.build();
}
}
public void updateCostCenterNode(UpdateDynamicScriptFrom updateDynamicScriptFrom) {
String id = updateDynamicScriptFrom.getId();
String scriptId = updateDynamicScriptFrom.getScriptId();
String scriptName = updateDynamicScriptFrom.getScriptName();
SoutFrom content = updateDynamicScriptFrom.getContent();
LambdaUpdateWrapper<DynamicScriptEntity> queryWrapper = new LambdaUpdateWrapper<>();
queryWrapper.eq(DynamicScriptEntity::getId, id)
.set(DynamicScriptEntity::getScriptId, scriptId)
.set(DynamicScriptEntity::getScriptName, scriptName)
.set(DynamicScriptEntity::getScriptContent, JSONUtil.toJsonStr(content));
this.update(queryWrapper);
LiteFlowNodeBuilder.createCommonNode().setId(scriptId)
.setName(scriptName)
.setClazz(costCenterSoutCmp)
.build();
}
public void updateCostCenterIfNode(UpdateDynamicScriptFrom updateDynamicScriptFrom) {
String id = updateDynamicScriptFrom.getId();
String scriptId = updateDynamicScriptFrom.getScriptId();
String scriptName = updateDynamicScriptFrom.getScriptName();
List<Role> roles = updateDynamicScriptFrom.getRoles();
LambdaUpdateWrapper<DynamicScriptEntity> queryWrapper = new LambdaUpdateWrapper<>();
queryWrapper.eq(DynamicScriptEntity::getId, id)
.set(DynamicScriptEntity::getScriptId, scriptId)
.set(DynamicScriptEntity::getScriptName, scriptName)
.set(DynamicScriptEntity::getScriptRole, JSONUtil.toJsonStr(roles));
this.update(queryWrapper);
LiteFlowNodeBuilder.createIfNode().setId(scriptId)
.setName(scriptName)
.setClazz(costCenterCmp)
.build();
}
@Override
public void createProfitCenterNode(CreateDynamicScriptFrom createDynamicScriptFrom) {
String scriptId = createDynamicScriptFrom.getScriptId();
String scriptName = createDynamicScriptFrom.getScriptName();
SoutFrom content = createDynamicScriptFrom.getContent();
LambdaQueryWrapper<DynamicScriptEntity> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(DynamicScriptEntity::getScriptId, scriptId);
DynamicScriptEntity entity = this.getOne(queryWrapper);
if (ObjectUtil.isNotNull(entity)) {
UpdateDynamicScriptFrom updateDynamicScriptFrom = BeanUtil.toBean(createDynamicScriptFrom, UpdateDynamicScriptFrom.class);
updateDynamicScriptFrom.setId(entity.getId());
this.updateProfitCenterNode(updateDynamicScriptFrom);
} else {
DynamicScriptEntity dynamicScriptEntity = new DynamicScriptEntity();
dynamicScriptEntity.setScriptId(scriptId);
dynamicScriptEntity.setScriptName(scriptName);
dynamicScriptEntity.setScriptContent(JSONUtil.toJsonStr(content));
dynamicScriptEntity.setNodeType(NodeEnum.CommonNode.getName());
dynamicScriptEntity.setScriptClass(profitCenterSoutCmp);
this.save(dynamicScriptEntity);
LiteFlowNodeBuilder.createCommonNode().setId(scriptId)
.setName(scriptName)
.setClazz(profitCenterSoutCmp)
.build();
}
}
@Override
public void createProfitCenterIfNode(CreateDynamicScriptFrom createDynamicScriptFrom) {
String scriptId = createDynamicScriptFrom.getScriptId();
String scriptName = createDynamicScriptFrom.getScriptName();
List<Role> roles = createDynamicScriptFrom.getRoles();
LambdaQueryWrapper<DynamicScriptEntity> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(DynamicScriptEntity::getScriptId, scriptId);
DynamicScriptEntity entity = this.getOne(queryWrapper);
if (ObjectUtil.isNotNull(entity)) {
UpdateDynamicScriptFrom updateDynamicScriptFrom = BeanUtil.toBean(createDynamicScriptFrom, UpdateDynamicScriptFrom.class);
updateDynamicScriptFrom.setId(entity.getId());
this.updateProfitCenterIfNode(updateDynamicScriptFrom);
} else {
DynamicScriptEntity dynamicScriptEntity = new DynamicScriptEntity();
dynamicScriptEntity.setScriptId(scriptId);
dynamicScriptEntity.setScriptName(scriptName);
dynamicScriptEntity.setScriptRole(JSONUtil.toJsonStr(roles));
dynamicScriptEntity.setNodeType(NodeEnum.IfNode.getName());
dynamicScriptEntity.setScriptClass(profitCenterCmp);
this.save(dynamicScriptEntity);
LiteFlowNodeBuilder.createIfNode().setId(scriptId)
.setName(scriptName)
.setClazz(profitCenterCmp)
.build();
}
}
public void updateProfitCenterNode(UpdateDynamicScriptFrom updateDynamicScriptFrom) {
String id = updateDynamicScriptFrom.getId();
String scriptId = updateDynamicScriptFrom.getScriptId();
String scriptName = updateDynamicScriptFrom.getScriptName();
SoutFrom content = updateDynamicScriptFrom.getContent();
LambdaUpdateWrapper<DynamicScriptEntity> queryWrapper = new LambdaUpdateWrapper<>();
queryWrapper.eq(DynamicScriptEntity::getId, id)
.set(DynamicScriptEntity::getScriptId, scriptId)
.set(DynamicScriptEntity::getScriptName, scriptName)
.set(DynamicScriptEntity::getScriptContent, JSONUtil.toJsonStr(content));
this.update(queryWrapper);
LiteFlowNodeBuilder.createCommonNode().setId(scriptId)
.setName(scriptName)
.setClazz(profitCenterSoutCmp)
.build();
}
public void updateProfitCenterIfNode(UpdateDynamicScriptFrom updateDynamicScriptFrom) {
String id = updateDynamicScriptFrom.getId();
String scriptId = updateDynamicScriptFrom.getScriptId();
String scriptName = updateDynamicScriptFrom.getScriptName();
List<Role> roles = updateDynamicScriptFrom.getRoles();
LambdaUpdateWrapper<DynamicScriptEntity> queryWrapper = new LambdaUpdateWrapper<>();
queryWrapper.eq(DynamicScriptEntity::getId, id)
.set(DynamicScriptEntity::getScriptId, scriptId)
.set(DynamicScriptEntity::getScriptName, scriptName)
.set(DynamicScriptEntity::getScriptRole, JSONUtil.toJsonStr(roles));
this.update(queryWrapper);
LiteFlowNodeBuilder.createIfNode().setId(scriptId)
.setName(scriptName)
.setClazz(profitCenterCmp)
.build();
}
}

View File

@ -78,7 +78,7 @@ public class NodeServiceImpl implements NodeService {
public void createProfitCenterNode(CreateNodeFrom createNodeFrom) {
LiteFlowNodeBuilder.createCommonNode().setId(createNodeFrom.getId())
.setName(createNodeFrom.getName())
.setClazz("com.example.liteflow.mysql.cmp.profitCenter .ProfitCenterSoutCmp")
.setClazz("com.example.liteflow.mysql.cmp.profitCenter.ProfitCenterSoutCmp")
.build();
// flowExecutor.reloadRule();
}

View File

@ -8,22 +8,22 @@ spring:
password: 123456
liteflow:
# rule-source: liteflow/*.el.xml
rule-source-ext-data-map:
url: jdbc:mysql://localhost:3306/test_db
driverClassName: com.mysql.cj.jdbc.Driver
username: root
password: 123456
applicationName: demo
rule-source: liteflow/*.el.xml
# rule-source-ext-data-map:
# url: jdbc:mysql://localhost:3306/test_db
# driverClassName: com.mysql.cj.jdbc.Driver
# username: root
# password: 123456
# applicationName: demo
#以下是chain表的配置这个一定得有
chainTableName: chain
chainApplicationNameField: application_name
chainNameField: chain_name
elDataField: el_data
# chainTableName: chain
# chainApplicationNameField: application_name
# chainNameField: chain_name
# elDataField: el_data
#以下是script表的配置如果你没使用到脚本下面可以不配置
scriptTableName: script
scriptApplicationNameField: application_name
scriptIdField: script_id
scriptNameField: script_name
scriptDataField: script_data
scriptTypeField: script_type
# scriptTableName: script
# scriptApplicationNameField: application_name
# scriptIdField: script_id
# scriptNameField: script_name
# scriptDataField: script_data
# scriptTypeField: script_type

View File

@ -67,7 +67,16 @@ INSERT INTO `base_data`(`id`, `type`, `attribution`, `content`, `content_type`,
-- INSERT INTO `chain`(`id`, `application_name`, `chain_name`, `chain_desc`, `el_data`, `create_time`) VALUES (8, 'demo', 'profit02', '测试流程', 'IF(profitCenter02Cmp, ProfitCenter02SoutCmp, sout);', '2022-12-06 16:03:34');
-- INSERT INTO `chain`(`id`, `application_name`, `chain_name`, `chain_desc`, `el_data`, `create_time`) VALUES (9, 'demo', 'costAndProfit', '测试流程', 'THEN(cost01AndCost02, profit01AndProfit02);', '2022-12-06 16:03:34');
CREATE TABLE `dynamic_script` (
`id` varchar(255) NOT NULL COMMENT '主键',
`script_id` varchar(32) NULL DEFAULT NULL COMMENT '脚本Id',
`script_name` varchar(64) NULL DEFAULT NULL COMMENT '脚本名称',
`script_class` text NULL COMMENT '脚本对应类名',
`node_type` varchar(30) NULL COMMENT '脚本对应节点类型',
`script_role` text NULL COMMENT '脚本规则',
`script_content` text NULL COMMENT '脚本内容'
PRIMARY KEY (`id`)
);

View File

@ -1,60 +1,60 @@
<?xml version="1.0" encoding="UTF-8"?>
<flow>
<chain name="mainChain">
THEN(
s3, s4, s5, s6,
IF (sectionClassification,
IF (businessType,
IF (salesman,
IF (businessCategory,
s7,
s9
),
s9
),
s9
),
IF (businessType,
IF (salesman,
s8,
s9
),
IF (businessType,
s8,
s9
)
)
)
);
</chain>
<!-- <chain name="mainChain">-->
<!-- THEN(-->
<!-- s3, s4, s5, s6,-->
<!-- IF (sectionClassification,-->
<!-- IF (businessType,-->
<!-- IF (salesman,-->
<!-- IF (businessCategory,-->
<!-- s7,-->
<!-- s9-->
<!-- ),-->
<!-- s9-->
<!-- ),-->
<!-- s9-->
<!-- ),-->
<!-- IF (businessType,-->
<!-- IF (salesman,-->
<!-- s8,-->
<!-- s9-->
<!-- ),-->
<!-- IF (businessType,-->
<!-- s8,-->
<!-- s9-->
<!-- )-->
<!-- )-->
<!-- )-->
<!-- );-->
<!-- </chain>-->
<chain name="costAndProfit">
THEN(cost01AndCost02, profit01AndProfit02);
</chain>
<!-- <chain name="costAndProfit">-->
<!-- THEN(cost01AndCost02, profit01AndProfit02);-->
<!-- </chain>-->
<chain name="cost01AndCost02">
IF(costCenter01Cmp, CostCenter01SoutCmp, IF(costCenter02Cmp, CostCenter02SoutCmp, sout));
</chain>
<!-- <chain name="cost01AndCost02">-->
<!-- IF(costCenter01Cmp, CostCenter01SoutCmp, IF(costCenter02Cmp, CostCenter02SoutCmp, sout));-->
<!-- </chain>-->
<chain name="cost01">
IF(costCenter01Cmp, CostCenter01SoutCmp, sout);
</chain>
<!-- <chain name="cost01">-->
<!-- IF(costCenter01Cmp, CostCenter01SoutCmp, sout);-->
<!-- </chain>-->
<chain name="cost02">
IF(costCenter02Cmp, CostCenter02SoutCmp, sout);
</chain>
<!-- <chain name="cost02">-->
<!-- IF(costCenter02Cmp, CostCenter02SoutCmp, sout);-->
<!-- </chain>-->
<chain name="profit01AndProfit02">
IF(profitCenter01Cmp, ProfitCenter01SoutCmp, IF(profitCenter02Cmp, ProfitCenter02SoutCmp, sout));
</chain>
<!-- <chain name="profit01AndProfit02">-->
<!-- IF(profitCenter01Cmp, ProfitCenter01SoutCmp, IF(profitCenter02Cmp, ProfitCenter02SoutCmp, sout));-->
<!-- </chain>-->
<chain name="profit01">
IF(profitCenter01Cmp, ProfitCenter01SoutCmp, sout);
</chain>
<!-- <chain name="profit01">-->
<!-- IF(profitCenter01Cmp, ProfitCenter01SoutCmp, sout);-->
<!-- </chain>-->
<chain name="profit02">
IF(profitCenter02Cmp, ProfitCenter02SoutCmp, sout);
</chain>
<!-- <chain name="profit02">-->
<!-- IF(profitCenter02Cmp, ProfitCenter02SoutCmp, sout);-->
<!-- </chain>-->
<nodes>
<node id="s3" name="sectionClassification" type="script">