feat : inspection

This commit is contained in:
2025-09-07 17:20:01 +03:30
parent 5281bcbea6
commit d914bf7f36
22 changed files with 10607 additions and 44 deletions

View File

@@ -1,8 +1,28 @@
import 'package:rasadyar_chicken/data/models/response/hatching/hatching_models.dart';
import 'package:rasadyar_chicken/data/models/response/hatching_report/hatching_report.dart';
import 'package:rasadyar_chicken/data/models/response/poultry_science/home_poultry_science/home_poultry_science_model.dart';
import 'package:rasadyar_core/core.dart';
abstract class PoultryScienceRemoteDatasource {
Future<HomePoultryScienceModel?> getHomePoultryScience({
required String token,
required String type,
});
Future<PaginationModel<HatchingModel>?> getHatchingPoultry({
required String token,
Map<String, dynamic>? queryParameters,
});
Future<void> submitPoultryScienceReport({
required String token,
required IFormData data,
ProgressCallback? onSendProgress,
});
Future<PaginationModel<HatchingReport>?> getPoultryScienceReport({
required String token,
Map<String, dynamic>? queryParameters,
});
}

View File

@@ -1,3 +1,5 @@
import 'package:rasadyar_chicken/data/models/response/hatching/hatching_models.dart';
import 'package:rasadyar_chicken/data/models/response/hatching_report/hatching_report.dart';
import 'package:rasadyar_chicken/data/models/response/poultry_science/home_poultry_science/home_poultry_science_model.dart';
import 'package:rasadyar_core/core.dart';
@@ -14,7 +16,7 @@ class PoultryScienceRemoteDatasourceImp implements PoultryScienceRemoteDatasourc
required String type,
}) async {
var res = await _httpClient.get(
'poultry_and_hatching_for_poultry_science/',
'/poultry_and_hatching_for_poultry_science/',
queryParameters: {'type': type},
headers: {'Authorization': 'Bearer $token'},
fromJson: (json) => HomePoultryScienceModel.fromJson(json),
@@ -22,4 +24,52 @@ class PoultryScienceRemoteDatasourceImp implements PoultryScienceRemoteDatasourc
return res.data;
}
@override
Future<PaginationModel<HatchingModel>?> getHatchingPoultry({
required String token,
Map<String, dynamic>? queryParameters,
}) async {
var res = await _httpClient.get(
'/poultry_and_hatching_for_poultry_science/',
headers: {'Authorization': 'Bearer $token'},
queryParameters: queryParameters,
fromJson: (json) => PaginationModel<HatchingModel>.fromJson(
json,
(json) => HatchingModel.fromJson(json as Map<String, dynamic>),
),
);
return res.data;
}
@override
Future<void> submitPoultryScienceReport({
required String token,
required IFormData data,
ProgressCallback? onSendProgress,
}) async {
await _httpClient.upload(
'/poultry_science_report/',
headers: {'Authorization': 'Bearer $token'},
formData: data,
onSendProgress: onSendProgress,
);
}
@override
Future<PaginationModel<HatchingReport>?> getPoultryScienceReport({
required String token,
Map<String, dynamic>? queryParameters,
}) async {
var res = await _httpClient.get(
'/poultry_science_report/',
headers: {'Authorization': 'Bearer $token'},
queryParameters: queryParameters,
fromJson: (json) => PaginationModel<HatchingReport>.fromJson(
json,
(json) => HatchingReport.fromJson(json as Map<String, dynamic>),
),
);
return res.data;
}
}

View File

