Flutter与IDEMPIERE集成插件idempiere_rest的使用

发布于 1周前 作者 sinazl 来自 Flutter

Flutter与IDEMPIERE集成插件idempiere_rest的使用

标题

Flutter与IDEMPIERE集成插件idempiere_rest的使用

内容

一个用于简化对IDEMPIERE REST API(https://github.com/bxservice/idempiere-rest)消费的Dart客户端。

特性

此包实现了官方文档中列出的一些API调用(https://wiki.idempiere.org/en/REST_Web_Services

  • 一步登录
  • 正常登录
  • 请求PO集合
  • 请求单个PO ID
  • 创建PO
  • 删除PO
  • 更新PO
  • 流程

使用方法

主类是IdempiereClient,它是一个单例。一旦实例化,必须调用setBaseUrl方法。

// 实例化单例IDEMPIERE客户端并设置API URL
IdempiereClient().setBaseUrl("https://mundodocafe.brerp.cloud/api/v11");

之后,您可以根据情况选择一步登录或正常登录。

如果已经知道参数(Client, Role, Org, Warehouse, Lang),可以使用一步登录:

IdempiereClient().oneStepLogin("/auth/tokens", "superuser @ brerp.com.br",
      "cafe123", "1000000", "1000000")

要创建或更新PO,需要创建一个扩展抽象类ModelBase的子类,并实现其方法:

import 'package:idempiere_rest/src/model_base.dart';

class MBPartner extends ModelBase {
    
    late String name;

    MBPartner(Map<String, dynamic> json) : super(json) {
        id = json['id'];
        name = json['Name'];
    }

    [@override](/user/override)
    Map<String, dynamic> toJson() {
        return {'Name' : name};
    }

    [@override](/user/override)
    MBPartner fromJson(Map<String, dynamic> json) {
        id = json['id'];
        name = json['Name'];
        return this;
    }
}

然后,我们可以进行PO请求:

// 获取记录
List<MBPartner> records = await IdempiereClient().get<MBPartner>(
          "/models/c_bpartner", (json) => MBPartner(json))

// 创建记录
MBPartner newRecord = MBPartner();
IdempiereClient().post<MBPartner>("/models/c_bpartner", newRecord); 

// 更新记录
IdempiereClient().put<MBPartner>("/models/c_bpartner", newRecord);

完整示例

包括正常登录和GET请求中的查询选项,请参阅example/idempiere_rest_example.dart

贡献

如果您发现任何bug或有任何建议,请随时创建问题或提交pull request。

示例代码

import 'package:idempiere_rest/idempiere_rest.dart';
import 'package:test/test.dart';

void main() async {
  // 实例化单例IDEMPIERE客户端并设置API URL
  IdempiereClient().setBaseUrl("https://mundodocafe.brerp.cloud/api/v11");
  // 第一次令牌请求
  LoginResponse login = await IdempiereClient()
      .login("/auth/tokens", "superuser @ brerp.com.br", "cafe123");

  // 使用第一次客户端ID(仅示例目的)
  int clientId = login.clients.first.id!;
  List<Role> roles = await IdempiereClient().getRoles(clientId);

  // 使用第一个角色ID(仅示例目的)
  int roleId = roles.first.id!;
  List<Organization> orgs =
      await IdempiereClient().getOrganizations(clientId, roleId);

  // 使用第一个组织ID(仅示例目的)
  int orgId = orgs.first.id!;
  List<Warehouse> warehouses =
      await IdempiereClient().getWarehouses(clientId, roleId, orgId);

  // 使用第一个仓库ID(仅示例目的)
  int whId = warehouses.first.id!;

  // 初始化会话
  IdempiereClient().initSession(
      "/auth/tokens", login.token, login.clients.first.id!, roleId,
      organizationId: orgId, warehouseId: whId);

  FilterBuilder filter = FilterBuilder();
  filter
      .addFilter('C_BP_Group_ID', Operators.eq, 1000000)
      .and()
      .addFilter('COF_SituacaoComercial', Operators.eq, 'PA')
      .and()
      .addFilter('lbr_IE', Operators.contains, '1');

  ExpandBuilder expand = ExpandBuilder();

  FilterBuilder childFilter = FilterBuilder();
  childFilter.addFilter('Name', Operators.contains, 'a');

  expand.expand("AD_User",
      columnName: ['Name', 'Phone'],
      filter: childFilter,
      orderBy: ['Name', 'EMail'],
      top: 10,
      skip: 5);

  List<MBPartner> records = await IdempiereClient().get<MBPartner>(
      "/models/c_bartner", (json) => MBPartner(json),
      filter: filter,
      expand: expand,
      orderBy: ['COF_SituacaoComercial', 'Name'],
      select: ['Name', 'Name2'],
      top: 10,
      skip: 2,
      showsql: true);

  print(records);

  MBPartner newRecord = MBPartner.newTest(1000000, 'BParner Test');
  MBPartner? record =
      await IdempiereClient().post<MBPartner>("/models/c_bartner", newRecord);

  print(record);

  record = await IdempiereClient().getRecord<MBPartner>(
      "/models/c_bartner", record.id!, (json) => MBPartner(json));

  print(record);

  record!.name = 'BPartner Test Put';
  MBPartner updatedRecord =
      await IdempiereClient().put<MBPartner>("/models/c_bartner", record);
  print(updatedRecord);

  bool isDeleted =
      await IdempiereClient().delete("/models/c_bartner", record.id!);
  print(isDeleted);

  ProcessSummary ps = await IdempiereClient().runProcess(
      "/processes/ad_role_accessupdate",
      params: {'AD_Role_ID': 1000000, 'ResetAccess': 'N'});

  print(ps.logs);
}

class MBPartner extends ModelBase {
  late int cBPGroupId;
  late String name;

  MBPartner.newTest(this.cBPGroupId, this.name) : super({});

  MBPartner(Map<String, dynamic> json) : super(json) {
    id = json['id'];
    name = json['Name'];
  }

  [@override](/user/override)
  Map<String, dynamic> toJson() {
    Map<String, dynamic> data = {};
    if (id != null) {
      data['id'] = id;
    }

    data['Name'] = name;
    data['C_BP_Group_ID'] = cBPGroupId;
    data['AD_Language'] = 'en_US';

    return data;
  }

  [@override](/user/override)
  MBPartner fromJson(Map<String, dynamic> json) {
    id = json['id'];
    name = json['Name'];
    return this;
  }
}

更多关于Flutter与IDEMPIERE集成插件idempiere_rest的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter与IDEMPIERE集成插件idempiere_rest的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter应用中集成并使用IDEMPIERE的REST API插件idempiere_rest的示例代码。这个示例将展示如何设置Flutter项目、配置依赖项、以及如何使用插件来与IDEMPIERE进行交互。

1. 设置Flutter项目

首先,确保你已经安装了Flutter和Dart SDK,并且已经配置好了开发环境。然后,创建一个新的Flutter项目:

flutter create my_idempiere_app
cd my_idempiere_app

2. 添加idempiere_rest依赖项

打开pubspec.yaml文件,在dependencies部分添加idempiere_rest插件:

dependencies:
  flutter:
    sdk: flutter
  idempiere_rest: ^latest_version  # 替换为实际的最新版本号

然后运行flutter pub get来安装依赖项。

3. 配置IDEMPIERE的API URL

在你的Flutter项目中,你需要在某个地方配置IDEMPIERE的REST API的URL。这通常可以在应用的初始化部分完成。

4. 使用idempiere_rest插件

下面是一个简单的示例,展示了如何使用idempiere_rest插件来获取IDEMPIERE中的数据。

import 'package:flutter/material.dart';
import 'package:idempiere_rest/idempiere_rest.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter IDEMPIERE Integration',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: IdempiereScreen(),
    );
  }
}

