Exemple #1
0
def get_model_by_project_id(project_id):
    """
    获取项目对应的model(执行流程)
    :param project_id:
    :return:
    """
    # 获取 model
    model = ModelDao.get_model_by_project_id(project_id)
    if model is False:
        return False

    # 获取 operator
    operators = OperatorDao.get_operator_by_model_id(model.id)
    if operators is False:
        return False

    # 获取 operator_type
    operator_types = OperatorTypeDao.get_all_operator_type()
    if operator_types is False:
        return False

    # TODO : 查询数据源表

    operator_types_dict = dict()
    for operator_type in operator_types:
        operator_types_dict[operator_type.id] = operator_type

    # 返回结果
    config = dict()
    for operator in operators:
        if operator_types_dict[operator.operator_type_id].id == 5001:
            data_operator_type = json.loads(
                operator.operator_config)['fileUrl'][0][operator.id].split(
                    '/')[-1]
        else:
            data_operator_type = operator_types_dict[
                operator.operator_type_id].type_name
        config[operator.id] = {
            'type': data_operator_type,
            'name': operator_types_dict[operator.operator_type_id].id,
            'location': json.loads(operator.operator_style)['location'],
            'config': json.loads(operator.operator_config),
            'next': operator.child_operator_ids.split(','),
            "pre": operator.father_operator_ids.split(',')
        }
    model_config = json.loads(model.config)
    relationship = []
    for item in model_config['relationship'].split('*,'):
        relationship.append(list_str_to_list(item))
    config_order = json.loads(model_config['config_order'])
    return {
        'projectId': project_id,
        'config': config,
        'startNode': model.start_nodes.split(','),
        'relationship': relationship,
        'config_order': config_order
    }
Exemple #2
0
def get_run_status_by_project_id(project_id, model_execute_id):
    """
    获取某次执行的状态和其中的每个算子的状态

    :param project_id:
    :param model_execute_id: model的执行记录ID
    :return:
    """

    # 获取 model
    model = ModelDao.get_model_by_project_id(project_id)
    if model is False:
        return False

    # 获取 operator
    operators = OperatorDao.get_operator_by_model_id(model.id)
    if operators is False:
        return False

    # 构造dict
    id_operator_dict = {}
    for operator in operators:
        id_operator_dict[operator.id] = operator

    # 查看此次执行记录(状态、起始节点)
    model_execute_ = ModelExecuteDao.get_model_execute_by_id(model_execute_id)
    operator_from_one_ids = model_execute_.start_nodes.split(',')

    # 查看此次执行的所有节点的状态
    result = dict()
    while operator_from_one_ids:
        item = operator_from_one_ids.pop(0)
        if not (item is None or item == ''):
            result[id_operator_dict[item].id] = {
                "status": id_operator_dict[item].status,
                "log": id_operator_dict[item].run_info
            }
            operator_from_one_ids.extend(
                id_operator_dict[item].child_operator_ids.split(','))

    return {
        "modelExecuteStatus": model_execute_.status,
        "operatorStatus": result
    }
Exemple #3
0
def get_status_model_execute_end(project_id, start_operator_ids):
    """
    获取运行结束后的状态

    :param project_id:
    :param start_operator_ids:
    :return:
    """
    # 获取 model
    model = ModelDao.get_model_by_project_id(project_id)
    if model is False:
        return False

    # 获取 operator
    operators = OperatorDao.get_operator_by_model_id(model.id)
    if operators is False:
        return False

    # 构造dict
    id_operator_dict = {}
    for operator in operators:
        id_operator_dict[operator.id] = operator

    operator_from_one_ids = []
    operator_from_one_ids.extend(start_operator_ids)

    # 从此次执行 起始节点及以后节点的状态
    status_set = set()
    while operator_from_one_ids:
        item = operator_from_one_ids.pop(0)
        if not (item is None or item == ''):
            status_set.add(id_operator_dict[item].status)
            operator_from_one_ids.extend(
                id_operator_dict[item].child_operator_ids.split(','))

    if len(status_set) == 1 and "success" in status_set:
        return "success"
    else:
        return "error"
Exemple #4
0
def update_model(project_id, start_nodes, config, relationship, config_order):
    """
    更新 model (处理流程图)
    ToDo: 没有考虑数据库操作的原子性
    :param project_id:
    :param start_nodes:
    :param config:
    :return:
    """
    try:
        # 获取model
        model = ModelDao.get_model_by_project_id(project_id)
        if model is False:
            return False

        # 更新model
        update_result = ModelDao.update_with_project_id(
            project_id, start_nodes, relationship, config_order)
        if update_result is False:
            return False

        # 获取 operator
        operator_old = OperatorDao.get_operator_by_model_id(model.id)

        # 新的operator
        operators = []
        config_dict = json.loads(config)
        for operator_id in config_dict.keys():
            operator_dict = config_dict.get(operator_id)
            operator_style = json.dumps(
                {
                    'location': operator_dict['location'],
                }, ensure_ascii=False)
            # json.dumps(operates, ensure_ascii=False)
            ope = Operator(id=operator_id,
                           father_operator_ids=','.join(operator_dict['pre']),
                           child_operator_ids=','.join(operator_dict['next']),
                           model_id=model.id,
                           status='initial',
                           operator_type_id=operator_dict['name'],
                           operator_config=json.dumps(operator_dict['config'],
                                                      ensure_ascii=False),
                           operator_style=operator_style)
            operators.append(ope)

        # 准备删除的算子
        operator_delete = []
        # 准备更新的算子
        operator_update = []
        for old in operator_old:
            flag_exist = False
            for new in operators:
                if old.id == new.id:
                    flag_exist = True
                    operator_update.append([old, new])
                    break
            if not flag_exist:
                operator_delete.append(old)
        # 删除算子
        for delete in operator_delete:
            OperatorDao.delete_operator_by_id(delete.id)
            print("********删除算子", delete)

        # 更新算子
        for update in operator_update:
            update[0].father_operator_ids = update[1].father_operator_ids
            update[0].child_operator_ids = update[1].child_operator_ids
            update[0].model_id = update[1].model_id
            update[0].operator_type_id = update[1].operator_type_id
            update[0].operator_config = update[1].operator_config
            update[0].operator_style = update[1].operator_style
            # 更新算子
            OperatorDao.create_operator([update[0]])
            print("*********更新算子", update[0])

        # 准备添加的算子
        operator_add = []
        for new in operators:
            flag_exist = False
            for old in operator_old:
                if old.id == new.id:
                    flag_exist = True
                    break
            if not flag_exist:
                operator_add.append(new)
        # 添加算子
        OperatorDao.create_operator(operator_add)
        print("*********添加算子", operator_add)
        return True
    except:
        traceback.print_exc()
        return False