@@ -0,0 +1,421 @@
import 'package:freezed_annotation/freezed_annotation.dart';
part 'hatching_models.freezed.dart';
part 'hatching_models.g.dart';
@freezed
abstract class HatchingModel with _$HatchingModel{
const factory HatchingModel({
int? id,
Poultry? poultry,
ChainCompany? chainCompany,
num? age,
dynamic inspectionLosses,
VetFarm? vetFarm,
ActiveKill? activeKill,
KillingInfo? killingInfo,
FreeGovernmentalInfo? freeGovernmentalInfo,
ReportInfo? reportInfo,
String? key,
String? createDate,
String? modifyDate,
bool? trash,
bool? hasChainCompany,
int? poultryIdForeignKey,
int? poultryHatchingIdKey,
num? quantity,
num? losses,
num? leftOver,
num? killedQuantity,
num? extraKilledQuantity,
num? governmentalKilledQuantity,
num? governmentalQuantity,
num? freeKilledQuantity,
num? freeQuantity,
num? chainKilledQuantity,
num? chainKilledWeight,
num? outProvinceKilledWeight,
num? outProvinceKilledQuantity,
num? exportKilledWeight,
num? exportKilledQuantity,
num? totalCommitment,
String? commitmentType,
num? totalCommitmentQuantity,
num? totalFreeCommitmentQuantity,
num? totalFreeCommitmentWeight,
num? totalKilledWeight,
num? totalAverageKilledWeight,
num? requestLeftOver,
num? hall,
String? date,
String? predicateDate,
String? chickenBreed,
num? period,
String? allowHatching,
String? state,
bool? archive,
bool? violation,
String? message,
Registrar? registrar,
List<BreedItem>? breed,
num? cityNumber,
String? cityName,
num? provinceNumber,
String? provinceName,
LastChange? lastChange,
num? chickenAge,
num? nowAge,
LatestHatchingChange? latestHatchingChange,
String? violationReport,
String? violationMessage,
List<String>? violationImage,
String? violationReporter,
String? violationReportDate,
String? violationReportEditor,
String? violationReportEditDate,
num? totalLosses,
num? directLosses,
String? directLossesInputer,
String? directLossesDate,
String? directLossesEditor,
String? directLossesLastEditDate,
String? endPeriodLossesInputer,
String? endPeriodLossesDate,
String? endPeriodLossesEditor,
String? endPeriodLossesLastEditDate,
String? breedingUniqueId,
String? licenceNumber,
bool? temporaryTrash,
bool? temporaryDeleted,
String? firstDateInputArchive,
String? secondDateInputArchive,
String? inputArchiver,
String? outputArchiveDate,
String? outputArchiver,
num? barDifferenceRequestWeight,
num? barDifferenceRequestQuantity,
String? healthCertificate,
num? samasatDischargePercentage,
String? personTypeName,
String? interactTypeName,
String? unionTypeName,
String? certId,
num? increaseQuantity,
String? tenantFullname,
String? tenantNationalCode,
String? tenantMobile,
String? tenantCity,
bool? hasTenant,
String? archiveDate,
String? createdBy,
String? modifiedBy,
}) = _HatchingModel;
factory HatchingModel.fromJson(Map<String, dynamic> json) => _$HatchingModelFromJson(json);
}
@freezed
abstract class Poultry with _$Poultry {
const factory Poultry({
int? id,
PoultryUser? user,
PoultryAddress? address,
String? key,
bool? trash,
int? ownerIdForeignKey,
int? userIdForeignKey,
int? addressIdForeignKey,
bool? hasChainCompany,
int? userBankIdForeignKey,
String? cityOperator,
String? unitName,
String? gisCode,
num? operatingLicenceCapacity,
num? numberOfHalls,
bool? tenant,
bool? hasTenant,
String? personType,
String? economicCode,
String? systemCode,
String? epidemiologicalCode,
String? breedingUniqueId,
num? totalCapacity,
String? licenceNumber,
String? healthCertificateNumber,
num? numberOfRequests,
String? hatchingDate,
String? lastPartyDate,
num? numberOfIncubators,
num? herdAgeByDay,
num? herdAgeByWeek,
num? numberOfParty,
String? communicationType,
String? cooperative,
String? dateOfRegister,
String? unitStatus,
bool? active,
dynamic identityDocuments,
String? samasatUserCode,
String? baseOrder,
String? incubationDate,
num? walletAmount,
num? city,
num? cityNumber,
String? cityName,
num? provinceNumber,
String? provinceName,
int? walletIdForeignKey,
int? poultryIdKey,
num? lat,
num? long,
String? date,
num? killingAveAge,
num? activeLeftOver,
num? killingAveCount,
num? killingAveWeight,
num? killingLiveWeight,
num? killingCarcassesWeight,
num? killingLossWeightPercent,
num? realKillingAveWeight,
num? realKillingLiveWeight,
num? realKillingCarcassesWeight,
num? realKillingLossWeightPercent,
int? interestLicenseId,
bool? orderLimit,
int? owner,
int? userBankInfo,
int? wallet,
}) = _Poultry;
factory Poultry.fromJson(Map<String, dynamic> json) => _$PoultryFromJson(json);
}
@freezed
abstract class PoultryUser with _$PoultryUser {
const factory PoultryUser({
String? fullname,
String? mobile,
}) = _PoultryUser;
factory PoultryUser.fromJson(Map<String, dynamic> json) => _$PoultryUserFromJson(json);
}
@freezed
abstract class PoultryAddress with _$PoultryAddress {
const factory PoultryAddress({
ProvinceRef? province,
CityRef? city,
String? address,
String? postalCode,
}) = _PoultryAddress;
factory PoultryAddress.fromJson(Map<String, dynamic> json) => _$PoultryAddressFromJson(json);
}
@freezed
abstract class ProvinceRef with _$ProvinceRef {
const factory ProvinceRef({
String? key,
String? name,
}) = _ProvinceRef;
factory ProvinceRef.fromJson(Map<String, dynamic> json) => _$ProvinceRefFromJson(json);
}
@freezed
abstract class CityRef with _$CityRef {
const factory CityRef({
String? key,
String? name,
}) = _CityRef;
factory CityRef.fromJson(Map<String, dynamic> json) => _$CityRefFromJson(json);
}
@freezed
abstract class ChainCompany with _$ChainCompany {
const factory ChainCompany({
ChainUser? user,
dynamic userBankInfo,
String? key,
bool? trash,
String? name,
String? city,
String? province,
String? postalCode,
String? address,
num? wallet,
}) = _ChainCompany;
factory ChainCompany.fromJson(Map<String, dynamic> json) => _$ChainCompanyFromJson(json);
}
@freezed
abstract class ChainUser with _$ChainUser {
const factory ChainUser({
List<String>? role,
String? city,
String? province,
String? key,
String? userGateWayId,
int? userDjangoIdForeignKey,
int? provinceIdForeignKey,
int? cityIdForeignKey,
int? systemUserProfileIdKey,
String? fullname,
String? firstName,
String? lastName,
String? nationalCode,
String? nationalCodeImage,
String? nationalId,
String? mobile,
String? birthday,
String? image,
String? password,
bool? active,
ChainUserState? state,
num? baseOrder,
num? cityNumber,
String? cityName,
num? provinceNumber,
String? provinceName,
String? unitName,
String? unitNationalId,
String? unitRegistrationNumber,
String? unitEconomicalNumber,
String? unitProvince,
String? unitCity,
String? unitPostalCode,
String? unitAddress,
}) = _ChainUser;
factory ChainUser.fromJson(Map<String, dynamic> json) => _$ChainUserFromJson(json);
}
@freezed
abstract class ChainUserState with _$ChainUserState {
const factory ChainUserState({
String? city,
String? image,
String? mobile,
String? birthday,
String? province,
String? lastName,
String? firstName,
String? nationalId,
String? nationalCode,
}) = _ChainUserState;
factory ChainUserState.fromJson(Map<String, dynamic> json) => _$ChainUserStateFromJson(json);
}
@freezed
abstract class VetFarm with _$VetFarm {
const factory VetFarm({
String? vetFarmFullName,
String? vetFarmMobile,
}) = _VetFarm;
factory VetFarm.fromJson(Map<String, dynamic> json) => _$VetFarmFromJson(json);
}
@freezed
abstract class ActiveKill with _$ActiveKill {
const factory ActiveKill({
bool? activeKill,
num? countOfRequest,
}) = _ActiveKill;
factory ActiveKill.fromJson(Map<String, dynamic> json) => _$ActiveKillFromJson(json);
}
@freezed
abstract class KillingInfo with _$KillingInfo {
const factory KillingInfo({
String? violationMessage,
num? provinceKillRequests,
num? provinceKillRequestsQuantity,
num? provinceKillRequestsWeight,
num? killHouseRequests,
num? killHouseRequestsFirstQuantity,
num? killHouseRequestsFirstWeight,
num? barCompleteWithKillHouse,
num? acceptedRealQuantityFinal,
num? acceptedRealWightFinal,
num? wareHouseBars,
num? wareHouseBarsQuantity,
num? wareHouseBarsWeight,
num? wareHouseBarsWeightLose,
}) = _KillingInfo;
factory KillingInfo.fromJson(Map<String, dynamic> json) => _$KillingInfoFromJson(json);
}
@freezed
abstract class FreeGovernmentalInfo with _$FreeGovernmentalInfo {
const factory FreeGovernmentalInfo({
num? governmentalAllocatedQuantity,
num? totalCommitmentQuantity,
num? freeAllocatedQuantity,
num? totalFreeCommitmentQuantity,
num? leftTotalFreeCommitmentQuantity,
}) = _FreeGovernmentalInfo;
factory FreeGovernmentalInfo.fromJson(Map<String, dynamic> json) => _$FreeGovernmentalInfoFromJson(json);
}
@freezed
abstract class ReportInfo with _$ReportInfo {
const factory ReportInfo({
bool? poultryScience,
bool? image,
}) = _ReportInfo;
factory ReportInfo.fromJson(Map<String, dynamic> json) => _$ReportInfoFromJson(json);
}
@freezed
abstract class LatestHatchingChange with _$LatestHatchingChange {
const factory LatestHatchingChange({
String? date,
String? role,
String? fullName,
}) = _LatestHatchingChange;
factory LatestHatchingChange.fromJson(Map<String, dynamic> json) => _$LatestHatchingChangeFromJson(json);
}
@freezed
abstract class Registrar with _$Registrar {
const factory Registrar({
String? date,
String? role,
String? fullname,
}) = _Registrar;
factory Registrar.fromJson(Map<String, dynamic> json) => _$RegistrarFromJson(json);
}
@freezed
abstract class LastChange with _$LastChange {
const factory LastChange({
String? date,
String? role,
String? type,
String? fullName,
}) = _LastChange;
factory LastChange.fromJson(Map<String, dynamic> json) => _$LastChangeFromJson(json);
}
@freezed
abstract class BreedItem with _$BreedItem {
const factory BreedItem({
String? breed,
num? mainQuantity,
num? remainQuantity,
}) = _BreedItem;
factory BreedItem.fromJson(Map<String, dynamic> json) => _$BreedItemFromJson(json);
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,723 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'hatching_models.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
_HatchingModel _$HatchingModelFromJson(
Map<String, dynamic> json,
) => _HatchingModel(
id: (json['id'] as num?)?.toInt(),
poultry: json['poultry'] == null
? null
: Poultry.fromJson(json['poultry'] as Map<String, dynamic>),
chainCompany: json['chain_company'] == null
? null
: ChainCompany.fromJson(json['chain_company'] as Map<String, dynamic>),
age: json['age'] as num?,
inspectionLosses: json['inspection_losses'],
vetFarm: json['vet_farm'] == null
? null
: VetFarm.fromJson(json['vet_farm'] as Map<String, dynamic>),
activeKill: json['active_kill'] == null
? null
: ActiveKill.fromJson(json['active_kill'] as Map<String, dynamic>),
killingInfo: json['killing_info'] == null
? null
: KillingInfo.fromJson(json['killing_info'] as Map<String, dynamic>),
freeGovernmentalInfo: json['free_governmental_info'] == null
? null
: FreeGovernmentalInfo.fromJson(
json['free_governmental_info'] as Map<String, dynamic>,
),
reportInfo: json['report_info'] == null
? null
: ReportInfo.fromJson(json['report_info'] as Map<String, dynamic>),
key: json['key'] as String?,
createDate: json['create_date'] as String?,
modifyDate: json['modify_date'] as String?,
trash: json['trash'] as bool?,
hasChainCompany: json['has_chain_company'] as bool?,
poultryIdForeignKey: (json['poultry_id_foreign_key'] as num?)?.toInt(),
poultryHatchingIdKey: (json['poultry_hatching_id_key'] as num?)?.toInt(),
quantity: json['quantity'] as num?,
losses: json['losses'] as num?,
leftOver: json['left_over'] as num?,
killedQuantity: json['killed_quantity'] as num?,
extraKilledQuantity: json['extra_killed_quantity'] as num?,
governmentalKilledQuantity: json['governmental_killed_quantity'] as num?,
governmentalQuantity: json['governmental_quantity'] as num?,
freeKilledQuantity: json['free_killed_quantity'] as num?,
freeQuantity: json['free_quantity'] as num?,
chainKilledQuantity: json['chain_killed_quantity'] as num?,
chainKilledWeight: json['chain_killed_weight'] as num?,
outProvinceKilledWeight: json['out_province_killed_weight'] as num?,
outProvinceKilledQuantity: json['out_province_killed_quantity'] as num?,
exportKilledWeight: json['export_killed_weight'] as num?,
exportKilledQuantity: json['export_killed_quantity'] as num?,
totalCommitment: json['total_commitment'] as num?,
commitmentType: json['commitment_type'] as String?,
totalCommitmentQuantity: json['total_commitment_quantity'] as num?,
totalFreeCommitmentQuantity: json['total_free_commitment_quantity'] as num?,
totalFreeCommitmentWeight: json['total_free_commitment_weight'] as num?,
totalKilledWeight: json['total_killed_weight'] as num?,
totalAverageKilledWeight: json['total_average_killed_weight'] as num?,
requestLeftOver: json['request_left_over'] as num?,
hall: json['hall'] as num?,
date: json['date'] as String?,
predicateDate: json['predicate_date'] as String?,
chickenBreed: json['chicken_breed'] as String?,
period: json['period'] as num?,
allowHatching: json['allow_hatching'] as String?,
state: json['state'] as String?,
archive: json['archive'] as bool?,
violation: json['violation'] as bool?,
message: json['message'] as String?,
registrar: json['registrar'] == null
? null
: Registrar.fromJson(json['registrar'] as Map<String, dynamic>),
breed: (json['breed'] as List<dynamic>?)
?.map((e) => BreedItem.fromJson(e as Map<String, dynamic>))
.toList(),
cityNumber: json['city_number'] as num?,
cityName: json['city_name'] as String?,
provinceNumber: json['province_number'] as num?,
provinceName: json['province_name'] as String?,
lastChange: json['last_change'] == null
? null
: LastChange.fromJson(json['last_change'] as Map<String, dynamic>),
chickenAge: json['chicken_age'] as num?,
nowAge: json['now_age'] as num?,
latestHatchingChange: json['latest_hatching_change'] == null
? null
: LatestHatchingChange.fromJson(
json['latest_hatching_change'] as Map<String, dynamic>,
),
violationReport: json['violation_report'] as String?,
violationMessage: json['violation_message'] as String?,
violationImage: (json['violation_image'] as List<dynamic>?)
?.map((e) => e as String)
.toList(),
violationReporter: json['violation_reporter'] as String?,
violationReportDate: json['violation_report_date'] as String?,
violationReportEditor: json['violation_report_editor'] as String?,
violationReportEditDate: json['violation_report_edit_date'] as String?,
totalLosses: json['total_losses'] as num?,
directLosses: json['direct_losses'] as num?,
directLossesInputer: json['direct_losses_inputer'] as String?,
directLossesDate: json['direct_losses_date'] as String?,
directLossesEditor: json['direct_losses_editor'] as String?,
directLossesLastEditDate: json['direct_losses_last_edit_date'] as String?,
endPeriodLossesInputer: json['end_period_losses_inputer'] as String?,
endPeriodLossesDate: json['end_period_losses_date'] as String?,
endPeriodLossesEditor: json['end_period_losses_editor'] as String?,
endPeriodLossesLastEditDate:
json['end_period_losses_last_edit_date'] as String?,
breedingUniqueId: json['breeding_unique_id'] as String?,
licenceNumber: json['licence_number'] as String?,
temporaryTrash: json['temporary_trash'] as bool?,
temporaryDeleted: json['temporary_deleted'] as bool?,
firstDateInputArchive: json['first_date_input_archive'] as String?,
secondDateInputArchive: json['second_date_input_archive'] as String?,
inputArchiver: json['input_archiver'] as String?,
outputArchiveDate: json['output_archive_date'] as String?,
outputArchiver: json['output_archiver'] as String?,
barDifferenceRequestWeight: json['bar_difference_request_weight'] as num?,
barDifferenceRequestQuantity: json['bar_difference_request_quantity'] as num?,
healthCertificate: json['health_certificate'] as String?,
samasatDischargePercentage: json['samasat_discharge_percentage'] as num?,
personTypeName: json['person_type_name'] as String?,
interactTypeName: json['interact_type_name'] as String?,
unionTypeName: json['union_type_name'] as String?,
certId: json['cert_id'] as String?,
increaseQuantity: json['increase_quantity'] as num?,
tenantFullname: json['tenant_fullname'] as String?,
tenantNationalCode: json['tenant_national_code'] as String?,
tenantMobile: json['tenant_mobile'] as String?,
tenantCity: json['tenant_city'] as String?,
hasTenant: json['has_tenant'] as bool?,
archiveDate: json['archive_date'] as String?,
createdBy: json['created_by'] as String?,
modifiedBy: json['modified_by'] as String?,
);
Map<String, dynamic> _$HatchingModelToJson(_HatchingModel instance) =>
<String, dynamic>{
'id': instance.id,
'poultry': instance.poultry,
'chain_company': instance.chainCompany,
'age': instance.age,
'inspection_losses': instance.inspectionLosses,
'vet_farm': instance.vetFarm,
'active_kill': instance.activeKill,
'killing_info': instance.killingInfo,
'free_governmental_info': instance.freeGovernmentalInfo,
'report_info': instance.reportInfo,
'key': instance.key,
'create_date': instance.createDate,
'modify_date': instance.modifyDate,
'trash': instance.trash,
'has_chain_company': instance.hasChainCompany,
'poultry_id_foreign_key': instance.poultryIdForeignKey,
'poultry_hatching_id_key': instance.poultryHatchingIdKey,
'quantity': instance.quantity,
'losses': instance.losses,
'left_over': instance.leftOver,
'killed_quantity': instance.killedQuantity,
'extra_killed_quantity': instance.extraKilledQuantity,
'governmental_killed_quantity': instance.governmentalKilledQuantity,
'governmental_quantity': instance.governmentalQuantity,
'free_killed_quantity': instance.freeKilledQuantity,
'free_quantity': instance.freeQuantity,
'chain_killed_quantity': instance.chainKilledQuantity,
'chain_killed_weight': instance.chainKilledWeight,
'out_province_killed_weight': instance.outProvinceKilledWeight,
'out_province_killed_quantity': instance.outProvinceKilledQuantity,
'export_killed_weight': instance.exportKilledWeight,
'export_killed_quantity': instance.exportKilledQuantity,
'total_commitment': instance.totalCommitment,
'commitment_type': instance.commitmentType,
'total_commitment_quantity': instance.totalCommitmentQuantity,
'total_free_commitment_quantity': instance.totalFreeCommitmentQuantity,
'total_free_commitment_weight': instance.totalFreeCommitmentWeight,
'total_killed_weight': instance.totalKilledWeight,
'total_average_killed_weight': instance.totalAverageKilledWeight,
'request_left_over': instance.requestLeftOver,
'hall': instance.hall,
'date': instance.date,
'predicate_date': instance.predicateDate,
'chicken_breed': instance.chickenBreed,
'period': instance.period,
'allow_hatching': instance.allowHatching,
'state': instance.state,
'archive': instance.archive,
'violation': instance.violation,
'message': instance.message,
'registrar': instance.registrar,
'breed': instance.breed,
'city_number': instance.cityNumber,
'city_name': instance.cityName,
'province_number': instance.provinceNumber,
'province_name': instance.provinceName,
'last_change': instance.lastChange,
'chicken_age': instance.chickenAge,
'now_age': instance.nowAge,
'latest_hatching_change': instance.latestHatchingChange,
'violation_report': instance.violationReport,
'violation_message': instance.violationMessage,
'violation_image': instance.violationImage,
'violation_reporter': instance.violationReporter,
'violation_report_date': instance.violationReportDate,
'violation_report_editor': instance.violationReportEditor,
'violation_report_edit_date': instance.violationReportEditDate,
'total_losses': instance.totalLosses,
'direct_losses': instance.directLosses,
'direct_losses_inputer': instance.directLossesInputer,
'direct_losses_date': instance.directLossesDate,
'direct_losses_editor': instance.directLossesEditor,
'direct_losses_last_edit_date': instance.directLossesLastEditDate,
'end_period_losses_inputer': instance.endPeriodLossesInputer,
'end_period_losses_date': instance.endPeriodLossesDate,
'end_period_losses_editor': instance.endPeriodLossesEditor,
'end_period_losses_last_edit_date': instance.endPeriodLossesLastEditDate,
'breeding_unique_id': instance.breedingUniqueId,
'licence_number': instance.licenceNumber,
'temporary_trash': instance.temporaryTrash,
'temporary_deleted': instance.temporaryDeleted,
'first_date_input_archive': instance.firstDateInputArchive,
'second_date_input_archive': instance.secondDateInputArchive,
'input_archiver': instance.inputArchiver,
'output_archive_date': instance.outputArchiveDate,
'output_archiver': instance.outputArchiver,
'bar_difference_request_weight': instance.barDifferenceRequestWeight,
'bar_difference_request_quantity': instance.barDifferenceRequestQuantity,
'health_certificate': instance.healthCertificate,
'samasat_discharge_percentage': instance.samasatDischargePercentage,
'person_type_name': instance.personTypeName,
'interact_type_name': instance.interactTypeName,
'union_type_name': instance.unionTypeName,
'cert_id': instance.certId,
'increase_quantity': instance.increaseQuantity,
'tenant_fullname': instance.tenantFullname,
'tenant_national_code': instance.tenantNationalCode,
'tenant_mobile': instance.tenantMobile,
'tenant_city': instance.tenantCity,
'has_tenant': instance.hasTenant,
'archive_date': instance.archiveDate,
'created_by': instance.createdBy,
'modified_by': instance.modifiedBy,
};
_Poultry _$PoultryFromJson(Map<String, dynamic> json) => _Poultry(
id: (json['id'] as num?)?.toInt(),
user: json['user'] == null
? null
: PoultryUser.fromJson(json['user'] as Map<String, dynamic>),
address: json['address'] == null
? null
: PoultryAddress.fromJson(json['address'] as Map<String, dynamic>),
key: json['key'] as String?,
trash: json['trash'] as bool?,
ownerIdForeignKey: (json['owner_id_foreign_key'] as num?)?.toInt(),
userIdForeignKey: (json['user_id_foreign_key'] as num?)?.toInt(),
addressIdForeignKey: (json['address_id_foreign_key'] as num?)?.toInt(),
hasChainCompany: json['has_chain_company'] as bool?,
userBankIdForeignKey: (json['user_bank_id_foreign_key'] as num?)?.toInt(),
cityOperator: json['city_operator'] as String?,
unitName: json['unit_name'] as String?,
gisCode: json['gis_code'] as String?,
operatingLicenceCapacity: json['operating_licence_capacity'] as num?,
numberOfHalls: json['number_of_halls'] as num?,
tenant: json['tenant'] as bool?,
hasTenant: json['has_tenant'] as bool?,
personType: json['person_type'] as String?,
economicCode: json['economic_code'] as String?,
systemCode: json['system_code'] as String?,
epidemiologicalCode: json['epidemiological_code'] as String?,
breedingUniqueId: json['breeding_unique_id'] as String?,
totalCapacity: json['total_capacity'] as num?,
licenceNumber: json['licence_number'] as String?,
healthCertificateNumber: json['health_certificate_number'] as String?,
numberOfRequests: json['number_of_requests'] as num?,
hatchingDate: json['hatching_date'] as String?,
lastPartyDate: json['last_party_date'] as String?,
numberOfIncubators: json['number_of_incubators'] as num?,
herdAgeByDay: json['herd_age_by_day'] as num?,
herdAgeByWeek: json['herd_age_by_week'] as num?,
numberOfParty: json['number_of_party'] as num?,
communicationType: json['communication_type'] as String?,
cooperative: json['cooperative'] as String?,
dateOfRegister: json['date_of_register'] as String?,
unitStatus: json['unit_status'] as String?,
active: json['active'] as bool?,
identityDocuments: json['identity_documents'],
samasatUserCode: json['samasat_user_code'] as String?,
baseOrder: json['base_order'] as String?,
incubationDate: json['incubation_date'] as String?,
walletAmount: json['wallet_amount'] as num?,
city: json['city'] as num?,
cityNumber: json['city_number'] as num?,
cityName: json['city_name'] as String?,
provinceNumber: json['province_number'] as num?,
provinceName: json['province_name'] as String?,
walletIdForeignKey: (json['wallet_id_foreign_key'] as num?)?.toInt(),
poultryIdKey: (json['poultry_id_key'] as num?)?.toInt(),
lat: json['lat'] as num?,
long: json['long'] as num?,
date: json['date'] as String?,
killingAveAge: json['killing_ave_age'] as num?,
activeLeftOver: json['active_left_over'] as num?,
killingAveCount: json['killing_ave_count'] as num?,
killingAveWeight: json['killing_ave_weight'] as num?,
killingLiveWeight: json['killing_live_weight'] as num?,
killingCarcassesWeight: json['killing_carcasses_weight'] as num?,
killingLossWeightPercent: json['killing_loss_weight_percent'] as num?,
realKillingAveWeight: json['real_killing_ave_weight'] as num?,
realKillingLiveWeight: json['real_killing_live_weight'] as num?,
realKillingCarcassesWeight: json['real_killing_carcasses_weight'] as num?,
realKillingLossWeightPercent:
json['real_killing_loss_weight_percent'] as num?,
interestLicenseId: (json['interest_license_id'] as num?)?.toInt(),
orderLimit: json['order_limit'] as bool?,
owner: (json['owner'] as num?)?.toInt(),
userBankInfo: (json['user_bank_info'] as num?)?.toInt(),
wallet: (json['wallet'] as num?)?.toInt(),
);
Map<String, dynamic> _$PoultryToJson(_Poultry instance) => <String, dynamic>{
'id': instance.id,
'user': instance.user,
'address': instance.address,
'key': instance.key,
'trash': instance.trash,
'owner_id_foreign_key': instance.ownerIdForeignKey,
'user_id_foreign_key': instance.userIdForeignKey,
'address_id_foreign_key': instance.addressIdForeignKey,
'has_chain_company': instance.hasChainCompany,
'user_bank_id_foreign_key': instance.userBankIdForeignKey,
'city_operator': instance.cityOperator,
'unit_name': instance.unitName,
'gis_code': instance.gisCode,
'operating_licence_capacity': instance.operatingLicenceCapacity,
'number_of_halls': instance.numberOfHalls,
'tenant': instance.tenant,
'has_tenant': instance.hasTenant,
'person_type': instance.personType,
'economic_code': instance.economicCode,
'system_code': instance.systemCode,
'epidemiological_code': instance.epidemiologicalCode,
'breeding_unique_id': instance.breedingUniqueId,
'total_capacity': instance.totalCapacity,
'licence_number': instance.licenceNumber,
'health_certificate_number': instance.healthCertificateNumber,
'number_of_requests': instance.numberOfRequests,
'hatching_date': instance.hatchingDate,
'last_party_date': instance.lastPartyDate,
'number_of_incubators': instance.numberOfIncubators,
'herd_age_by_day': instance.herdAgeByDay,
'herd_age_by_week': instance.herdAgeByWeek,
'number_of_party': instance.numberOfParty,
'communication_type': instance.communicationType,
'cooperative': instance.cooperative,
'date_of_register': instance.dateOfRegister,
'unit_status': instance.unitStatus,
'active': instance.active,
'identity_documents': instance.identityDocuments,
'samasat_user_code': instance.samasatUserCode,
'base_order': instance.baseOrder,
'incubation_date': instance.incubationDate,
'wallet_amount': instance.walletAmount,
'city': instance.city,
'city_number': instance.cityNumber,
'city_name': instance.cityName,
'province_number': instance.provinceNumber,
'province_name': instance.provinceName,
'wallet_id_foreign_key': instance.walletIdForeignKey,
'poultry_id_key': instance.poultryIdKey,
'lat': instance.lat,
'long': instance.long,
'date': instance.date,
'killing_ave_age': instance.killingAveAge,
'active_left_over': instance.activeLeftOver,
'killing_ave_count': instance.killingAveCount,
'killing_ave_weight': instance.killingAveWeight,
'killing_live_weight': instance.killingLiveWeight,
'killing_carcasses_weight': instance.killingCarcassesWeight,
'killing_loss_weight_percent': instance.killingLossWeightPercent,
'real_killing_ave_weight': instance.realKillingAveWeight,
'real_killing_live_weight': instance.realKillingLiveWeight,
'real_killing_carcasses_weight': instance.realKillingCarcassesWeight,
'real_killing_loss_weight_percent': instance.realKillingLossWeightPercent,
'interest_license_id': instance.interestLicenseId,
'order_limit': instance.orderLimit,
'owner': instance.owner,
'user_bank_info': instance.userBankInfo,
'wallet': instance.wallet,
};
_PoultryUser _$PoultryUserFromJson(Map<String, dynamic> json) => _PoultryUser(
fullname: json['fullname'] as String?,
mobile: json['mobile'] as String?,
);
Map<String, dynamic> _$PoultryUserToJson(_PoultryUser instance) =>
<String, dynamic>{'fullname': instance.fullname, 'mobile': instance.mobile};
_PoultryAddress _$PoultryAddressFromJson(Map<String, dynamic> json) =>
_PoultryAddress(
province: json['province'] == null
? null
: ProvinceRef.fromJson(json['province'] as Map<String, dynamic>),
city: json['city'] == null
? null
: CityRef.fromJson(json['city'] as Map<String, dynamic>),
address: json['address'] as String?,
postalCode: json['postal_code'] as String?,
);
Map<String, dynamic> _$PoultryAddressToJson(_PoultryAddress instance) =>
<String, dynamic>{
'province': instance.province,
'city': instance.city,
'address': instance.address,
'postal_code': instance.postalCode,
};
_ProvinceRef _$ProvinceRefFromJson(Map<String, dynamic> json) =>
_ProvinceRef(key: json['key'] as String?, name: json['name'] as String?);
Map<String, dynamic> _$ProvinceRefToJson(_ProvinceRef instance) =>
<String, dynamic>{'key': instance.key, 'name': instance.name};
_CityRef _$CityRefFromJson(Map<String, dynamic> json) =>
_CityRef(key: json['key'] as String?, name: json['name'] as String?);
Map<String, dynamic> _$CityRefToJson(_CityRef instance) => <String, dynamic>{
'key': instance.key,
'name': instance.name,
};
_ChainCompany _$ChainCompanyFromJson(Map<String, dynamic> json) =>
_ChainCompany(
user: json['user'] == null
? null
: ChainUser.fromJson(json['user'] as Map<String, dynamic>),
userBankInfo: json['user_bank_info'],
key: json['key'] as String?,
trash: json['trash'] as bool?,
name: json['name'] as String?,
city: json['city'] as String?,
province: json['province'] as String?,
postalCode: json['postal_code'] as String?,
address: json['address'] as String?,
wallet: json['wallet'] as num?,
);
Map<String, dynamic> _$ChainCompanyToJson(_ChainCompany instance) =>
<String, dynamic>{
'user': instance.user,
'user_bank_info': instance.userBankInfo,
'key': instance.key,
'trash': instance.trash,
'name': instance.name,
'city': instance.city,
'province': instance.province,
'postal_code': instance.postalCode,
'address': instance.address,
'wallet': instance.wallet,
};
_ChainUser _$ChainUserFromJson(Map<String, dynamic> json) => _ChainUser(
role: (json['role'] as List<dynamic>?)?.map((e) => e as String).toList(),
city: json['city'] as String?,
province: json['province'] as String?,
key: json['key'] as String?,
userGateWayId: json['user_gate_way_id'] as String?,
userDjangoIdForeignKey: (json['user_django_id_foreign_key'] as num?)?.toInt(),
provinceIdForeignKey: (json['province_id_foreign_key'] as num?)?.toInt(),
cityIdForeignKey: (json['city_id_foreign_key'] as num?)?.toInt(),
systemUserProfileIdKey: (json['system_user_profile_id_key'] as num?)?.toInt(),
fullname: json['fullname'] as String?,
firstName: json['first_name'] as String?,
lastName: json['last_name'] as String?,
nationalCode: json['national_code'] as String?,
nationalCodeImage: json['national_code_image'] as String?,
nationalId: json['national_id'] as String?,
mobile: json['mobile'] as String?,
birthday: json['birthday'] as String?,
image: json['image'] as String?,
password: json['password'] as String?,
active: json['active'] as bool?,
state: json['state'] == null
? null
: ChainUserState.fromJson(json['state'] as Map<String, dynamic>),
baseOrder: json['base_order'] as num?,
cityNumber: json['city_number'] as num?,
cityName: json['city_name'] as String?,
provinceNumber: json['province_number'] as num?,
provinceName: json['province_name'] as String?,
unitName: json['unit_name'] as String?,
unitNationalId: json['unit_national_id'] as String?,
unitRegistrationNumber: json['unit_registration_number'] as String?,
unitEconomicalNumber: json['unit_economical_number'] as String?,
unitProvince: json['unit_province'] as String?,
unitCity: json['unit_city'] as String?,
unitPostalCode: json['unit_postal_code'] as String?,
unitAddress: json['unit_address'] as String?,
);
Map<String, dynamic> _$ChainUserToJson(_ChainUser instance) =>
<String, dynamic>{
'role': instance.role,
'city': instance.city,
'province': instance.province,
'key': instance.key,
'user_gate_way_id': instance.userGateWayId,
'user_django_id_foreign_key': instance.userDjangoIdForeignKey,
'province_id_foreign_key': instance.provinceIdForeignKey,
'city_id_foreign_key': instance.cityIdForeignKey,
'system_user_profile_id_key': instance.systemUserProfileIdKey,
'fullname': instance.fullname,
'first_name': instance.firstName,
'last_name': instance.lastName,
'national_code': instance.nationalCode,
'national_code_image': instance.nationalCodeImage,
'national_id': instance.nationalId,
'mobile': instance.mobile,
'birthday': instance.birthday,
'image': instance.image,
'password': instance.password,
'active': instance.active,
'state': instance.state,
'base_order': instance.baseOrder,
'city_number': instance.cityNumber,
'city_name': instance.cityName,
'province_number': instance.provinceNumber,
'province_name': instance.provinceName,
'unit_name': instance.unitName,
'unit_national_id': instance.unitNationalId,
'unit_registration_number': instance.unitRegistrationNumber,
'unit_economical_number': instance.unitEconomicalNumber,
'unit_province': instance.unitProvince,
'unit_city': instance.unitCity,
'unit_postal_code': instance.unitPostalCode,
'unit_address': instance.unitAddress,
};
_ChainUserState _$ChainUserStateFromJson(Map<String, dynamic> json) =>
_ChainUserState(
city: json['city'] as String?,
image: json['image'] as String?,
mobile: json['mobile'] as String?,
birthday: json['birthday'] as String?,
province: json['province'] as String?,
lastName: json['last_name'] as String?,
firstName: json['first_name'] as String?,
nationalId: json['national_id'] as String?,
nationalCode: json['national_code'] as String?,
);
Map<String, dynamic> _$ChainUserStateToJson(_ChainUserState instance) =>
<String, dynamic>{
'city': instance.city,
'image': instance.image,
'mobile': instance.mobile,
'birthday': instance.birthday,
'province': instance.province,
'last_name': instance.lastName,
'first_name': instance.firstName,
'national_id': instance.nationalId,
'national_code': instance.nationalCode,
};
_VetFarm _$VetFarmFromJson(Map<String, dynamic> json) => _VetFarm(
vetFarmFullName: json['vet_farm_full_name'] as String?,
vetFarmMobile: json['vet_farm_mobile'] as String?,
);
Map<String, dynamic> _$VetFarmToJson(_VetFarm instance) => <String, dynamic>{
'vet_farm_full_name': instance.vetFarmFullName,
'vet_farm_mobile': instance.vetFarmMobile,
};
_ActiveKill _$ActiveKillFromJson(Map<String, dynamic> json) => _ActiveKill(
activeKill: json['active_kill'] as bool?,
countOfRequest: json['count_of_request'] as num?,
);
Map<String, dynamic> _$ActiveKillToJson(_ActiveKill instance) =>
<String, dynamic>{
'active_kill': instance.activeKill,
'count_of_request': instance.countOfRequest,
};
_KillingInfo _$KillingInfoFromJson(Map<String, dynamic> json) => _KillingInfo(
violationMessage: json['violation_message'] as String?,
provinceKillRequests: json['province_kill_requests'] as num?,
provinceKillRequestsQuantity: json['province_kill_requests_quantity'] as num?,
provinceKillRequestsWeight: json['province_kill_requests_weight'] as num?,
killHouseRequests: json['kill_house_requests'] as num?,
killHouseRequestsFirstQuantity:
json['kill_house_requests_first_quantity'] as num?,
killHouseRequestsFirstWeight:
json['kill_house_requests_first_weight'] as num?,
barCompleteWithKillHouse: json['bar_complete_with_kill_house'] as num?,
acceptedRealQuantityFinal: json['accepted_real_quantity_final'] as num?,
acceptedRealWightFinal: json['accepted_real_wight_final'] as num?,
wareHouseBars: json['ware_house_bars'] as num?,
wareHouseBarsQuantity: json['ware_house_bars_quantity'] as num?,
wareHouseBarsWeight: json['ware_house_bars_weight'] as num?,
wareHouseBarsWeightLose: json['ware_house_bars_weight_lose'] as num?,
);
Map<String, dynamic> _$KillingInfoToJson(
_KillingInfo instance,
) => <String, dynamic>{
'violation_message': instance.violationMessage,
'province_kill_requests': instance.provinceKillRequests,
'province_kill_requests_quantity': instance.provinceKillRequestsQuantity,
'province_kill_requests_weight': instance.provinceKillRequestsWeight,
'kill_house_requests': instance.killHouseRequests,
'kill_house_requests_first_quantity': instance.killHouseRequestsFirstQuantity,
'kill_house_requests_first_weight': instance.killHouseRequestsFirstWeight,
'bar_complete_with_kill_house': instance.barCompleteWithKillHouse,
'accepted_real_quantity_final': instance.acceptedRealQuantityFinal,
'accepted_real_wight_final': instance.acceptedRealWightFinal,
'ware_house_bars': instance.wareHouseBars,
'ware_house_bars_quantity': instance.wareHouseBarsQuantity,
'ware_house_bars_weight': instance.wareHouseBarsWeight,
'ware_house_bars_weight_lose': instance.wareHouseBarsWeightLose,
};
_FreeGovernmentalInfo _$FreeGovernmentalInfoFromJson(
Map<String, dynamic> json,
) => _FreeGovernmentalInfo(
governmentalAllocatedQuantity:
json['governmental_allocated_quantity'] as num?,
totalCommitmentQuantity: json['total_commitment_quantity'] as num?,
freeAllocatedQuantity: json['free_allocated_quantity'] as num?,
totalFreeCommitmentQuantity: json['total_free_commitment_quantity'] as num?,
leftTotalFreeCommitmentQuantity:
json['left_total_free_commitment_quantity'] as num?,
);
Map<String, dynamic> _$FreeGovernmentalInfoToJson(
_FreeGovernmentalInfo instance,
) => <String, dynamic>{
'governmental_allocated_quantity': instance.governmentalAllocatedQuantity,
'total_commitment_quantity': instance.totalCommitmentQuantity,
'free_allocated_quantity': instance.freeAllocatedQuantity,
'total_free_commitment_quantity': instance.totalFreeCommitmentQuantity,
'left_total_free_commitment_quantity':
instance.leftTotalFreeCommitmentQuantity,
};
_ReportInfo _$ReportInfoFromJson(Map<String, dynamic> json) => _ReportInfo(
poultryScience: json['poultry_science'] as bool?,
image: json['image'] as bool?,
);
Map<String, dynamic> _$ReportInfoToJson(_ReportInfo instance) =>
<String, dynamic>{
'poultry_science': instance.poultryScience,
'image': instance.image,
};
_LatestHatchingChange _$LatestHatchingChangeFromJson(
Map<String, dynamic> json,
) => _LatestHatchingChange(
date: json['date'] as String?,
role: json['role'] as String?,
fullName: json['full_name'] as String?,
);
Map<String, dynamic> _$LatestHatchingChangeToJson(
_LatestHatchingChange instance,
) => <String, dynamic>{
'date': instance.date,
'role': instance.role,
'full_name': instance.fullName,
};
_Registrar _$RegistrarFromJson(Map<String, dynamic> json) => _Registrar(
date: json['date'] as String?,
role: json['role'] as String?,
fullname: json['fullname'] as String?,
);
Map<String, dynamic> _$RegistrarToJson(_Registrar instance) =>
<String, dynamic>{
'date': instance.date,
'role': instance.role,
'fullname': instance.fullname,
};
_LastChange _$LastChangeFromJson(Map<String, dynamic> json) => _LastChange(
date: json['date'] as String?,
role: json['role'] as String?,
type: json['type'] as String?,
fullName: json['full_name'] as String?,
);
Map<String, dynamic> _$LastChangeToJson(_LastChange instance) =>
<String, dynamic>{
'date': instance.date,
'role': instance.role,
'type': instance.type,
'full_name': instance.fullName,
};
_BreedItem _$BreedItemFromJson(Map<String, dynamic> json) => _BreedItem(
breed: json['breed'] as String?,
mainQuantity: json['main_quantity'] as num?,
remainQuantity: json['remain_quantity'] as num?,
);
Map<String, dynamic> _$BreedItemToJson(_BreedItem instance) =>
<String, dynamic>{
'breed': instance.breed,
'main_quantity': instance.mainQuantity,
'remain_quantity': instance.remainQuantity,
};

View File

@@ -0,0 +1,122 @@
import 'package:freezed_annotation/freezed_annotation.dart';
part 'hatching_report.freezed.dart';
part 'hatching_report.g.dart';
@freezed
abstract class HatchingReport with _$HatchingReport {
const factory HatchingReport({
int? id,
PoultryScience? poultryScience,
Hatching? hatching,
String? key,
String? createDate,
String? modifyDate,
bool? trash,
String? date,
List<String>? image,
double? lat,
double? log,
String? reporterFullname,
String? reporterMobile,
String? createdBy,
String? modifiedBy,
}) = _HatchingReport;
factory HatchingReport.fromJson(Map<String, dynamic> json) => _$HatchingReportFromJson(json);
}
@freezed
abstract class PoultryScience with _$PoultryScience {
const factory PoultryScience({
int? id,
User? user,
String? key,
String? createDate,
String? modifyDate,
bool? trash,
String? createdBy,
String? modifiedBy,
List<int>? poultry,
}) = _PoultryScience;
factory PoultryScience.fromJson(Map<String, dynamic> json) => _$PoultryScienceFromJson(json);
}
@freezed
abstract class User with _$User {
const factory User({String? fullname, String? mobile}) = _User;
factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
}
@freezed
abstract class Hatching with _$Hatching {
const factory Hatching({
Poultry? poultry,
GeneralInfo? generalInfo,
String? chickenBreed,
String? date,
int? quantity,
int? leftOver,
int? period,
int? losses,
bool? violation,
String? licenceNumber,
int? chickenAge,
VetFarm? vetFarm,
}) = _Hatching;
factory Hatching.fromJson(Map<String, dynamic> json) => _$HatchingFromJson(json);
}
@freezed
abstract class VetFarm with _$VetFarm {
const factory VetFarm({
String? vetFarmFullname,
String? vetFarmMobile,
}) = _VetFarm;
factory VetFarm.fromJson(Map<String, dynamic> json) => _$VetFarmFromJson(json);
}
@freezed
abstract class Poultry with _$Poultry {
const factory Poultry({
String? key,
String? fullname,
String? mobile,
String? city,
String? unitName,
int? killingAveAge,
int? activeLeftOver,
int? killingAveCount,
double? realKillingAveWeight,
double? realKillingLiveWeight,
double? realKillingCarcassesWeight,
double? realKillingLossWeightPercent,
}) = _Poultry;
factory Poultry.fromJson(Map<String, dynamic> json) => _$PoultryFromJson(json);
}
@freezed
abstract class GeneralInfo with _$GeneralInfo {
const factory GeneralInfo({
int? aveAge,
int? age,
double? aveWeight,
int? provinceKillRequests,
int? provinceKillRequestsQuantity,
double? provinceKillRequestsWeight,
int? killHouseRequestsQuantity,
int? killHouseRequests,
double? killHouseRequestsWeight,
int? totalQuantity,
double? totalWeight,
}) = _GeneralInfo;
factory GeneralInfo.fromJson(Map<String, dynamic> json) => _$GeneralInfoFromJson(json);
}

View File

@@ -0,0 +1,204 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'hatching_report.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
_HatchingReport _$HatchingReportFromJson(Map<String, dynamic> json) =>
_HatchingReport(
id: (json['id'] as num?)?.toInt(),
poultryScience: json['poultry_science'] == null
? null
: PoultryScience.fromJson(
json['poultry_science'] as Map<String, dynamic>,
),
hatching: json['hatching'] == null
? null
: Hatching.fromJson(json['hatching'] as Map<String, dynamic>),
key: json['key'] as String?,
createDate: json['create_date'] as String?,
modifyDate: json['modify_date'] as String?,
trash: json['trash'] as bool?,
date: json['date'] as String?,
image: (json['image'] as List<dynamic>?)
?.map((e) => e as String)
.toList(),
lat: (json['lat'] as num?)?.toDouble(),
log: (json['log'] as num?)?.toDouble(),
reporterFullname: json['reporter_fullname'] as String?,
reporterMobile: json['reporter_mobile'] as String?,
createdBy: json['created_by'] as String?,
modifiedBy: json['modified_by'] as String?,
);
Map<String, dynamic> _$HatchingReportToJson(_HatchingReport instance) =>
<String, dynamic>{
'id': instance.id,
'poultry_science': instance.poultryScience,
'hatching': instance.hatching,
'key': instance.key,
'create_date': instance.createDate,
'modify_date': instance.modifyDate,
'trash': instance.trash,
'date': instance.date,
'image': instance.image,
'lat': instance.lat,
'log': instance.log,
'reporter_fullname': instance.reporterFullname,
'reporter_mobile': instance.reporterMobile,
'created_by': instance.createdBy,
'modified_by': instance.modifiedBy,
};
_PoultryScience _$PoultryScienceFromJson(Map<String, dynamic> json) =>
_PoultryScience(
id: (json['id'] as num?)?.toInt(),
user: json['user'] == null
? null
: User.fromJson(json['user'] as Map<String, dynamic>),
key: json['key'] as String?,
createDate: json['create_date'] as String?,
modifyDate: json['modify_date'] as String?,
trash: json['trash'] as bool?,
createdBy: json['created_by'] as String?,
modifiedBy: json['modified_by'] as String?,
poultry: (json['poultry'] as List<dynamic>?)
?.map((e) => (e as num).toInt())
.toList(),
);
Map<String, dynamic> _$PoultryScienceToJson(_PoultryScience instance) =>
<String, dynamic>{
'id': instance.id,
'user': instance.user,
'key': instance.key,
'create_date': instance.createDate,
'modify_date': instance.modifyDate,
'trash': instance.trash,
'created_by': instance.createdBy,
'modified_by': instance.modifiedBy,
'poultry': instance.poultry,
};
_User _$UserFromJson(Map<String, dynamic> json) => _User(
fullname: json['fullname'] as String?,
mobile: json['mobile'] as String?,
);
Map<String, dynamic> _$UserToJson(_User instance) => <String, dynamic>{
'fullname': instance.fullname,
'mobile': instance.mobile,
};
_Hatching _$HatchingFromJson(Map<String, dynamic> json) => _Hatching(
poultry: json['poultry'] == null
? null
: Poultry.fromJson(json['poultry'] as Map<String, dynamic>),
generalInfo: json['general_info'] == null
? null
: GeneralInfo.fromJson(json['general_info'] as Map<String, dynamic>),
chickenBreed: json['chicken_breed'] as String?,
date: json['date'] as String?,
quantity: (json['quantity'] as num?)?.toInt(),
leftOver: (json['left_over'] as num?)?.toInt(),
period: (json['period'] as num?)?.toInt(),
losses: (json['losses'] as num?)?.toInt(),
violation: json['violation'] as bool?,
licenceNumber: json['licence_number'] as String?,
chickenAge: (json['chicken_age'] as num?)?.toInt(),
vetFarm: json['vet_farm'] == null
? null
: VetFarm.fromJson(json['vet_farm'] as Map<String, dynamic>),
);
Map<String, dynamic> _$HatchingToJson(_Hatching instance) => <String, dynamic>{
'poultry': instance.poultry,
'general_info': instance.generalInfo,
'chicken_breed': instance.chickenBreed,
'date': instance.date,
'quantity': instance.quantity,
'left_over': instance.leftOver,
'period': instance.period,
'losses': instance.losses,
'violation': instance.violation,
'licence_number': instance.licenceNumber,
'chicken_age': instance.chickenAge,
'vet_farm': instance.vetFarm,
};
_VetFarm _$VetFarmFromJson(Map<String, dynamic> json) => _VetFarm(
vetFarmFullname: json['vet_farm_fullname'] as String?,
vetFarmMobile: json['vet_farm_mobile'] as String?,
);
Map<String, dynamic> _$VetFarmToJson(_VetFarm instance) => <String, dynamic>{
'vet_farm_fullname': instance.vetFarmFullname,
'vet_farm_mobile': instance.vetFarmMobile,
};
_Poultry _$PoultryFromJson(Map<String, dynamic> json) => _Poultry(
key: json['key'] as String?,
fullname: json['fullname'] as String?,
mobile: json['mobile'] as String?,
city: json['city'] as String?,
unitName: json['unit_name'] as String?,
killingAveAge: (json['killing_ave_age'] as num?)?.toInt(),
activeLeftOver: (json['active_left_over'] as num?)?.toInt(),
killingAveCount: (json['killing_ave_count'] as num?)?.toInt(),
realKillingAveWeight: (json['real_killing_ave_weight'] as num?)?.toDouble(),
realKillingLiveWeight: (json['real_killing_live_weight'] as num?)?.toDouble(),
realKillingCarcassesWeight: (json['real_killing_carcasses_weight'] as num?)
?.toDouble(),
realKillingLossWeightPercent:
(json['real_killing_loss_weight_percent'] as num?)?.toDouble(),
);
Map<String, dynamic> _$PoultryToJson(_Poultry instance) => <String, dynamic>{
'key': instance.key,
'fullname': instance.fullname,
'mobile': instance.mobile,
'city': instance.city,
'unit_name': instance.unitName,
'killing_ave_age': instance.killingAveAge,
'active_left_over': instance.activeLeftOver,
'killing_ave_count': instance.killingAveCount,
'real_killing_ave_weight': instance.realKillingAveWeight,
'real_killing_live_weight': instance.realKillingLiveWeight,
'real_killing_carcasses_weight': instance.realKillingCarcassesWeight,
'real_killing_loss_weight_percent': instance.realKillingLossWeightPercent,
};
_GeneralInfo _$GeneralInfoFromJson(Map<String, dynamic> json) => _GeneralInfo(
aveAge: (json['ave_age'] as num?)?.toInt(),
age: (json['age'] as num?)?.toInt(),
aveWeight: (json['ave_weight'] as num?)?.toDouble(),
provinceKillRequests: (json['province_kill_requests'] as num?)?.toInt(),
provinceKillRequestsQuantity:
(json['province_kill_requests_quantity'] as num?)?.toInt(),
provinceKillRequestsWeight: (json['province_kill_requests_weight'] as num?)
?.toDouble(),
killHouseRequestsQuantity: (json['kill_house_requests_quantity'] as num?)
?.toInt(),
killHouseRequests: (json['kill_house_requests'] as num?)?.toInt(),
killHouseRequestsWeight: (json['kill_house_requests_weight'] as num?)
?.toDouble(),
totalQuantity: (json['total_quantity'] as num?)?.toInt(),
totalWeight: (json['total_weight'] as num?)?.toDouble(),
);
Map<String, dynamic> _$GeneralInfoToJson(_GeneralInfo instance) =>
<String, dynamic>{
'ave_age': instance.aveAge,
'age': instance.age,
'ave_weight': instance.aveWeight,
'province_kill_requests': instance.provinceKillRequests,
'province_kill_requests_quantity': instance.provinceKillRequestsQuantity,
'province_kill_requests_weight': instance.provinceKillRequestsWeight,
'kill_house_requests_quantity': instance.killHouseRequestsQuantity,
'kill_house_requests': instance.killHouseRequests,
'kill_house_requests_weight': instance.killHouseRequestsWeight,
'total_quantity': instance.totalQuantity,
'total_weight': instance.totalWeight,
};

View File

@@ -1,8 +1,27 @@
import 'package:rasadyar_chicken/data/models/response/hatching/hatching_models.dart';
import 'package:rasadyar_chicken/data/models/response/hatching_report/hatching_report.dart';
import 'package:rasadyar_chicken/data/models/response/poultry_science/home_poultry_science/home_poultry_science_model.dart';
import 'package:rasadyar_core/core.dart';
abstract class PoultryScienceRepository {
Future<HomePoultryScienceModel?> getHomePoultryScience({
Future<HomePoultryScienceModel?> getHomePoultry({required String token, required String type});
Future<PaginationModel<HatchingModel>?> getHatchingPoultry({
required String token,
required String type,
Map<String, dynamic>? queryParameters,
});
Future<void> submitPoultryScienceReport({
required String token,
required IFormData data,
ProgressCallback? onSendProgress,
});
Future<PaginationModel<HatchingReport>?> getHatchingPoultryReport({
required String token,
Map<String, dynamic>? queryParameters,
});
}

View File

@@ -1,5 +1,9 @@
import 'package:rasadyar_chicken/data/data_source/remote/poultry_science/poultry_science_remote.dart';
import 'package:rasadyar_chicken/data/models/response/hatching/hatching_models.dart';
import 'package:rasadyar_chicken/data/models/response/hatching_report/hatching_report.dart';
import 'package:rasadyar_chicken/data/models/response/poultry_science/home_poultry_science/home_poultry_science_model.dart';
import 'package:rasadyar_core/core.dart';
import 'poultry_science_repository.dart';
class PoultryScienceRepositoryImp implements PoultryScienceRepository {
@@ -8,10 +12,33 @@ class PoultryScienceRepositoryImp implements PoultryScienceRepository {
PoultryScienceRepositoryImp(this.datasource);
@override
Future<HomePoultryScienceModel?> getHomePoultryScience({
Future<HomePoultryScienceModel?> getHomePoultry({
required String token,
required String type,
}) async => await datasource.getHomePoultryScience(token: token, type: type);
@override
Future<PaginationModel<HatchingModel>?> getHatchingPoultry({
required String token,
Map<String, dynamic>? queryParameters,
}) async => await datasource.getHatchingPoultry(token: token, queryParameters: queryParameters);
@override
Future<void> submitPoultryScienceReport({
required String token,
required IFormData data,
ProgressCallback? onSendProgress,
}) async => await datasource.submitPoultryScienceReport(
token: token,
data: data,
onSendProgress: onSendProgress,
);
@override
Future<PaginationModel<HatchingReport>?> getHatchingPoultryReport({
required String token,
Map<String, dynamic>? queryParameters,
}) async {
return await datasource.getPoultryScienceReport(token: token, queryParameters: queryParameters);
}
}

View File

@@ -15,7 +15,7 @@ class PoultryScienceHomeLogic extends GetxController {
Future<void> getHomePoultryHatching() async {
await safeCall<HomePoultryScienceModel?>(
call: () async => await rootLogic.poultryRepository.getHomePoultryScience(
call: () async => await rootLogic.poultryRepository.getHomePoultry(
token: rootLogic.tokenService.accessToken.value!,
type: 'home',
),

View File

@@ -141,7 +141,7 @@ class PoultryScienceHomePage extends GetView<PoultryScienceHomeLogic> {
),
),
WidelyUsedWidget(),
// WidelyUsedWidget(),
SizedBox(height: 20),
],
),

View File

@@ -0,0 +1,258 @@
import 'package:rasadyar_chicken/data/models/response/hatching/hatching_models.dart';
import 'package:rasadyar_chicken/data/models/response/hatching_report/hatching_report.dart';
import 'package:rasadyar_chicken/presentation/pages/poultry_science/root/logic.dart';
import 'package:rasadyar_core/core.dart';
class InspectionPoultryScienceLogic extends GetxController {
Rx<Resource<PaginationModel<HatchingModel>>> hatchingList =
Resource<PaginationModel<HatchingModel>>.loading().obs;
Rx<Resource<PaginationModel<HatchingReport>>> hatchingReportList =
Resource<PaginationModel<HatchingReport>>.loading().obs;
PoultryScienceRootLogic rootLogic = Get.find<PoultryScienceRootLogic>();
Rx<LatLng> currentLocation = LatLng(34.798315281272544, 48.51479142983491).obs;
final RxBool isLoadingMoreAllocationsMade = false.obs;
RxInt currentPage = 1.obs;
RxList<int> isExpandedList = <int>[].obs;
RxList<XFile> pickedImages = <XFile>[].obs;
final List<MultipartFile> _multiPartPickedImages = <MultipartFile>[];
RxBool isOnUpload = false.obs;
RxDouble presentUpload = 0.0.obs;
RxList<String> routesName = RxList();
RxInt selectedSegmentIndex = 0.obs;
@override
void onInit() {
super.onInit();
routesName.value = ['اقدام'].toList();
routesName.add(selectedSegmentIndex.value == 0 ? 'بازرسی' : 'بایگانی');
ever(selectedSegmentIndex, (callback) {
routesName.removeLast();
routesName.add(callback == 0 ? 'بازرسی' : 'بایگانی');
});
}
@override
void onReady() {
super.onReady();
getHatchingList();
getHatchingReport();
checkPermission(request: true);
ever(pickedImages, (callback) {
_multiPartPickedImages.clear();
for (var element in pickedImages) {
_multiPartPickedImages.add(
MultipartFile.fromFileSync(element.path, filename: element.name),
);
}
});
}
@override
void onClose() {
// TODO: implement onClose
super.onClose();
}
Future<void> getHatchingList([bool isLoadingMore = false]) async {
if (isLoadingMore) {
isLoadingMoreAllocationsMade.value = true;
} else {
hatchingList.value = Resource<PaginationModel<HatchingModel>>.loading();
}
/*
if (searchedValue.value != null &&
searchedValue.value!.trim().isNotEmpty &&
currentPage.value > 1) {
currentPage.value = 1;
}*/
safeCall(
call: () async => await rootLogic.poultryRepository.getHatchingPoultry(
token: rootLogic.tokenService.accessToken.value!,
queryParameters: buildQueryParams(
queryParams: {'type': 'hatching', 'report': true},
pageSize: 50,
page: currentPage.value,
),
),
onSuccess: (res) {
if ((res?.count ?? 0) == 0) {
hatchingList.value = Resource<PaginationModel<HatchingModel>>.empty();
} else {
hatchingList.value = Resource<PaginationModel<HatchingModel>>.success(
PaginationModel<HatchingModel>(
count: res?.count ?? 0,
next: res?.next,
previous: res?.previous,
results: [...(hatchingList.value.data?.results ?? []), ...(res?.results ?? [])],
),
);
}
},
);
}
Future<void> getHatchingReport([bool isLoadingMore = false]) async {
if (isLoadingMore) {
isLoadingMoreAllocationsMade.value = true;
} else {
hatchingReportList.value = Resource<PaginationModel<HatchingReport>>.loading();
}
/*
if (searchedValue.value != null &&
searchedValue.value!.trim().isNotEmpty &&
currentPage.value > 1) {
currentPage.value = 1;
}*/
safeCall(
call: () async => await rootLogic.poultryRepository.getHatchingPoultryReport(
token: rootLogic.tokenService.accessToken.value!,
queryParameters: buildQueryParams(
role: 'PoultryScience',
pageSize: 50,
search: 'filter',
value: '',
page: currentPage.value,
),
),
onSuccess: (res) {
if ((res?.count ?? 0) == 0) {
hatchingReportList.value = Resource<PaginationModel<HatchingReport>>.empty();
} else {
hatchingReportList.value = Resource<PaginationModel<HatchingReport>>.success(
PaginationModel<HatchingReport>(
count: res?.count ?? 0,
next: res?.next,
previous: res?.previous,
results: [...(hatchingReportList.value.data?.results ?? []), ...(res?.results ?? [])],
),
);
}
},
);
}
Future<void> pickImages() async {
determineCurrentPosition();
var tmp = await ImagePicker().pickImage(
source: ImageSource.camera,
imageQuality: 50,
preferredCameraDevice: CameraDevice.front,
maxHeight: 720,
maxWidth: 1080,
);
getFileSizeInKB(tmp?.path ?? '', tag: 'Picked');
if (tmp?.path != null && pickedImages.length < 7) {
pickedImages.add(tmp!);
}
}
void removeImage(int index) {
pickedImages.removeAt(index);
}
void clearImages() {
pickedImages.clear();
}
Future<void> submitInspectionReport({required int id}) async {
isOnUpload.value = true;
DioFormData formData = DioFormData();
for (var element in _multiPartPickedImages) {
var ls = await element.finalize().toList();
formData.addFile('file', ls[0], element.filename ?? 'image.jpg');
}
formData.addField("lat", currentLocation.value.latitude.toString());
formData.addField("log", currentLocation.value.longitude.toString());
formData.addField("hatching_id", id.toString());
safeCall(
call: () async => await rootLogic.poultryRepository.submitPoultryScienceReport(
token: rootLogic.tokenService.accessToken.value!,
data: formData,
onSendProgress: (sent, total) {
presentUpload.value = calculateUploadProgress(sent: sent, total: total);
},
),
onSuccess: (res) {
closeBottomSheet();
clearImages();
getHatchingList();
getHatchingReport();
isOnUpload.value = false;
},
onError: (error, stackTrace) async{
clearImages();
isOnUpload.value = false;
await Future.delayed(const Duration(seconds: 4)).then((value) => closeBottomSheet(),);
},
showError: true,
);
}
Future<void> determineCurrentPosition() async {
final position = await Geolocator.getCurrentPosition(
locationSettings: AndroidSettings(accuracy: LocationAccuracy.best),
);
final latLng = LatLng(position.latitude, position.longitude);
currentLocation.value = latLng;
}
Future<bool> checkPermission({bool request = false}) async {
try {
final LocationPermission permission = await Geolocator.checkPermission();
switch (permission) {
case LocationPermission.denied:
final LocationPermission requestResult = await Geolocator.requestPermission();
return requestResult != LocationPermission.denied &&
requestResult != LocationPermission.deniedForever;
case LocationPermission.deniedForever:
return request ? await Geolocator.openAppSettings() : false;
case LocationPermission.always:
case LocationPermission.whileInUse:
return true;
default:
return false;
}
} catch (e) {
eLog(e);
return await Geolocator.openLocationSettings();
}
}
void closeBottomSheet() {
Get.back();
}
double calculateUploadProgress({required int sent, required int total}) {
if (total != 0) {
double progress = (sent * 100 / total) / 100;
return progress;
} else {
return 0.0;
}
}
}

View File

@@ -0,0 +1,586 @@
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:rasadyar_chicken/data/models/response/hatching/hatching_models.dart';
import 'package:rasadyar_chicken/data/models/response/hatching_report/hatching_report.dart';
import 'package:rasadyar_chicken/presentation/widget/base_page/view.dart';
import 'package:rasadyar_chicken/presentation/widget/page_route.dart';
import 'package:rasadyar_core/core.dart';
import 'logic.dart';
class InspectionPoultrySciencePage extends GetView<InspectionPoultryScienceLogic> {
const InspectionPoultrySciencePage({super.key});
@override
Widget build(BuildContext context) {
return BasePage(
isBase: true,
routesWidget: ObxValue((route) => buildPageRoute(route), controller.routesName),
onBackPressed: () => Get.back(id: 0),
widgets: [
segmentWidget(),
ObxValue((data) {
return data.value == 0 ? hatchingWidget() : reportWidget();
}, controller.selectedSegmentIndex),
],
);
}
ObxValue<Rx<Resource<PaginationModel<HatchingModel>>>> hatchingWidget() {
return ObxValue((data) {
return RPaginatedListView(
listType: ListType.separated,
resource: data.value,
hasMore: data.value.data?.next != null,
padding: EdgeInsets.fromLTRB(8, 8, 8, 80),
itemBuilder: (context, index) {
var item = data.value.data!.results![index];
return ObxValue((val) {
return ExpandableListItem2(
selected: val.contains(index),
onTap: () => controller.isExpandedList.toggle(index),
index: index,
child: itemListWidget(item),
secondChild: itemListExpandedWidget(item),
labelColor: AppColor.blueLight,
labelIcon: Assets.vec.checkSquareSvg.path,
);
}, controller.isExpandedList);
},
itemCount: data.value.data?.results?.length ?? 0,
separatorBuilder: (context, index) => SizedBox(height: 8.h),
onLoadMore: () async => controller.getHatchingList(true),
onRefresh: () async {
controller.currentPage.value = 1;
await controller.getHatchingList();
},
);
}, controller.hatchingList);
}
Container itemListExpandedWidget(HatchingModel item) {
return Container(
padding: EdgeInsets.symmetric(horizontal: 8),
decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(8)),
child: Column(
spacing: 8,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [
Text(
item.poultry?.user?.fullname ?? 'N/A',
textAlign: TextAlign.center,
style: AppFonts.yekan16.copyWith(color: AppColor.greenDark),
),
Spacer(),
Visibility(
child: Text(
item.violation == true ? 'پیگیری' : 'عادی',
textAlign: TextAlign.center,
style: AppFonts.yekan10.copyWith(color: AppColor.redDark),
),
),
],
),
Container(
height: 32,
padding: EdgeInsets.symmetric(horizontal: 8),
decoration: ShapeDecoration(
color: AppColor.blueLight,
shape: RoundedRectangleBorder(
side: BorderSide(width: 1, color: AppColor.blueLightHover),
borderRadius: BorderRadius.circular(8),
),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Row(
spacing: 3,
children: [
Text('نژاد:', style: AppFonts.yekan14.copyWith(color: AppColor.textColor)),
Text(
item.breed?.first.breed ?? 'N/A',
style: AppFonts.yekan14.copyWith(color: AppColor.textColor),
),
SizedBox(width: 2),
Text(
' سن${item.age}',
style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal),
),
],
),
Text(
' دوره جوجه ریزی:${item.period}',
style: AppFonts.yekan14.copyWith(color: AppColor.textColor),
),
],
),
),
buildRow(title: 'شماره مجوز جوجه ریزی', value: item.licenceNumber ?? 'N/A'),
buildRow(
title: 'حجم جوجه ریزی',
value: item.quantity.separatedByComma ?? 'N/A',
valueStyle: AppFonts.yekan14.copyWith(color: AppColor.blueNormal),
),
buildRow(title: 'مانده در سالن', value: item.leftOver.separatedByComma ?? 'N/A'),
buildRow(title: 'تلفات', value: item.losses.separatedByComma ?? 'N/A'),
buildRow(
title: 'دامپزشک فارم',
value: '${item.vetFarm?.vetFarmFullName}(${item.vetFarm?.vetFarmMobile})',
),
buildRow(
title: 'شرح بازرسی',
value: item.reportInfo?.image == false ? 'ارسال تصویر جوجه ریزی فارم ' : 'تکمیل شده',
titleStyle: AppFonts.yekan14.copyWith(
color: (item.reportInfo?.image ?? false) ? AppColor.greenNormal : AppColor.redDark,
),
valueStyle: AppFonts.yekan14.copyWith(
color: (item.reportInfo?.image ?? false) ? AppColor.greenNormal : AppColor.redDark,
),
),
Visibility(
visible: (item.reportInfo?.image == false ?? false),
child: RElevated(
text: 'ثبت بازرسی',
isFullWidth: true,
width: 150.w,
height: 40.h,
onPressed: () {
cameraBottomSheet(item.id!);
},
textStyle: AppFonts.yekan20.copyWith(color: Colors.white),
backgroundColor: AppColor.greenNormal,
),
),
],
),
);
}
void cameraBottomSheet(int id) {
Get.bottomSheet(
isDismissible: false,
isScrollControlled: false,
BaseBottomSheet(
child: Column(
children: [
GridView.builder(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 4,
mainAxisSpacing: 8,
crossAxisSpacing: 8,
childAspectRatio: 1,
),
shrinkWrap: true,
itemCount: 7,
itemBuilder: (context, index) {
return ObxValue((data) {
if (index + 1 > data.length) {
return GestureDetector(
onTap: () async {
await controller.pickImages();
},
child: Container(
width: 80.h,
height: 80.h,
decoration: BoxDecoration(
color: AppColor.lightGreyNormal,
borderRadius: BorderRadius.circular(8.r),
),
child: Center(
child: Icon(
Icons.camera_alt,
color: AppColor.lightGreyDarker,
size: 32.h,
),
),
),
);
} else {
return Container(
width: 80.h,
height: 80.h,
decoration: BoxDecoration(
color: AppColor.lightGreyNormal,
borderRadius: BorderRadius.circular(8.r),
),
child: Stack(
children: [
Positioned.fill(
child: Image.file(File(data[index].path), fit: BoxFit.cover),
),
Positioned(
top: 4,
left: 4,
child: GestureDetector(
onTap: () {
controller.removeImage(index);
},
child: Container(
width: 24.w,
height: 24.h,
clipBehavior: Clip.antiAlias,
padding: EdgeInsets.all(4),
decoration: ShapeDecoration(
color: Colors.white.withValues(alpha: 0.80),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(4),
),
),
child: Assets.vec.trashSvg.svg(
width: 8.w,
height: 8.h,
colorFilter: ColorFilter.mode(
AppColor.redNormal,
BlendMode.srcIn,
),
),
),
),
),
],
),
);
}
}, controller.pickedImages);
},
),
SizedBox(height: 20),
Row(
spacing: 16,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Obx(() {
return RElevated(
height: 40.h,
text: 'ارسال',
backgroundColor: AppColor.greenNormal,
progress: controller.presentUpload.value,
isLoading: controller.isOnUpload.value,
enabled: controller.pickedImages.length >= 2,
onPressed: () async {
controller.submitInspectionReport(id: id);
},
);
}),
ObxValue((data) {
return RElevated(
height: 40.h,
text: 'انصراف',
backgroundColor: AppColor.redNormal,
enabled: !data.value,
onPressed: () {
if (!data.value) {
controller.clearImages();
Get.back();
}
},
);
}, controller.isOnUpload),
],
),
],
),
),
);
}
Padding segmentWidget() {
return Padding(
padding: const EdgeInsets.fromLTRB(8, 0, 8, 8),
child: Row(
children: [
Expanded(
child: RSegment(
children: ['بازرسی', 'بایگانی'],
selectedIndex: 0,
borderColor: const Color(0xFFB4B4B4),
selectedBorderColor: AppColor.blueNormal,
selectedBackgroundColor: AppColor.blueLight,
onSegmentSelected: (index) => controller.selectedSegmentIndex.value = index,
backgroundColor: AppColor.whiteGreyNormal,
),
),
],
),
);
}
Widget reportWidget() {
return ObxValue((data) {
return RPaginatedListView(
listType: ListType.separated,
resource: data.value,
hasMore: data.value.data?.next != null,
padding: EdgeInsets.fromLTRB(8, 8, 8, 80),
itemBuilder: (context, index) {
var item = data.value.data!.results![index];
return ObxValue((val) {
return ExpandableListItem2(
selected: val.contains(index),
onTap: () => controller.isExpandedList.toggle(index),
index: index,
child: itemListWidgetReport(item),
secondChild: itemListExpandedWidgetReport(item),
labelColor: AppColor.blueLight,
labelIcon: Assets.vec.checkSquareSvg.path,
);
}, controller.isExpandedList);
},
itemCount: data.value.data?.results?.length ?? 0,
separatorBuilder: (context, index) => SizedBox(height: 8.h),
onLoadMore: () async => controller.getHatchingReport(true),
onRefresh: () async {
controller.currentPage.value = 1;
await controller.getHatchingReport();
},
);
}, controller.hatchingReportList);
}
Widget itemListExpandedWidgetReport(HatchingReport item) {
return Container(
padding: EdgeInsets.symmetric(horizontal: 8),
decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(8)),
child: Column(
spacing: 8,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [
Text(
item.hatching?.poultry?.fullname ?? 'N/A',
textAlign: TextAlign.center,
style: AppFonts.yekan16.copyWith(color: AppColor.greenDark),
),
Spacer(),
Visibility(
child: Text(
item.hatching?.violation == true ? 'پیگیری' : 'عادی',
textAlign: TextAlign.center,
style: AppFonts.yekan10.copyWith(color: AppColor.redDark),
),
),
],
),
Container(
height: 32,
padding: EdgeInsets.symmetric(horizontal: 8),
decoration: ShapeDecoration(
color: AppColor.blueLight,
shape: RoundedRectangleBorder(
side: BorderSide(width: 1, color: AppColor.blueLightHover),
borderRadius: BorderRadius.circular(8),
),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Row(
spacing: 3,
children: [
Text('نژاد:', style: AppFonts.yekan14.copyWith(color: AppColor.textColor)),
Text(
item.hatching?.chickenBreed?? 'N/A',
style: AppFonts.yekan14.copyWith(color: AppColor.textColor),
),
SizedBox(width: 2),
Text(
' سن${ item.hatching?.chickenAge}',
style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal),
),
],
),
Text(
' دوره جوجه ریزی:${ item.hatching?.period}',
style: AppFonts.yekan14.copyWith(color: AppColor.textColor),
),
],
),
),
buildRow(title: 'شماره مجوز جوجه ریزی', value: item.hatching?.licenceNumber ?? 'N/A'),
buildRow(
title: 'حجم جوجه ریزی',
value: item.hatching?.quantity.separatedByComma ?? 'N/A',
valueStyle: AppFonts.yekan14.copyWith(color: AppColor.blueNormal),
),
buildRow(title: 'مانده در سالن', value: item.hatching?.leftOver.separatedByComma ?? 'N/A'),
buildRow(title: 'تلفات', value: item.hatching?.losses.separatedByComma ?? 'N/A'),
buildRow(
title: 'دامپزشک فارم',
value: '${item.hatching?.vetFarm?.vetFarmFullname}(${item.hatching?.vetFarm?.vetFarmMobile})',
),
buildRow(
title: 'شرح بازرسی',
value: 'تکمیل شده',
titleStyle: AppFonts.yekan14.copyWith(
color: AppColor.greenNormal
),
valueStyle: AppFonts.yekan14.copyWith(
color: AppColor.greenNormal
),
),
SizedBox(
height: 140.h,
child: GridView.builder(
shrinkWrap: true,
itemCount: item.image?.length ?? 0,
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
mainAxisSpacing: 10,
crossAxisSpacing: 10,
),
itemBuilder: (context, index) => Container(
height: 138.h,
clipBehavior: Clip.hardEdge,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8.r),
image: DecorationImage(
image: NetworkImage(item.image?[index] ?? ''),
fit: BoxFit.cover,
),
),
),
),
),
],
),
);
}
Widget itemListWidget(HatchingModel item) {
return Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
SizedBox(width: 20),
Expanded(
flex: 2,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
spacing: 3,
children: [
Text(
item.poultry?.user?.fullname ?? 'N/A',
textAlign: TextAlign.start,
style: AppFonts.yekan12.copyWith(color: AppColor.blueNormal),
),
Text(
item.poultry?.user?.mobile ?? 'N/A',
textAlign: TextAlign.center,
style: AppFonts.yekan14.copyWith(color: AppColor.bgDark),
),
],
),
),
Expanded(
flex: 3,
child: Column(
spacing: 3,
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Text(
item.poultry?.unitName ?? 'N/Aaq',
textAlign: TextAlign.start,
style: AppFonts.yekan12.copyWith(color: AppColor.bgDark),
),
Text(
item.poultry?.licenceNumber ?? 'N/A',
textAlign: TextAlign.left,
style: AppFonts.yekan12.copyWith(color: AppColor.blueNormal),
),
],
),
),
Expanded(
flex: 1,
child: Assets.vec.scanSvg.svg(
width: 32.w,
height: 32.h,
colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn),
),
),
],
);
}
Row itemListWidgetReport(HatchingReport item) {
return Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
SizedBox(width: 20),
Expanded(
flex: 2,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
spacing: 3,
children: [
Text(
item.hatching?.poultry?.fullname ?? 'N/A',
textAlign: TextAlign.start,
style: AppFonts.yekan12.copyWith(color: AppColor.blueNormal),
),
Text(
item.hatching?.poultry?.mobile ?? 'N/A',
textAlign: TextAlign.center,
style: AppFonts.yekan14.copyWith(color: AppColor.bgDark),
),
],
),
),
Expanded(
flex: 3,
child: Column(
spacing: 3,
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Text(
item.hatching?.poultry?.unitName ?? 'N/Aaq',
textAlign: TextAlign.start,
style: AppFonts.yekan12.copyWith(color: AppColor.bgDark),
),
Text(
item.hatching?.licenceNumber ?? 'N/A',
textAlign: TextAlign.left,
style: AppFonts.yekan12.copyWith(color: AppColor.blueNormal),
),
],
),
),
Expanded(
flex: 1,
child: Assets.vec.scanSvg.svg(
width: 32.w,
height: 32.h,
colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn),
),
),
],
);
}
}