class IdempiereScreen extends StatefulWidget {
  @override
  _IdempiereScreenState createState() => _IdempiereScreenState();
}

class _IdempiereScreenState extends State<IdempiereScreen> {
  final IdempiereRestClient idempiereClient = IdempiereRestClient(
    baseUrl: 'https://your-idempiere-instance-url/Adempiere/ServletRest', // 替换为你的IDEMPIERE实例的URL
    user: 'your-username', // 替换为你的IDEMPIERE用户名
    password: 'your-password', // 替换为你的IDEMPIERE密码
  );

  String _responseData = '';

  @override
  void initState() {
    super.initState();
    _fetchData();
  }

  Future<void> _fetchData() async {
    try {
      // 假设我们想要获取某个表的数据,比如BPartner(商业伙伴)
      final response = await idempiereClient.get('/AD_BPartner', parameters: {
        'p_ClientID': '100', // 根据你的IDEMPIERE实例配置调整参数
      });

      if (response.isSuccessful) {
        setState(() {
          _responseData = response.body.toString();
        });
      } else {
        setState(() {
          _responseData = 'Error: ${response.statusCode}';
        });
      }
    } catch (e) {
      setState(() {
        _responseData = 'Error: ${e.message}';
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('IDEMPIERE Data'),
      ),
      body: Center(
        child: Text(_responseData),
      ),
    );
  }
}

5. 运行应用

确保你的IDEMPIERE实例正在运行,并且REST API已经启用。然后,通过以下命令运行你的Flutter应用:

flutter run

这个示例展示了如何使用idempiere_rest插件来从IDEMPIERE获取数据。根据你的实际需求,你可能需要调整API路径和请求参数。插件的文档和IDEMPIERE的API文档将为你提供更多的细节和选项。

回到顶部