Browse Source

action sell

master
daivph 5 years ago
parent
commit
5627fa5ecd
6 changed files with 522 additions and 8 deletions
  1. +8
    -0
      lib/custom_model/Sell.dart
  2. +12
    -1
      lib/presentation/screens/actions/harvest/sc_edit_action_harvest.dart
  3. +1
    -1
      lib/presentation/screens/actions/packing/sc_edit_action_packing.dart
  4. +488
    -5
      lib/presentation/screens/actions/sell/sc_edit_action_sell.dart
  5. +7
    -0
      lib/presentation/screens/plot_detail/sc_plot_action.dart
  6. +6
    -1
      lib/utils/const_common.dart

+ 8
- 0
lib/custom_model/Sell.dart View File

class Sell { class Sell {
int id; int id;
int cropId;
int activityId; int activityId;
int harvestId; int harvestId;
String executeDate; String executeDate;
String description; String description;
String media;
num quantityLv1; num quantityLv1;
num quantityLv2; num quantityLv2;
num quantityLv3; num quantityLv3;


Sell( Sell(
{this.id, {this.id,
this.cropId,
this.activityId, this.activityId,
this.harvestId, this.harvestId,
this.executeDate, this.executeDate,
this.description, this.description,
this.media,
this.quantityLv1, this.quantityLv1,
this.quantityLv2, this.quantityLv2,
this.quantityLv3, this.quantityLv3,


Sell.fromJson(Map<String, dynamic> json) { Sell.fromJson(Map<String, dynamic> json) {
id = json['id']; id = json['id'];
cropId = json['cropId'];
activityId = json['activityId']; activityId = json['activityId'];
harvestId = json['harvestId']; harvestId = json['harvestId'];
executeDate = json['executeDate']; executeDate = json['executeDate'];
description = json['description']; description = json['description'];
media = json['media'];
quantityLv1 = json['quantityLv1']; quantityLv1 = json['quantityLv1'];
quantityLv2 = json['quantityLv2']; quantityLv2 = json['quantityLv2'];
quantityLv3 = json['quantityLv3']; quantityLv3 = json['quantityLv3'];
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>(); final Map<String, dynamic> data = new Map<String, dynamic>();
data['id'] = this.id; data['id'] = this.id;
data['cropId'] = this.cropId;
data['activityId'] = this.activityId; data['activityId'] = this.activityId;
data['harvestId'] = this.harvestId; data['harvestId'] = this.harvestId;
data['executeDate'] = this.executeDate; data['executeDate'] = this.executeDate;
data['description'] = this.description; data['description'] = this.description;
data['media'] = this.media;
data['quantityLv1'] = this.quantityLv1; data['quantityLv1'] = this.quantityLv1;
data['quantityLv2'] = this.quantityLv2; data['quantityLv2'] = this.quantityLv2;
data['quantityLv3'] = this.quantityLv3; data['quantityLv3'] = this.quantityLv3;

+ 12
- 1
lib/presentation/screens/actions/harvest/sc_edit_action_harvest.dart View File

import 'package:farm_tpf/presentation/custom_widgets/widget_media_picker.dart'; import 'package:farm_tpf/presentation/custom_widgets/widget_media_picker.dart';
import 'package:farm_tpf/presentation/screens/actions/bloc/action_detail_bloc.dart'; import 'package:farm_tpf/presentation/screens/actions/bloc/action_detail_bloc.dart';
import 'package:farm_tpf/presentation/screens/actions/packing/sc_edit_action_packing.dart'; import 'package:farm_tpf/presentation/screens/actions/packing/sc_edit_action_packing.dart';
import 'package:farm_tpf/presentation/screens/actions/sell/sc_edit_action_sell.dart';
import 'package:farm_tpf/presentation/screens/actions/state_management_helper/change_file_controller.dart'; import 'package:farm_tpf/presentation/screens/actions/state_management_helper/change_file_controller.dart';
import 'package:farm_tpf/presentation/screens/actions/util_action.dart'; import 'package:farm_tpf/presentation/screens/actions/util_action.dart';
import 'package:farm_tpf/utils/const_common.dart'; import 'package:farm_tpf/utils/const_common.dart';
borderRadius: borderRadius:
new BorderRadius.circular(8.0)), new BorderRadius.circular(8.0)),
color: Colors.lightGreen, color: Colors.lightGreen,
onPressed: () {},
onPressed: () {
if (_harvest.id != null) {
Get.to(EditActionSellScreen(
cropId: widget.cropId,
harvestId: _harvest.id,
));
} else {
Get.to(EditActionSellScreen(
cropId: widget.cropId));
}
},
child: Text( child: Text(
plot_action_sell, plot_action_sell,
style: TextStyle( style: TextStyle(

+ 1
- 1
lib/presentation/screens/actions/packing/sc_edit_action_packing.dart View File

List<DropdownMenuItem<Harvest>> _buildDropMenu(List<Harvest> actions) { List<DropdownMenuItem<Harvest>> _buildDropMenu(List<Harvest> actions) {
return actions return actions
.map((action) => DropdownMenuItem<Harvest>( .map((action) => DropdownMenuItem<Harvest>(
child: Text("Lần thu hoạch " + action.id.toString()),
child: Text(" thu hoạch " + action.id.toString()),
value: action, value: action,
)) ))
.toList(); .toList();

+ 488
- 5
lib/presentation/screens/actions/sell/sc_edit_action_sell.dart View File

import 'dart:convert';

import 'package:farm_tpf/custom_model/Harvest.dart';
import 'package:farm_tpf/custom_model/Sell.dart';
import 'package:farm_tpf/data/api/app_exception.dart';
import 'package:farm_tpf/data/repository/repository.dart';
import 'package:farm_tpf/presentation/custom_widgets/bloc/media_helper_bloc.dart';
import 'package:farm_tpf/presentation/custom_widgets/widget_loading.dart';
import 'package:farm_tpf/presentation/custom_widgets/widget_media_picker.dart';
import 'package:farm_tpf/presentation/screens/actions/bloc/action_detail_bloc.dart';
import 'package:farm_tpf/presentation/screens/actions/state_management_helper/change_file_controller.dart';
import 'package:farm_tpf/utils/const_common.dart';
import 'package:farm_tpf/utils/const_string.dart'; import 'package:farm_tpf/utils/const_string.dart';
import 'package:farm_tpf/utils/const_style.dart';
import 'package:farm_tpf/utils/validators.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_datetime_picker/flutter_datetime_picker.dart';
import 'package:get/get.dart';
import 'package:intl/intl.dart';
import 'package:keyboard_dismisser/keyboard_dismisser.dart';
import 'package:pattern_formatter/pattern_formatter.dart';
import 'package:farm_tpf/utils/formatter.dart';

import '../bloc_get_harvest.dart';
import '../util_action.dart';


class EditActionSellScreen extends StatefulWidget { class EditActionSellScreen extends StatefulWidget {
final int cropId;
final bool isEdit;
final int activityId;
final int harvestId;
EditActionSellScreen(
{@required this.cropId,
this.isEdit = false,
this.activityId,
this.harvestId});
@override @override
_EditActionSellScreenState createState() => _EditActionSellScreenState(); _EditActionSellScreenState createState() => _EditActionSellScreenState();
} }


class _EditActionSellScreenState extends State<EditActionSellScreen> { class _EditActionSellScreenState extends State<EditActionSellScreen> {
final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>();
final _repository = Repository();
GlobalKey<FormState> _formKey = GlobalKey();
bool _autoValidate = false;
Sell _sell = Sell();
TextEditingController _l1Controller = TextEditingController();
TextEditingController _l2Controller = TextEditingController();
TextEditingController _l3Controller = TextEditingController();
TextEditingController _removedQuantityController = TextEditingController();
TextEditingController _descriptionController = TextEditingController();
final _buyerController = TextEditingController();

List<Harvest> _harvests = List<Harvest>();
Harvest harvestValue;
String executeTimeView;
DateTime executeTime = DateTime.now();
List<String> filePaths = List<String>();
var changeFileController = Get.put(ChangeFileController());

@override @override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(plot_action_sell),
),
void initState() {
super.initState();
changeFileController.initValue();
var parsedExecuteDate =
DateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'").format(executeTime);
_sell.executeDate = "$parsedExecuteDate";
executeTimeView = DateFormat("dd/MM/yyyy HH:mm").format(executeTime);
_sell.cropId = widget.cropId;

if (!widget.isEdit) {
getHarvestBloc.getHarvests((data) {
_harvests = data;
for (var item in _harvests) {
if (item.id == widget.harvestId) {
harvestValue = item;
break;
}
}
}, (err) {});
}
}

_validateInputs() async {
if (_formKey.currentState.validate()) {
_formKey.currentState.save();
LoadingDialog.showLoadingDialog(context);
filePaths = Get.find<ChangeFileController>().files;
try {
var activitySell = jsonEncode(_sell.toJson()).toString();
//ADD NEW
if (_sell.activityId == null) {
_repository.createAction((value) {
LoadingDialog.hideLoadingDialog(context);
Get.back(result: value);
Get.snackbar(label_add_success, "Hoạt động xuất bán",
snackPosition: SnackPosition.BOTTOM);
}, (error) {
LoadingDialog.hideLoadingDialog(context);
_scaffoldKey.currentState.showSnackBar(SnackBar(
content: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Flexible(child: Text(AppException.handleError(error))),
Icon(Icons.error),
],
),
backgroundColor: Colors.red,
duration: Duration(seconds: 3),
));
},
apiAddAction: ConstCommon.apiAddSell,
paramActivity: ConstCommon.paramsActionSell,
activityAction: activitySell,
filePaths: filePaths);
} else {
//UPDATE
_repository.updateAction((value) {
LoadingDialog.hideLoadingDialog(context);
Get.back(result: value);
Get.snackbar(label_update_success, "Hoạt động xuất bán",
snackPosition: SnackPosition.BOTTOM);
}, (error) {
LoadingDialog.hideLoadingDialog(context);
_scaffoldKey.currentState.showSnackBar(SnackBar(
content: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Flexible(child: Text(AppException.handleError(error))),
Icon(Icons.error),
],
),
backgroundColor: Colors.red,
duration: Duration(seconds: 3),
));
},
apiUpdateAction: ConstCommon.apiUpdateSell,
paramActivity: ConstCommon.paramsActionSell,
activityAction: activitySell,
filePaths: filePaths);
}
} catch (e) {
LoadingDialog.hideLoadingDialog(context);
print(e.toString());
}
} else {
_autoValidate = true;
}
}

List<DropdownMenuItem<Harvest>> _buildDropMenu(List<Harvest> actions) {
return actions
.map((action) => DropdownMenuItem<Harvest>(
child: Text("Mã thu hoạch " + action.id.toString()),
value: action,
))
.toList();
}

Widget _dropdownHarvest() {
return StreamBuilder(
stream: getHarvestBloc.actions,
builder: (context, AsyncSnapshot<dynamic> snapshot) {
if (snapshot.hasData) {
return DropdownButtonFormField<Harvest>(
value: harvestValue,
hint: Text("Mã thu hoạch"),
onChanged: (Harvest newValue) {
setState(() {
harvestValue = newValue;
_sell.harvestId = newValue.id;
});
},
validator: (value) => value == null ? "Mã thu hoạch" : null,
isExpanded: true,
items: _buildDropMenu(_harvests));
} else {
return Center(
child: CircularProgressIndicator(),
);
}
},
);
}

Widget _btnExecuteTimePicker() {
return FlatButton(
padding: EdgeInsets.only(top: 0.0, right: 0.0, bottom: 0.0, left: 0.0),
onPressed: () {
DatePicker.showDateTimePicker(context,
showTitleActions: true, onChanged: (date) {}, onConfirm: (date) {
setState(() {
var parsedDate =
DateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'").format(date);
_sell.executeDate = "$parsedDate";
executeTimeView = DateFormat("dd/MM/yyyy HH:mm").format(date);
});
}, currentTime: executeTime, locale: LocaleType.vi);
},
child: Container(
padding:
EdgeInsets.only(top: 0.0, right: 0.0, bottom: 10.5, left: 0.0),
decoration: BoxDecoration(
border: kBorderTextField,
),
child: Row(
children: [
Expanded(
child: Text(
//TODO: check condition
executeTimeView == null ? "$executeTime" : executeTimeView,
style: TextStyle(fontSize: 14.0, color: Colors.black87),
)),
Icon(
Icons.date_range,
color: Colors.blue,
),
],
)));
}

Widget _l1Field() {
return TextFormField(
keyboardType: TextInputType.numberWithOptions(decimal: true),
inputFormatters: [
ThousandsFormatter(
formatter: NumberFormat("#,###.##", "es"), allowFraction: true)
],
decoration: InputDecoration(labelText: "Số lượng/khối lượng loại 1"),
controller: _l1Controller,
validator: (String value) {
return Validators.validNumber(value, "Số lượng/khối lượng loại 1");
},
onSaved: (newValue) {
_sell.quantityLv1 = newValue.parseDoubleThousand();
},
); );
} }

Widget _l2Field() {
return TextFormField(
keyboardType: TextInputType.numberWithOptions(decimal: true),
inputFormatters: [
ThousandsFormatter(
formatter: NumberFormat("#,###.##", "es"), allowFraction: true)
],
decoration: InputDecoration(labelText: "Số lượng/khối lượng loại 2"),
controller: _l2Controller,
validator: (String value) {
return Validators.validNumber(value, "Số lượng/khối lượng loại 2");
},
onSaved: (newValue) {
_sell.quantityLv2 = newValue.parseDoubleThousand();
},
);
}

Widget _l3Field() {
return TextFormField(
keyboardType: TextInputType.numberWithOptions(decimal: true),
inputFormatters: [
ThousandsFormatter(
formatter: NumberFormat("#,###.##", "es"), allowFraction: true)
],
decoration: InputDecoration(labelText: "Số lượng/khối lượng loại 3"),
controller: _l3Controller,
validator: (String value) {
return Validators.validNumber(value, "Số lượng/khối lượng loại 3");
},
onSaved: (newValue) {
_sell.quantityLv3 = newValue.parseDoubleThousand();
},
);
}

Widget _removedQuantityField() {
return TextFormField(
keyboardType: TextInputType.numberWithOptions(decimal: true),
inputFormatters: [
ThousandsFormatter(
formatter: NumberFormat("#,###.##", "es"), allowFraction: true)
],
decoration: InputDecoration(labelText: "Số lượng/khối lượng loại bỏ"),
controller: _removedQuantityController,
validator: (String value) {
return Validators.validNumber(value, "Số lượng/khối lượng loại bỏ");
},
onSaved: (newValue) {
_sell.removedQuantity = newValue.parseDoubleThousand();
},
);
}

Widget _buyerField() {
return TextFormField(
keyboardType: TextInputType.text,
decoration: InputDecoration(labelText: "Khách hàng"),
controller: _buyerController,
validator: (String value) {
return Validators.validateNotNullOrEmpty(value, "Khách hàng");
},
onSaved: (newValue) {
_sell.buyer = newValue;
},
);
}

Widget _descriptionField() {
return TextFormField(
keyboardType: TextInputType.text,
decoration: InputDecoration(labelText: "Ghi chú"),
controller: _descriptionController,
onSaved: (newValue) {
_sell.description = newValue;
},
);
}

_actionAppBar() {
IconButton iconButton;
if (1 == 1) {
iconButton = IconButton(
icon: Icon(
Icons.done,
color: Colors.black,
),
onPressed: () {
FocusScopeNode currentFocus = FocusScope.of(context);
if (!currentFocus.hasPrimaryFocus) {
currentFocus.unfocus();
}
_validateInputs();
},
);
return <Widget>[iconButton];
}
return <Widget>[Container()];
}

@override
Widget build(BuildContext context) => KeyboardDismisser(
gestures: [
GestureType.onTap,
GestureType.onPanUpdateDownDirection,
],
child: Scaffold(
key: _scaffoldKey,
appBar: AppBar(
centerTitle: true,
title: Text(plot_action_sell),
actions: _actionAppBar()),
body: KeyboardDismisser(
child: MultiBlocProvider(
providers: [
BlocProvider<ActionDetailBloc>(
create: (context) =>
ActionDetailBloc(repository: Repository())
..add(FetchData(
isNeedFetchData: widget.isEdit,
apiActivity: ConstCommon.apiDetailSell,
activityId: widget.activityId))),
BlocProvider<MediaHelperBloc>(
create: (context) =>
MediaHelperBloc()..add(ChangeListMedia(items: [])),
)
],
child: Form(
key: _formKey,
autovalidate: _autoValidate,
child: SingleChildScrollView(
padding: EdgeInsets.all(8.0),
child: BlocConsumer<ActionDetailBloc, ActionDetailState>(
listener: (context, state) async {
if (state is ActionDetailFailure) {
LoadingDialog.hideLoadingDialog(context);
} else if (state is ActionDetailSuccess) {
LoadingDialog.hideLoadingDialog(context);
print(state.item);
_sell = Sell.fromJson(state.item);
_sell.activityId = widget.activityId;
_l1Controller.text =
_sell.quantityLv1.formatNumtoStringDecimal();
_l2Controller.text =
_sell.quantityLv2.formatNumtoStringDecimal();
_l3Controller.text =
_sell.quantityLv3.formatNumtoStringDecimal();
_removedQuantityController.text = _sell
.removedQuantity
.formatNumtoStringDecimal();
_buyerController.text = _sell.buyer ?? "";
_descriptionController.text =
_sell.description ?? "";

//select harvest
getHarvestBloc.getHarvests((data) {
_harvests = data;
for (var item in _harvests) {
if (item.id == _sell.harvestId) {
harvestValue = item;
break;
}
}
}, (err) {});

try {
executeTime =
DateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'")
.parse(_sell.executeDate);
executeTimeView = DateFormat("dd/MM/yyyy HH:mm")
.format(executeTime);
} catch (_) {}
//Show media
if (_sell.media != null) {
await UtilAction.cacheFiles(_sell.media)
.then((value) {
BlocProvider.of<MediaHelperBloc>(context)
.add(ChangeListMedia(items: value));
}).whenComplete(() {
print("completed");
});
}
} else if (state is ActionDetailInitial) {
} else if (state is ActionDetailLoading) {
LoadingDialog.showLoadingDialog(context);
}
},
builder: (context, state) {
return Column(
children: <Widget>[
Container(
width: double.infinity,
child: Text(
"Ngày thực hiện",
style: TextStyle(
color: Colors.black54, fontSize: 13.0),
),
),
_btnExecuteTimePicker(),
SizedBox(
height: 8.0,
),
_dropdownHarvest(),
SizedBox(
height: 8.0,
),
_l1Field(),
SizedBox(
height: 8.0,
),
_l2Field(),
SizedBox(
height: 8.0,
),
_l3Field(),
SizedBox(
height: 8.0,
),
_removedQuantityField(),
SizedBox(
height: 8.0,
),
_buyerField(),
SizedBox(
height: 8.0,
),
_descriptionField(),
SizedBox(
height: 8.0,
),
BlocBuilder<MediaHelperBloc, MediaHelperState>(
builder: (context, state) {
if (state is MediaHelperSuccess) {
return WidgetMediaPicker(
currentItems: state.items,
onChangeFiles: (filePaths) async {
Get.find<ChangeFileController>()
.addAllFile(filePaths);
});
} else {
return Center(
child: CircularProgressIndicator());
}
}),
],
);
},
),
)),
))));
@override
void dispose() {
_l1Controller.dispose();
_l2Controller.dispose();
_l3Controller.dispose();
_removedQuantityController.dispose();
_descriptionController.dispose();
_buyerController.dispose();
super.dispose();
}
} }

+ 7
- 0
lib/presentation/screens/plot_detail/sc_plot_action.dart View File

import 'package:farm_tpf/presentation/screens/actions/other/sc_edit_action_other.dart'; import 'package:farm_tpf/presentation/screens/actions/other/sc_edit_action_other.dart';
import 'package:farm_tpf/presentation/screens/actions/packing/sc_edit_action_packing.dart'; import 'package:farm_tpf/presentation/screens/actions/packing/sc_edit_action_packing.dart';
import 'package:farm_tpf/presentation/screens/actions/plant/sc_edit_action_plant.dart'; import 'package:farm_tpf/presentation/screens/actions/plant/sc_edit_action_plant.dart';
import 'package:farm_tpf/presentation/screens/actions/sell/sc_edit_action_sell.dart';
import 'package:farm_tpf/presentation/screens/actions/spraying/sc_edit_action_spraying.dart'; import 'package:farm_tpf/presentation/screens/actions/spraying/sc_edit_action_spraying.dart';
import 'package:farm_tpf/presentation/screens/actions/use_water/sc_edit_action_user_water.dart'; import 'package:farm_tpf/presentation/screens/actions/use_water/sc_edit_action_user_water.dart';
import 'package:farm_tpf/presentation/screens/plot/sc_plot.dart'; import 'package:farm_tpf/presentation/screens/plot/sc_plot.dart';
activityId: item.id, activityId: item.id,
isEdit: true, isEdit: true,
)); ));
} else if (item.activityTypeName == "ACTIVE_TYPE_SELL") {
Get.to(EditActionSellScreen(
cropId: item.cropId,
activityId: item.id,
isEdit: true,
));
} }
}); });
} }

