add structure
This commit is contained in:
177
lib/model/buyer_model.dart
Normal file
177
lib/model/buyer_model.dart
Normal file
@@ -0,0 +1,177 @@
|
||||
import 'dart:async';
|
||||
import 'dart:convert' show HtmlEscape, base64, utf8;
|
||||
|
||||
import 'package:cloud_firestore/cloud_firestore.dart';
|
||||
import 'package:logging/logging.dart';
|
||||
import 'package:fcs/config.dart';
|
||||
import 'package:fcs/theme/theme.dart';
|
||||
import 'package:fcs/vo/buyer.dart';
|
||||
import 'package:fcs/vo/popup_menu.dart';
|
||||
|
||||
import 'base_model.dart';
|
||||
import 'constants.dart';
|
||||
import 'firebase_helper.dart';
|
||||
|
||||
class BuyerModel extends BaseModel {
|
||||
final log = Logger('BuyerModel');
|
||||
|
||||
StreamSubscription<QuerySnapshot> listener;
|
||||
|
||||
List<Buyer> buyers = [];
|
||||
PopupMenu popupMenu = new PopupMenu(index: 0);
|
||||
PopupMenu sortMenu = new PopupMenu();
|
||||
Buyer searchBuyer;
|
||||
void initUser(user) {
|
||||
super.initUser(user);
|
||||
_loadBuyers();
|
||||
}
|
||||
|
||||
Future<void> _loadBuyers() async {
|
||||
if (!user.isOwnerAndAbove() && !user.hasBuyer()) {
|
||||
return;
|
||||
}
|
||||
|
||||
listener = getQuerySnapshotByOrder(
|
||||
"/$biz_collection/${setting.okEnergyId}/$buyer_collection",
|
||||
'user_name')
|
||||
.listen((snaps) async {
|
||||
buyers.clear();
|
||||
snaps.documents.forEach((d) {
|
||||
buyers.add(Buyer.fromMap(d.data, d.documentID));
|
||||
});
|
||||
notifyListeners();
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
logout() async {
|
||||
if (listener != null) await listener.cancel();
|
||||
buyers = [];
|
||||
}
|
||||
|
||||
Future<Buyer> getBuyer(String buyerID) async {
|
||||
var snap = await getDocSnap(
|
||||
"/$biz_collection/${setting.okEnergyId}/$buyer_collection", buyerID);
|
||||
return Buyer.fromMap(snap.data, snap.documentID);
|
||||
}
|
||||
|
||||
Future<Buyer> loadBuyerProducts(Buyer buyer, {bool force = false}) async {
|
||||
if (!force && buyer.buyerProducts != null && buyer.buyerProducts.length > 0)
|
||||
return buyer;
|
||||
var snaps = await getSnapshot(
|
||||
"/$biz_collection/${setting.okEnergyId}/$buyer_collection/${buyer.id}/$product_collection");
|
||||
buyer.buyerProducts = snaps.documents
|
||||
.map((s) => BuyerProduct.fromMap(s.data, s.documentID))
|
||||
.toList();
|
||||
return buyer;
|
||||
}
|
||||
|
||||
Future<void> delete(Buyer buyer) async {
|
||||
await request("/buyer/${buyer.id}", "DELETE", token: await getToken());
|
||||
}
|
||||
|
||||
Future<void> approve(Buyer buyer) async {
|
||||
await request("/buyer/approve", "PUT",
|
||||
payload: buyer.toMap(), token: await getToken());
|
||||
}
|
||||
|
||||
Future<void> reject(Buyer buyer) async {
|
||||
await request("/buyer/reject", "POST",
|
||||
payload: buyer.toMap(), token: await getToken());
|
||||
}
|
||||
|
||||
Future<void> allocate(Buyer buyer) async {
|
||||
await request("/buyer/allocate", "POST",
|
||||
payload: buyer.toMap(), token: await getToken());
|
||||
}
|
||||
|
||||
void filterStatus(String status, int _selectedIndex, int _sleectedSortIndex) {
|
||||
this.sortMenu.index = _sleectedSortIndex;
|
||||
buyers.clear();
|
||||
if (listener != null) {
|
||||
listener.cancel();
|
||||
}
|
||||
|
||||
this.popupMenu.index = _selectedIndex;
|
||||
String path = "/$biz_collection/${setting.okEnergyId}/$buyer_collection";
|
||||
listener = getFilterStatusSnapshot(path, status, 'user_name')
|
||||
.listen((snaps) async {
|
||||
buyers.clear();
|
||||
snaps.documents.forEach((d) {
|
||||
buyers.add(Buyer.fromMap(d.data, d.documentID));
|
||||
});
|
||||
notifyListeners();
|
||||
});
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
Future<List<Buyer>> search(String searchBuyer) async {
|
||||
if (searchBuyer == null || searchBuyer == '') return List();
|
||||
|
||||
var bytes = utf8.encode(searchBuyer);
|
||||
var base64Str = base64.encode(bytes);
|
||||
HtmlEscape htmlEscape = const HtmlEscape();
|
||||
String escapeBuyer = htmlEscape.convert(base64Str);
|
||||
|
||||
int limit = 20;
|
||||
List<Buyer> _buyers = [];
|
||||
|
||||
try {
|
||||
var data = await request(
|
||||
"/api/fts/$buyer_collection/$escapeBuyer/$limit", "GET",
|
||||
token: await getToken(), url: Config.instance.reportURL);
|
||||
if (data == null) return List();
|
||||
|
||||
data.forEach((buyer) {
|
||||
var _buyer = Buyer.fromJson(buyer);
|
||||
_buyers.add(_buyer);
|
||||
});
|
||||
} catch (e) {
|
||||
// permission error
|
||||
log.warning("buyer error:" + e.toString());
|
||||
return null;
|
||||
}
|
||||
return _buyers;
|
||||
}
|
||||
|
||||
void filterSorting(int _sleectedSortIndex, int _selectedIndex) {
|
||||
this.popupMenu.index = _selectedIndex;
|
||||
buyers.clear();
|
||||
if (listener != null) {
|
||||
listener.cancel();
|
||||
}
|
||||
String _fieldName;
|
||||
bool descending = false;
|
||||
|
||||
if (_sleectedSortIndex == 0) {
|
||||
_fieldName = 'user_name';
|
||||
descending = false;
|
||||
}
|
||||
if (_sleectedSortIndex == 1) {
|
||||
_fieldName = 'user_name';
|
||||
descending = true;
|
||||
}
|
||||
if (_sleectedSortIndex == 2) {
|
||||
_fieldName = 'phone_number';
|
||||
descending = false;
|
||||
}
|
||||
if (_sleectedSortIndex == 3) {
|
||||
_fieldName = 'phone_number';
|
||||
descending = true;
|
||||
}
|
||||
|
||||
this.sortMenu.index = _sleectedSortIndex;
|
||||
String path = "/$biz_collection/${setting.okEnergyId}/$buyer_collection";
|
||||
listener =
|
||||
getFilterSnapshot(path, descending, _fieldName).listen((snaps) async {
|
||||
buyers.clear();
|
||||
snaps.documents.forEach((d) {
|
||||
buyers.add(Buyer.fromMap(d.data, d.documentID));
|
||||
notifyListeners();
|
||||
});
|
||||
|
||||
notifyListeners();
|
||||
});
|
||||
notifyListeners();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user