View File

@@ -1,5 +1,18 @@
import 'package:rasadyar_chicken/presentation/routes/routes.dart';
import 'package:rasadyar_core/core.dart';
class PoultryActionLogic extends GetxController {
RxList<String> actions = ['a'].obs;
class PoultryActionItem {
final String title;
final String route;
PoultryActionItem({required this.title, required this.route});
}
class PoultryActionLogic extends GetxController {
RxList<PoultryActionItem> items = [
PoultryActionItem(title: "بازرسی", route: ChickenRoutes.inspectionPoultryScience),
PoultryActionItem(title: "ثبت کشتار", route: ChickenRoutes.killingRegistrationPoultryScience),
PoultryActionItem(title: "فارم ها", route: ChickenRoutes.farmPoultryScience),
PoultryActionItem(title: "جوجه ریزی فعال", route: ChickenRoutes.activeHatchingPoultryScience),
].obs;
}

View File

@@ -1,8 +1,6 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:rasadyar_chicken/presentation/pages/role/view.dart';
import 'package:rasadyar_core/core.dart';
import 'package:rasadyar_core/presentation/common/assets.gen.dart';
import '../../../widget/app_bar.dart';
import 'logic.dart';
@@ -13,42 +11,33 @@ class PoultryActionPage extends GetView<PoultryActionLogic> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: chickenAppBar(
hasBack: false,
hasFilter: false,
hasSearch: false,
isBase: false,
),
appBar: chickenAppBar(hasBack: false, hasFilter: false, hasSearch: false, isBase: false),
body: Column(
children: [
Assets.images.poultryAction.image(
height: 212.h,
width: Get.width.w,
fit: BoxFit.cover,
),
Assets.images.poultryAction.image(height: 212.h, width: Get.width.w, fit: BoxFit.cover),
ObxValue((data) {
return Expanded(
child: GridView.builder(
physics: BouncingScrollPhysics(),
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 4,
crossAxisCount: 2,
mainAxisSpacing: 12.h,
crossAxisSpacing: 12.w,
childAspectRatio: 2,
),
itemCount: 4,
itemCount: data.length,
hitTestBehavior: HitTestBehavior.opaque,
itemBuilder: (BuildContext context, int index) {
var item = data[index];
return roleCard(
title: data[index],
title: item.title,
onTap: () async {
Get.toNamed(item.route, id: 0);
},
);
},
),
);
}, controller.actions),
}, controller.items),
],
),
);