+ 6
- 1
lib/utils/const_common.dart View File

static const String apiDetailUseWater = "api/activity-water-usage"; static const String apiDetailUseWater = "api/activity-water-usage";
static const String apiDetailHarvest = "api/activity-harvest"; static const String apiDetailHarvest = "api/activity-harvest";
static const String apiDetailPacking = "api/activity-packing"; static const String apiDetailPacking = "api/activity-packing";
static const String apiDetailSell = "api/activity-sell";


//nursery //nursery
static const String paramsActionNursery = "activityNursery"; static const String paramsActionNursery = "activityNursery";
static const String paramsActionHarvest = "activityHarvest"; static const String paramsActionHarvest = "activityHarvest";
static const String apiUpdateHarvest = "api/updateActivityHarvest"; static const String apiUpdateHarvest = "api/updateActivityHarvest";
static const String apiAddHarvest = "api/createActivityHarvest"; static const String apiAddHarvest = "api/createActivityHarvest";
//Harvest
//Packing
static const String paramsActionPacking = "activityPacking"; static const String paramsActionPacking = "activityPacking";
static const String apiUpdatePacking = "api/updateActivityPacking"; static const String apiUpdatePacking = "api/updateActivityPacking";
static const String apiAddPacking = "api/createActivityPacking"; static const String apiAddPacking = "api/createActivityPacking";
//Sell
static const String paramsActionSell = "activitySell";
static const String apiUpdateSell = "api/updateActivitySell";
static const String apiAddSell = "api/createActivitySell";


static const String supplyTypeSeed = "GIONG"; static const String supplyTypeSeed = "GIONG";
static const String supplyTypeDung = "PHANBON"; static const String supplyTypeDung = "PHANBON";

Loading…
Cancel
Save