关于工作流的简单代码分析


class JudgeFactory {
    public static Judge generateJudge(String judgeName) {
        if ("EqualJudge".equals(judgeName)) {//不同类型的数据(date int string )比较  要做成多态  新增Judge的实现类
            return new EqualJudge();
        } else if ("ContainJudge".equals(judgeName)) {
            return new ContainJudge();
        } else {
            return new BelongJudge();
        }
    }
}

interface Judge {
    boolean run(Condition condition);
}

class GTJudge implements Judge{//数字的大小比较器

    @Override
    public boolean run(Condition condition) {
        boolean flag = (int)condition.getSource() >(int)condition.getTarget();
        return flag;
    }
}
class GTJudgeDate implements Judge{//日期的大小比较器

    @Override
    public boolean run(Condition condition) {//重写日期的比较
        
        return false;
    }
}


class EqualJudge implements Judge {

    @Override
    public boolean run(Condition condition) {//字段  数字  日期
        //等于  不等于判断
        boolean flag = condition.getTarget().equals(condition.getSource());
        condition.setFlag(flag);
        return flag;
    }
}

class ContainJudge implements Judge {

    @Override
    public boolean run(Condition condition) {//部门树这种  定义一个基类
        //包含  不包含
        List list = (List) condition.getSource();//按逻辑查出一个list  此处简写

        boolean flag = list.contains(condition.getTarget());
        condition.setFlag(flag);
        return flag;
    }
}

class BelongJudge implements Judge {

    @Override
    public boolean run(Condition condition) {//部门树这种  定义一个基类
        //包含  不包含
        List list = (List) condition.getTarget();//按逻辑查出一个list  此处简写

        boolean flag = list.contains(condition.getSource());
        condition.setFlag(flag);
        return flag;
    }
}


class Order {//工单

}


class Workflow {//工作流的表

    private List<Handler> handlerList;//在数据库中存入 处理节点的ID集合
}



class Handler {//控制工单流向  数据库对应储存为 节点表

    private String successNextCode;
    private String failNextCode;
    private String code;//当前处理节点的代码
    private ConditionGroup group;//从数据库的 处理节点表 拿出group 的Json字符串

    public String handle(Order Order) {

        boolean result = group.compute(Order);//计算最终的  yes  no
        if (result) {
            update(Order);//项目中只是改变了处理人,其他的没有说明
            return successNextCode;//yes 时在数据库record表里存入下一个 调用的Handler的code
        }
        return failNextCode;//no 时 从数据库找出 处理节点表 找出 下一个调用的Handler  的code
    }

    //满足要求将工单内容更改
    private void update(Order Order) {
        //将处理动作 记录 到record
    }

    public String getSuccessNextCode() {
        return successNextCode;
    }

    public void setSuccessNextCode(String successNextCode) {
        this.successNextCode = successNextCode;
    }

    public String getFailNextCode() {
        return failNextCode;
    }

    public void setFailNextCode(String failNextCode) {
        this.failNextCode = failNextCode;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public ConditionGroup getGroup() {
        return group;
    }

    public void setGroup(ConditionGroup group) {
        this.group = group;
    }
}


class WorkflowRecord {
    private int handlerId;

    public int getHandlerId() {
        return handlerId;
    }

    public void setHandlerId(int handlerId) {
        this.handlerId = handlerId;
    }
}

class WorkflowService {//工作流服务
    public void runWorkflow(int orderNumber) {
        Order order = getOrder(orderNumber);
        WorkflowRecord record = getWorkflowRecord(orderNumber);
        Handler handler = getWorkflowNode(record.getHandlerId());
        handler.handle(order);
    }

    private Handler getWorkflowNode(int handlerId) {
        return null;//从数据库拿出handler
    }

    private WorkflowRecord getWorkflowRecord(int orderNumber) {
        return null;//从数据库拿出record
    }

    private Order getOrder(int id) {//从数据库拿出order
        return null;
    }
}

class ConditionGroup {

    private boolean yesOrNo;

    public List<Condition> orList;

    public List<Condition> andList;

    public boolean computeAnd(Order dto) {
        for (int i = 0; i < andList.size(); i++) {
            Condition condition = andList.get(i);
            Object source = condition.getSourceFromOrderByFieldName(dto);
            condition.setSource(source);
            Judge judge = JudgeFactory.generateJudge(condition.getJudgeName());//通过名称调用judge
            judge.run(condition);
        }
        int count = (int) andList.stream().filter(x -> x.getFlag()).count();

        return count == andList.size();
    }

    public boolean compute(Order dto) {
        return yesOrNo ? (computeAnd(dto) && computeAnd(dto)) : computeOr(dto) || computeAnd(dto);
    }

    private boolean computeOr(Order dto) {
        for (int i = 0; i < andList.size(); i++) {
            Condition condition = andList.get(i);
            Object source = condition.getSourceFromOrderByFieldName(dto);
            condition.setSource(source);
            Judge judge = JudgeFactory.generateJudge(condition.getJudgeName());//通过名称调用judge

            judge.run(condition);
        }
        int count = (int) andList.stream().filter(x -> !x.getFlag()).count();

        return count != 0;
    }

    public boolean isYesOrNo() {
        return yesOrNo;
    }

    public void setYesOrNo(boolean yesOrNo) {
        this.yesOrNo = yesOrNo;
    }

    public List<Condition> getOrList() {
        return orList;
    }

    public void setOrList(List<Condition> orList) {
        this.orList = orList;
    }

    public List<Condition> getAndList() {
        return andList;
    }

    public void setAndList(List<Condition> andList) {
        this.andList = andList;
    }


}

class Condition {
    private Object target;//存在数据库
    private Object source;//order设置
    private Boolean flag;//计算结果
    private String judgeName;//判断器的名称  
    private String fieldName;//order中的字段名称

    public String getFieldName() {
        return fieldName;
    }

    public void setFieldName(String fieldName) {
        this.fieldName = fieldName;
    }

    public String getJudgeName() {
        return judgeName;
    }

    public void setJudgeName(String judgeName) {
        this.judgeName = judgeName;
    }

    public Boolean getFlag() {
        return flag;
    }

    public void setFlag(Boolean flag) {
        this.flag = flag;
    }


    public Object getTarget() {
        return target;
    }

    public void setTarget(Object target) {
        this.target = target;
    }

    public Object getSource() {
        return source;
    }

    public void setSource(Object source) {
        this.source = source;
    }

    public Object getSourceFromOrderByFieldName(Order dto) {
        Map<String, Object> map = Util.objectToMap(dto);
        return map.get(fieldName);
    }


}

class Util {
    public static Map<String, Object> objectToMap(Object obj) {
        Map<String, Object> map = new HashMap<>();
        try {
            Class<?> clazz = obj.getClass();
            for (Field field : clazz.getDeclaredFields()) {
                field.setAccessible(true);
                String fieldName = field.getName();
                Object value = field.get(obj);
                map.put(fieldName, value);
            }
        } catch (Exception e) {

        }
        return map;
    }
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值