View File

@@ -3,7 +3,7 @@ import 'package:rasadyar_chicken/data/di/chicken_di.dart';
import 'package:rasadyar_chicken/data/repositories/poultry_science/poultry_science_repository.dart';
import 'package:rasadyar_chicken/presentation/pages/poultry_science/home/view.dart';
import 'package:rasadyar_chicken/presentation/pages/poultry_science/poultry_action/view.dart';
import 'package:rasadyar_chicken/presentation/pages/steward/profile/view.dart';
import 'package:rasadyar_chicken/presentation/pages/poultry_science/profile/view.dart';
import 'package:rasadyar_chicken/presentation/utils/utils.dart';
import 'package:rasadyar_core/core.dart';
@@ -11,11 +11,7 @@ enum ErrorLocationType { serviceDisabled, permissionDenied, none }
class PoultryScienceRootLogic extends GetxController {
RxInt currentPage = 1.obs;
List<Widget> pages = [
PoultryActionPage(),
PoultryScienceHomePage(),
ProfilePage(),
];
List<Widget> pages = [PoultryActionPage(), PoultryScienceHomePage(), PoultryScienceProfilePage()];
late DioRemote dioRemote;
var tokenService = Get.find<TokenStorageService>();
late PoultryScienceRepository poultryRepository;

View File

@@ -1,5 +1,7 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:rasadyar_chicken/presentation/routes/pages.dart';
import 'package:rasadyar_chicken/presentation/routes/routes.dart';
import 'package:rasadyar_core/core.dart';
import 'logic.dart';
@@ -67,18 +69,24 @@ class PoultryScienceRootPage extends GetView<PoultryScienceRootLogic> {
),*/
Navigator(
key: Get.nestedKey(0),
onGenerateRoute: (settings) =>
GetPageRoute(page: () => controller.pages[0]),
onGenerateRoute: (settings) {
final page = ChickenPages.pages.firstWhere(
(e) => e.name == settings.name,
orElse: () => ChickenPages.pages.firstWhere(
(e) => e.name == ChickenRoutes.actionPoultryScience,
),
);
return buildRouteFromGetPage(page);
},
),
Navigator(
key: Get.nestedKey(1),
onGenerateRoute: (settings) =>
GetPageRoute(page: () => controller.pages[1]),
onGenerateRoute: (settings) => GetPageRoute(page: () => controller.pages[1]),
),
Navigator(
key: Get.nestedKey(2),
onGenerateRoute: (settings) =>
GetPageRoute(page: () => controller.pages[1]),
onGenerateRoute: (settings) => GetPageRoute(page: () => controller.pages[2]),
),
],
index: data.value,
@@ -92,7 +100,7 @@ class PoultryScienceRootPage extends GetView<PoultryScienceRootLogic> {
icon: Assets.vec.settingSvg.path,
isSelected: controller.currentPage.value == 0,
onTap: () {
//Get.nestedKey(1)?.currentState?.popUntil((route) => route.isFirst);
Get.nestedKey(1)?.currentState?.popUntil((route) => route.isFirst);
controller.changePage(0);
},
@@ -102,8 +110,8 @@ class PoultryScienceRootPage extends GetView<PoultryScienceRootLogic> {
icon: Assets.vec.homeSvg.path,
isSelected: controller.currentPage.value == 1,
onTap: () {
/* Get.nestedKey(1)?.currentState?.popUntil((route) => route.isFirst);
Get.nestedKey(0)?.currentState?.popUntil((route) => route.isFirst);*/
Get.nestedKey(0)?.currentState?.popUntil((route) => route.isFirst);
Get.nestedKey(2)?.currentState?.popUntil((route) => route.isFirst);
controller.changePage(1);
},
),

View File

@@ -1,7 +1,10 @@
import 'package:rasadyar_chicken/presentation/pages/auth/logic.dart';
import 'package:rasadyar_chicken/presentation/pages/auth/view.dart';
import 'package:rasadyar_chicken/presentation/pages/poultry_science/home/logic.dart';
import 'package:rasadyar_chicken/presentation/pages/poultry_science/inspection/logic.dart';
import 'package:rasadyar_chicken/presentation/pages/poultry_science/inspection/view.dart';
import 'package:rasadyar_chicken/presentation/pages/poultry_science/poultry_action/logic.dart';
import 'package:rasadyar_chicken/presentation/pages/poultry_science/poultry_action/view.dart';
import 'package:rasadyar_chicken/presentation/pages/poultry_science/profile/logic.dart';
import 'package:rasadyar_chicken/presentation/pages/poultry_science/root/logic.dart';
import 'package:rasadyar_chicken/presentation/pages/poultry_science/root/view.dart';
@@ -157,6 +160,22 @@ sealed class ChickenPages {
}),
),
GetPage(
name: ChickenRoutes.inspectionPoultryScience,
page: () => InspectionPoultrySciencePage(),
middlewares: [AuthMiddleware()],
binding: BindingsBuilder(() {
Get.lazyPut(() => InspectionPoultryScienceLogic());
}),
),
GetPage(
name: ChickenRoutes.actionPoultryScience,
page: () => PoultryActionPage(),
middlewares: [AuthMiddleware()],
binding: BindingsBuilder(() {
Get.lazyPut(() => PoultryActionLogic());
}),
),
//endregion
];
}

View File

@@ -27,5 +27,10 @@ sealed class ChickenRoutes {
//region Poultry Science Routes
static const _poultryScience = '$_base/poultryScience';
static const initPoultryScience = '$_poultryScience/';
static const actionPoultryScience = '$_poultryScience/action';
static const inspectionPoultryScience = '$_poultryScience/inspection';
static const farmPoultryScience = '$_poultryScience/farm';
static const activeHatchingPoultryScience = '$_poultryScience/activeHatching';
static const killingRegistrationPoultryScience = '$_poultryScience/KillingRegistration';
//endregion
}