refactor: update data source and repository structure by removing unused files, enhancing model integration, and adjusting import paths for better organization

This commit is contained in:
2025-12-07 12:33:39 +03:30
parent c28a4a3177
commit 02686115cb
129 changed files with 5269 additions and 545 deletions

View File

@@ -0,0 +1,143 @@
import 'package:rasadyar_chicken/data/models/response/poultry_order/poultry_order.dart';
import 'package:rasadyar_chicken/features/poultry_science/killing_registration/logic.dart';
import 'package:rasadyar_chicken/features/poultry_science/root/logic.dart';
import 'package:rasadyar_core/core.dart';
class GenocideLogic extends GetxController {
List<String> routesName = ['اقدام', 'درخواست کشتارها'];
var tokenService = Get.find<TokenStorageService>();
BaseLogic baseLogic = Get.find<BaseLogic>();
var gService = Get.find<GService>();
var rootLogic = Get.find<PoultryScienceRootLogic>();
var killRegistration = Get.find<KillingRegistrationLogic>();
Rx<Resource<PaginationModel<PoultryOrder>>> poultryOrderList =
Resource<PaginationModel<PoultryOrder>>.loading().obs;
RxInt expandedIndex = RxInt(-1);
final RxInt currentPage = 1.obs;
final RxBool isLoadingMore = false.obs;
final RxBool isLoadingDelete = false.obs;
Rx<Jalali> fromDateFilter = Jalali.now().obs;
Rx<Jalali> toDateFilter = Jalali.now().obs;
RxnString searchedValue = RxnString();
/* final RxBool isLoadingMoreAllocationsMade = false.obs;
final RxBool isOnLoadingSubmitOrEdit = false.obs;*/
@override
void onReady() {
super.onReady();
getPoultryOrderList();
}
@override
void onClose() {
super.onClose();
baseLogic.clearSearch();
}
Future<void> getPoultryOrderList([bool loadingMore = false]) async {
if (loadingMore) {
isLoadingMore.value = true;
} else {
poultryOrderList.value = Resource<PaginationModel<PoultryOrder>>.loading();
}
if (searchedValue.value != null &&
searchedValue.value!.trim().isNotEmpty &&
currentPage.value > 1) {
currentPage.value = 1;
}
await safeCall(
call: () async => await rootLogic.poultryRepository.getPoultryOderList(
token: rootLogic.tokenService.accessToken.value!,
queryParameters: buildQueryParams(
pageSize: 20,
page: currentPage.value,
search: 'filter',
role: gService.getRole(Module.chicken),
value: searchedValue.value,
fromDate: fromDateFilter.value.toDateTime(),
toDate: toDateFilter.value.toDateTime(),
queryParams: {'today': null},
),
),
onSuccess: (res) async {
await Future.delayed(Duration(milliseconds: 500));
if ((res?.count ?? 0) == 0) {
poultryOrderList.value = Resource<PaginationModel<PoultryOrder>>.empty();
} else {
if (loadingMore) {
poultryOrderList.value = Resource<PaginationModel<PoultryOrder>>.success(
PaginationModel<PoultryOrder>(
count: res?.count ?? 0,
next: res?.next,
previous: res?.previous,
results: [...(poultryOrderList.value.data?.results ?? []), ...(res?.results ?? [])],
),
);
} else {
poultryOrderList.value = Resource<PaginationModel<PoultryOrder>>.success(res!);
}
}
},
);
}
Future<void> deletePoultryOrder(int id) async {
toggleExpanded(-1);
await safeCall(
call: () async => await rootLogic.poultryRepository.deletePoultryOder(
token: rootLogic.tokenService.accessToken.value!,
orderId: id.toString(),
),
onSuccess: (_) {
defaultShowSuccessMessage('درخواست با موفقیت حذف شد');
},
);
}
void toggleExpanded(int index) {
expandedIndex.value = expandedIndex.value == index ? -1 : index;
}
String getRequestType(PoultryOrder item) {
if (item.market ?? false) {
return 'پنل معاملات';
} else if (item.union ?? false) {
return 'اتحادیه';
} else {
return 'خرید مستقیم';
}
}
String getKillType(PoultryOrder item) {
if (item.export ?? false) {
return 'صادرات';
} else if (item.freezing ?? false) {
return 'انجماد';
} else {
return 'عادی';
}
}
String getState(PoultryOrder item) {
if (item.stateProcess == 'pending') {
return 'در انتظار تایید';
} else {
return 'تایید شده';
}
}
Future<void> onRefresh() async {
currentPage.value = 1;
await getPoultryOrderList();
}
}

