This commit is contained in:
2021-01-05 18:03:51 +06:30
parent 50763de3f3
commit 045d27945b
11 changed files with 90 additions and 103 deletions

View File

@@ -560,7 +560,7 @@
"processing.create":"New Processing", "processing.create":"New Processing",
"processing.update":"Update Processing", "processing.update":"Update Processing",
"processing.consignee.name":"Consignee name", "processing.consignee.name":"Consignee name",
"processing.shipper.name":"Shipper name", "processing.shipper.name":"Sender name",
"processing.package.select.btn":"Select", "processing.package.select.btn":"Select",
"processing.package.create":"New Package", "processing.package.create":"New Package",
"processing.package.update":"Update Package", "processing.package.update":"Update Package",

View File

@@ -14,16 +14,18 @@ class Config {
final String reportURL; final String reportURL;
final Level level; final Level level;
final String reportProjectID; final String reportProjectID;
final String bucketName;
factory Config( factory Config(
{@required Flavor flavor, {@required Flavor flavor,
@required String apiURL, @required String apiURL,
@required String reportURL, @required String reportURL,
@required String reportProjectID, @required String reportProjectID,
@required String bucketName,
Color color: Colors.blue, Color color: Colors.blue,
Level level: Level.SEVERE}) { Level level: Level.SEVERE}) {
_instance ??= Config._internal(flavor, FlavorNames[flavor.index], color, _instance ??= Config._internal(flavor, FlavorNames[flavor.index], color,
apiURL, reportURL, level, reportProjectID); apiURL, reportURL, level, reportProjectID, bucketName);
Logger.root.level = level; Logger.root.level = level;
Logger.root.onRecord.listen((record) { Logger.root.onRecord.listen((record) {
@@ -35,7 +37,7 @@ class Config {
} }
Config._internal(this.flavor, this.name, this.color, this.apiURL, Config._internal(this.flavor, this.name, this.color, this.apiURL,
this.reportURL, this.level, this.reportProjectID); this.reportURL, this.level, this.reportProjectID, this.bucketName);
static Config get instance { static Config get instance {
return _instance; return _instance;

View File

@@ -115,6 +115,7 @@ class Package {
'tracking_id': trackingID, 'tracking_id': trackingID,
'market': market, 'market': market,
'fcs_id': fcsID, 'fcs_id': fcsID,
'sender_fcs_id': senderFCSID,
"desc": desc, "desc": desc,
"remark": remark, "remark": remark,
"photo_urls": photoUrls "photo_urls": photoUrls

View File

@@ -1,5 +1,6 @@
import 'dart:io'; import 'dart:io';
import 'package:fcs/config.dart';
import 'package:firebase_auth/firebase_auth.dart'; import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_storage/firebase_storage.dart'; import 'package:firebase_storage/firebase_storage.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
@@ -39,7 +40,9 @@ Future<String> uploadStorage(String path, File file, {String fileName}) async {
fileName = Uuid().v4(); fileName = Uuid().v4();
} }
StorageReference storageReference = StorageReference storageReference =
FirebaseStorage.instance.ref().child('$path/$fileName'); FirebaseStorage(storageBucket: Config.instance.bucketName)
.ref()
.child('$path/$fileName');
StorageUploadTask uploadTask = storageReference.putFile(file); StorageUploadTask uploadTask = storageReference.putFile(file);
await uploadTask.onComplete; await uploadTask.onComplete;
String downloadUrl = await storageReference.getDownloadURL(); String downloadUrl = await storageReference.getDownloadURL();

View File

@@ -12,6 +12,7 @@ void main() {
apiURL: "https://asia-northeast1-fcs-dev1.cloudfunctions.net/API", apiURL: "https://asia-northeast1-fcs-dev1.cloudfunctions.net/API",
reportURL: "http://petrok.mokkon.com:8091", reportURL: "http://petrok.mokkon.com:8091",
reportProjectID: "fcs-dev", reportProjectID: "fcs-dev",
bucketName: "gs://fcs-dev1-us",
level: Level.ALL); level: Level.ALL);
runApp(App()); runApp(App());
} }

View File

@@ -9,9 +9,10 @@ void main() {
Config( Config(
flavor: Flavor.DEV, flavor: Flavor.DEV,
color: Colors.blue, color: Colors.blue,
reportURL: "http://192.168.100.11:8080", reportURL: "http://petrok.mokkon.com:8091",
reportProjectID: "fcs-dev", reportProjectID: "fcs-dev",
apiURL: "http://192.168.100.11:7777", apiURL: "http://192.168.1.155:7777",
bucketName: "gs://fcs-dev1-us",
level: Level.ALL); level: Level.ALL);
runApp(App()); runApp(App());
} }

View File

@@ -12,6 +12,7 @@ void main() {
apiURL: "https://asia-northeast1-fcs-prod1.cloudfunctions.net/API", apiURL: "https://asia-northeast1-fcs-prod1.cloudfunctions.net/API",
reportURL: "http://petrok.mokkon.com:8092", reportURL: "http://petrok.mokkon.com:8092",
reportProjectID: "fcs-prod", reportProjectID: "fcs-prod",
bucketName: "gs://fcs-prod1",
level: Level.ALL); level: Level.ALL);
runApp(App()); runApp(App());
} }

View File

@@ -48,7 +48,10 @@ class _PackageInfoState extends State<PackageInfo> {
initPackage(widget.package); initPackage(widget.package);
} }
initPackage(Package package) { initPackage(Package pkg) async {
PackageModel packageModel =
Provider.of<PackageModel>(context, listen: false);
Package package = await packageModel.getPackageByTrackingID(pkg.trackingID);
setState(() { setState(() {
_package = package; _package = package;
multiImgController.setImageUrls = package.photoUrls; multiImgController.setImageUrls = package.photoUrls;
@@ -63,38 +66,38 @@ class _PackageInfoState extends State<PackageInfo> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
String id = Provider.of<MainModel>(context).user.id; String id = Provider.of<MainModel>(context).user.id;
bool owner = _package.userID == id; bool owner = _package?.userID == id;
bool canChangeDeliveryAddress = bool canChangeDeliveryAddress =
_package.status == package_received_status || _package?.status == package_received_status ||
_package.status == package_processed_status; _package?.status == package_processed_status;
final trackingIdBox = DisplayText( final trackingIdBox = DisplayText(
text: _package.trackingID, text: _package?.trackingID??"",
labelTextKey: "package.tracking.id", labelTextKey: "package.tracking.id",
iconData: MaterialCommunityIcons.barcode_scan, iconData: MaterialCommunityIcons.barcode_scan,
); );
var fcsIDBox = DisplayText( var fcsIDBox = DisplayText(
text: _package.fcsID, text: _package?.fcsID??"",
labelTextKey: "processing.fcs.id", labelTextKey: "processing.fcs.id",
icon: FcsIDIcon(), icon: FcsIDIcon(),
); );
final customerNameBox = DisplayText( final customerNameBox = DisplayText(
text: _package.userName, text: _package?.userName??"",
labelTextKey: "package.create.name", labelTextKey: "package.create.name",
iconData: Icons.perm_identity, iconData: Icons.perm_identity,
); );
final marketBox = DisplayText( final marketBox = DisplayText(
text: _package.market ?? "-", text: _package?.market ?? "-",
labelTextKey: "package.create.market", labelTextKey: "package.create.market",
iconData: Icons.store, iconData: Icons.store,
); );
final descBox = DisplayText( final descBox = DisplayText(
text: _package.desc ?? "-", text: _package?.desc ?? "-",
labelTextKey: "package.edit.desc", labelTextKey: "package.edit.desc",
iconData: MaterialCommunityIcons.message_text_outline, iconData: MaterialCommunityIcons.message_text_outline,
); );
final remarkBox = DisplayText( final remarkBox = DisplayText(
text: _package.remark ?? "-", text: _package?.remark ?? "-",
labelTextKey: "package.edit.remark", labelTextKey: "package.edit.remark",
iconData: Entypo.new_message, iconData: Entypo.new_message,
); );
@@ -109,7 +112,7 @@ class _PackageInfoState extends State<PackageInfo> {
callBack: _return, callBack: _return,
); );
final deliveryAddressBox = DefaultDeliveryAddress( final deliveryAddressBox = DefaultDeliveryAddress(
deliveryAddress: _package.deliveryAddress, deliveryAddress: _package?.deliveryAddress,
labelKey: "package.delivery.address", labelKey: "package.delivery.address",
onTap: owner && canChangeDeliveryAddress onTap: owner && canChangeDeliveryAddress
? () async { ? () async {
@@ -155,10 +158,10 @@ class _PackageInfoState extends State<PackageInfo> {
widget.isSearchResult ? Container() : fcsIDBox, widget.isSearchResult ? Container() : fcsIDBox,
widget.isSearchResult ? Container() : customerNameBox, widget.isSearchResult ? Container() : customerNameBox,
widget.isSearchResult ? Container() : marketBox, widget.isSearchResult ? Container() : marketBox,
_package.photoUrls.length == 0 ? Container() : img, _package==null || _package.photoUrls.length == 0 ? Container() : img,
widget.isSearchResult ? Container() : descBox, widget.isSearchResult ? Container() : descBox,
remarkBox, remarkBox,
_package.status == package_received_status && _package?.status == package_received_status &&
widget.isCustomer widget.isCustomer
? returnButton ? returnButton
: Container(), : Container(),
@@ -166,8 +169,8 @@ class _PackageInfoState extends State<PackageInfo> {
widget.isSearchResult widget.isSearchResult
? Container() ? Container()
: StatusTree( : StatusTree(
shipmentHistory: _package.shipmentHistory, shipmentHistory: _package?.shipmentHistory,
currentStatus: _package.status), currentStatus: _package?.status),
SizedBox( SizedBox(
height: 20, height: 20,
) )

View File

@@ -1,8 +1,10 @@
import 'package:fcs/domain/entities/market.dart'; import 'package:fcs/domain/entities/market.dart';
import 'package:fcs/domain/entities/package.dart'; import 'package:fcs/domain/entities/package.dart';
import 'package:fcs/domain/entities/user.dart';
import 'package:fcs/helpers/theme.dart'; import 'package:fcs/helpers/theme.dart';
import 'package:fcs/pages/market/market_editor.dart'; import 'package:fcs/pages/market/market_editor.dart';
import 'package:fcs/pages/market/model/market_model.dart'; import 'package:fcs/pages/market/model/market_model.dart';
import 'package:fcs/pages/package/model/package_model.dart';
import 'package:fcs/pages/package/tracking_id_page.dart'; import 'package:fcs/pages/package/tracking_id_page.dart';
import 'package:fcs/pages/main/util.dart'; import 'package:fcs/pages/main/util.dart';
import 'package:fcs/pages/widgets/barcode_scanner.dart'; import 'package:fcs/pages/widgets/barcode_scanner.dart';
@@ -19,7 +21,9 @@ import 'package:provider/provider.dart';
class PackageEditor extends StatefulWidget { class PackageEditor extends StatefulWidget {
final Package package; final Package package;
PackageEditor({this.package}); final User consignee;
final User sender;
PackageEditor({this.package, this.consignee, this.sender});
@override @override
_PackageEditorState createState() => _PackageEditorState(); _PackageEditorState createState() => _PackageEditorState();
@@ -260,17 +264,24 @@ class _PackageEditorState extends State<PackageEditor> {
setState(() { setState(() {
_isLoading = true; _isLoading = true;
}); });
PackageModel packageModel =
Provider.of<PackageModel>(context, listen: false);
try { try {
this._package.trackingID = _trackingIDCtl.text; Package package=await packageModel.getPackageByTrackingID(_trackingIDCtl.text);
this._package.market = selectedMarket; package.trackingID = _trackingIDCtl.text;
this._package.desc = _descCtl.text; package.market = selectedMarket;
this._package.remark = _remarkCtl.text; package.desc = _descCtl.text;
this._package.photoFiles = _isNew package.remark = _remarkCtl.text;
package.photoFiles = _isNew
? multiImgController.getAddedFile ? multiImgController.getAddedFile
: multiImgController.getUpdatedFile; : multiImgController.getUpdatedFile;
package.fcsID=widget.consignee.fcsID;
package.senderFCSID=widget.sender?.fcsID;
Navigator.pop<Package>(context, this._package); await packageModel.updateProcessing(package,
multiImgController.getAddedFile, multiImgController.getDeletedUrl);
Navigator.pop<Package>(context, package);
} catch (e) { } catch (e) {
showMsgDialog(context, "Error", e.toString()); showMsgDialog(context, "Error", e.toString());
} finally { } finally {

View File

@@ -3,6 +3,7 @@ import 'package:fcs/domain/entities/processing.dart';
import 'package:fcs/domain/entities/user.dart'; import 'package:fcs/domain/entities/user.dart';
import 'package:fcs/helpers/theme.dart'; import 'package:fcs/helpers/theme.dart';
import 'package:fcs/pages/main/util.dart'; import 'package:fcs/pages/main/util.dart';
import 'package:fcs/pages/package/package_info.dart';
import 'package:fcs/pages/user_search/user_serach.dart'; import 'package:fcs/pages/user_search/user_serach.dart';
import 'package:fcs/pages/widgets/display_text.dart'; import 'package:fcs/pages/widgets/display_text.dart';
import 'package:fcs/pages/widgets/fcs_id_icon.dart'; import 'package:fcs/pages/widgets/fcs_id_icon.dart';
@@ -27,8 +28,8 @@ class _ProcesingEditorState extends State<ProcesingEditor> {
Processing processing = Processing(); Processing processing = Processing();
bool _isLoading = false; bool _isLoading = false;
bool _isNew; bool _isNew;
User user; User consignee;
User shipper; User sender;
List<Package> packages = []; List<Package> packages = [];
@override @override
@@ -37,11 +38,11 @@ class _ProcesingEditorState extends State<ProcesingEditor> {
_isNew = widget.processing == null; _isNew = widget.processing == null;
if (!_isNew) { if (!_isNew) {
processing = widget.processing; processing = widget.processing;
user = User( consignee = User(
fcsID: processing.userID, fcsID: processing.userID,
name: processing.userName, name: processing.userName,
phoneNumber: processing.userPhoneNumber); phoneNumber: processing.userPhoneNumber);
shipper = User( sender = User(
fcsID: processing.fcsID, fcsID: processing.fcsID,
name: processing.shipperName, name: processing.shipperName,
phoneNumber: processing.shipperPhoneNumber); phoneNumber: processing.shipperPhoneNumber);
@@ -55,7 +56,7 @@ class _ProcesingEditorState extends State<ProcesingEditor> {
children: <Widget>[ children: <Widget>[
Expanded( Expanded(
child: DisplayText( child: DisplayText(
text: user != null ? user.fcsID : "", text: consignee != null ? consignee.fcsID : "",
labelTextKey: "processing.fcs.id", labelTextKey: "processing.fcs.id",
icon: FcsIDIcon(), icon: FcsIDIcon(),
)), )),
@@ -63,21 +64,21 @@ class _ProcesingEditorState extends State<ProcesingEditor> {
icon: Icon(Icons.search, color: primaryColor), icon: Icon(Icons.search, color: primaryColor),
onPressed: () => searchUser(context, callbackUserSelect: (u) { onPressed: () => searchUser(context, callbackUserSelect: (u) {
setState(() { setState(() {
this.user = u; this.consignee = u;
}); });
})), })),
], ],
); );
final phoneNumberBox = DisplayText( final phoneNumberBox = DisplayText(
text: user != null ? user.phoneNumber : "", text: consignee != null ? consignee.phoneNumber : "",
labelTextKey: "processing.phone", labelTextKey: "processing.phone",
maxLines: 2, maxLines: 2,
iconData: Icons.phone, iconData: Icons.phone,
); );
final namebox = DisplayText( final namebox = DisplayText(
text: user != null ? user.name : "", text: consignee != null ? consignee.name : "",
labelTextKey: "processing.consignee.name", labelTextKey: "processing.consignee.name",
maxLines: 2, maxLines: 2,
iconData: Icons.person, iconData: Icons.person,
@@ -97,7 +98,7 @@ class _ProcesingEditorState extends State<ProcesingEditor> {
children: <Widget>[ children: <Widget>[
Expanded( Expanded(
child: DisplayText( child: DisplayText(
text: shipper != null ? shipper.fcsID : "", text: sender != null ? sender.fcsID : "",
labelTextKey: "processing.fcs.id", labelTextKey: "processing.fcs.id",
icon: FcsIDIcon(), icon: FcsIDIcon(),
)), )),
@@ -105,21 +106,21 @@ class _ProcesingEditorState extends State<ProcesingEditor> {
icon: Icon(Icons.search, color: primaryColor), icon: Icon(Icons.search, color: primaryColor),
onPressed: () => searchUser(context, callbackUserSelect: (u) { onPressed: () => searchUser(context, callbackUserSelect: (u) {
setState(() { setState(() {
this.shipper = u; this.sender = u;
}); });
})), })),
], ],
); );
final shipperPhoneNumberBox = DisplayText( final shipperPhoneNumberBox = DisplayText(
text: shipper != null ? shipper.phoneNumber : "", text: sender != null ? sender.phoneNumber : "",
labelTextKey: "processing.phone", labelTextKey: "processing.phone",
maxLines: 2, maxLines: 2,
iconData: Icons.phone, iconData: Icons.phone,
); );
final shipperNamebox = DisplayText( final shipperNamebox = DisplayText(
text: shipper != null ? shipper.name : "", text: sender != null ? sender.name : "",
labelTextKey: "processing.shipper.name", labelTextKey: "processing.shipper.name",
maxLines: 2, maxLines: 2,
iconData: Icons.person, iconData: Icons.person,
@@ -146,9 +147,17 @@ class _ProcesingEditorState extends State<ProcesingEditor> {
color: primaryColor, color: primaryColor,
), ),
onPressed: () async { onPressed: () async {
if (this.consignee == null) {
showMsgDialog(context, "Warning", "Please select 'Consignee'");
return;
}
Package _package = await Navigator.push<Package>( Package _package = await Navigator.push<Package>(
context, context,
CupertinoPageRoute(builder: (context) => PackageEditor()), CupertinoPageRoute(
builder: (context) => PackageEditor(
sender: this.sender,
consignee: this.consignee,
)),
); );
_addPackage(_package); _addPackage(_package);
// _savePackage(_package); // _savePackage(_package);
@@ -224,64 +233,17 @@ class _ProcesingEditorState extends State<ProcesingEditor> {
List<Widget> _getPackages(BuildContext context, List<Package> packages) { List<Widget> _getPackages(BuildContext context, List<Package> packages) {
return packages.map((p) { return packages.map((p) {
return Container( return InkWell(
decoration: BoxDecoration( onTap: () async {
border: Border( Package _package = await Navigator.of(context).push<Package>(
bottom: BorderSide(color: Colors.grey[300]), CupertinoPageRoute(
), builder: (context) => PackageInfo(package: p)));
), _savePackage(_package);
child: InkWell( },
onTap: () async { child: DisplayText(
Package _package = await Navigator.of(context).push<Package>( labelTextKey: "processing.tracking.id",
CupertinoPageRoute( iconData: MaterialCommunityIcons.barcode_scan,
builder: (context) => PackageEditor(package: p))); text: p.trackingID,
// setState(() {
// _savePackage(_package);
// });
_savePackage(_package);
},
child: Row(
children: <Widget>[
Expanded(
child: new Padding(
padding: const EdgeInsets.symmetric(vertical: 5.0),
child: new Row(
children: <Widget>[
new Padding(
padding: new EdgeInsets.symmetric(
horizontal: 30.0 - 15.0 / 2),
child: Stack(
alignment: AlignmentDirectional.bottomEnd,
children: [
Icon(
Octicons.package,
color: primaryColor,
size: 30,
),
],
),
),
new Expanded(
child: new Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
new Text(
p.trackingID,
style: new TextStyle(fontSize: 15.0),
),
],
),
),
IconButton(
icon: Icon(Icons.remove, color: primaryColor),
onPressed: () => _removePackage(p),
)
],
),
),
),
],
),
), ),
); );
}).toList(); }).toList();
@@ -331,10 +293,12 @@ class _ProcesingEditorState extends State<ProcesingEditor> {
isDataChanged() { isDataChanged() {
if (_isNew) { if (_isNew) {
return this.packages.isNotEmpty || user != null || shipper != null; return this.packages.isNotEmpty || consignee != null || sender != null;
} else { } else {
Processing _processing = Processing( Processing _processing = Processing(
userID: user.fcsID, fcsID: shipper.fcsID, packages: this.packages); userID: consignee.fcsID,
fcsID: sender.fcsID,
packages: this.packages);
return widget.processing.isChangedForEdit(_processing); return widget.processing.isChangedForEdit(_processing);
} }
} }

View File

@@ -2,7 +2,7 @@ name: fcs
description: FCS Logistics description: FCS Logistics
publish_to: 'none' # Remove this line if you wish to publish to pub.dev publish_to: 'none' # Remove this line if you wish to publish to pub.dev
version: 1.0.5+7 version: 1.0.6+8
environment: environment:
sdk: ">=2.7.0 <3.0.0" sdk: ">=2.7.0 <3.0.0"