View File

@@ -0,0 +1,296 @@
import 'package:flutter/material.dart';
import 'package:rasadyar_chicken/data/models/response/poultry_order/poultry_order.dart';
import 'package:rasadyar_chicken/features/poultry_science/killing_registration/view.dart';
import 'package:rasadyar_chicken/presentation/utils/nested_keys_utils.dart';
import 'package:rasadyar_chicken/presentation/widget/base_page/view.dart';
import 'package:rasadyar_chicken/presentation/widget/filter_bottom_sheet.dart';
import 'package:rasadyar_core/core.dart';
import 'logic.dart';
class GenocidePage extends GetView<GenocideLogic> {
const GenocidePage({super.key});
@override
Widget build(BuildContext context) {
return ChickenBasePage(
routes: controller.routesName,
hasSearch: true,
hasFilter: true,
onRefresh: controller.onRefresh,
onSearchChanged: (data) {
controller.searchedValue.value = data;
controller.getPoultryOrderList();
},
backId: poultryFirstKey,
onFilterTap: () {
Get.bottomSheet(
isScrollControlled: true,
backgroundColor: Colors.transparent,
filterBottomSheet(),
);
},
child: Stack(
fit: StackFit.expand,
children: [
Positioned.fill(child: poultryOrderListWidget()),
Positioned(
bottom: 130,
right: 16,
child: RFab.add(
onPressed: () {
Get.bottomSheet(
isScrollControlled: true,
backgroundColor: Colors.transparent,
killRegistrationBottomSheet(),
).whenComplete(() {
controller.killRegistration.clearAllFields();
controller.killRegistration.onReady();
});
},
),
),
],
),
);
}
//region List and Items
Widget poultryOrderListWidget() {
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.value.isEqual(index),
onTap: () => controller.toggleExpanded(index),
index: index,
child: itemListWidget(item),
secondChild: itemListExpandedWidget(item),
labelColor: AppColor.blueLight,
labelIcon: Assets.vec.timerSvg.path,
labelIconColor: AppColor.yellowNormal2,
);
}, controller.expandedIndex);
},
itemCount: data.value.data?.results?.length ?? 0,
separatorBuilder: (context, index) => SizedBox(height: 8.h),
onLoadMore: () async => controller.getPoultryOrderList(true),
);
}, controller.poultryOrderList);
}
Container itemListExpandedWidget(PoultryOrder 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?.unitName ?? 'N/A',
textAlign: TextAlign.center,
style: AppFonts.yekan16.copyWith(color: AppColor.greenDark),
),
Spacer(),
Visibility(
child: Text(
'${item.poultry?.address?.province?.name} / ${item.poultry?.address?.city?.name}',
textAlign: TextAlign.center,
style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal),
),
),
],
),
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: [
Text(
'سن مرغ:${item.hatching?.age ?? '-'} (روز)',
style: AppFonts.yekan14.copyWith(color: AppColor.textColor),
),
Text(
item.sendDate?.formattedJalaliDate ?? '-',
style: AppFonts.yekan14.copyWith(color: AppColor.textColor),
),
Text(
'تعداد:${item.quantity.separatedByComma} (قطعه)',
style: AppFonts.yekan14.copyWith(color: AppColor.textColor),
),
],
),
),
buildRow(title: 'کد سفارش', value: '${item.orderCode} '),
buildRow(
title: 'نوع فروش',
value: (item.freeSaleInProvince ?? false) ? 'آزاد' : 'دولتی ',
),
buildRow(title: 'نوع کشتار ', value: controller.getKillType(item)),
buildRow(title: 'درخواست', value: controller.getRequestType(item)),
buildRow(title: 'میانگین وزنی', value: '${(item.indexWeight)} (کیلوگرم)'),
buildRow(title: 'قیمت مرغدار', value: '${item.amount.separatedByComma} (ریال)'),
buildRow(
title: 'مانده در سالن ',
value: '${item.hatching?.leftOver.separatedByComma ?? 0} (قطعه)',
),
buildRow(title: ' وضعیت', value: controller.getState(item)),
Visibility(
visible: item.stateProcess == 'pending',
child: ObxValue((data) {
return ROutlinedElevatedIcon(
height: 40.h,
width: Get.width,
text: 'حذف',
icon: Assets.vec.trashSvg.svg(
width: 16.w,
height: 16.h,
colorFilter: ColorFilter.mode(AppColor.error, BlendMode.srcIn),
),
textStyle: AppFonts.yekan16Bold.copyWith(color: AppColor.error),
borderColor: AppColor.error,
foregroundColor: AppColor.error,
pressedBackgroundColor: AppColor.error,
onPressed: data.value
? null
: () => _buildDeleteDialog(
onConfirm: () async {
Get.back();
await controller.deletePoultryOrder(item.id!);
controller.getPoultryOrderList();
},
),
);
}, controller.isLoadingDelete),
),
],
),
);
}
Widget itemListWidget(PoultryOrder item) {
return Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
SizedBox(width: 20),
Expanded(
flex: 2,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
spacing: 3,
children: [
Text(
item.poultry?.unitName ?? 'N/A',
textAlign: TextAlign.start,
style: AppFonts.yekan12.copyWith(color: AppColor.blueNormal),
),
Text(
item.sendDate?.formattedJalaliDate ?? '-',
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.orderCode ?? '-'}',
textAlign: TextAlign.start,
style: AppFonts.yekan12.copyWith(color: AppColor.blueNormal),
),
Text(
'تعداد:${item.quantity.separatedByComma} (قطعه)',
style: AppFonts.yekan14.copyWith(color: AppColor.textColor),
),
],
),
),
Expanded(
flex: 1,
child: Assets.vec.scanSvg.svg(
width: 32.w,
height: 32.h,
colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn),
),
),
],
);
}
//endregion
//region other widgets
void _buildDeleteDialog({required VoidCallback onConfirm}) {
Get.defaultDialog(
title: 'حذف درخواست کشتار',
middleText: 'آیا از حذف این درخواست کشتار مطمئن هستید؟',
confirm: ElevatedButton(
style: ElevatedButton.styleFrom(
backgroundColor: AppColor.error,
foregroundColor: Colors.white,
),
onPressed: onConfirm,
child: Text('بله'),
),
cancel: ElevatedButton(
onPressed: () {
Get.back();
},
child: Text('خیر'),
),
);
}
Widget filterBottomSheet() => filterBottomSheetWidget(
fromDate: controller.fromDateFilter,
onChangedFromDate: (jalali) => controller.fromDateFilter.value = jalali,
toDate: controller.toDateFilter,
onChangedToDate: (jalali) => controller.toDateFilter.value = jalali,
onSubmit: () => controller.getPoultryOrderList(),
);
//endregion
//region kill registration bottom sheet
Widget killRegistrationBottomSheet() {
return BaseBottomSheet(
height: Get.height * 0.9,
bgColor: Color(0x66E4E4E4),
child: KillingRegistrationPage(),
);
}
//endregion
}