123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320 |
- import 'package:dio/dio.dart';
- import 'package:easy_refresh/easy_refresh.dart';
- import 'package:flutter/material.dart';
- import 'package:lszlgl/base/base_lifecycle_state.dart';
- import 'package:lszlgl/base/base_state.dart';
- import 'package:lszlgl/base/base_vm.dart';
- import 'package:lszlgl/config/colors.dart';
- import 'package:lszlgl/main.dart';
- import 'package:lszlgl/model/rsp/sample_task_rsp.dart';
- import 'package:lszlgl/network/api.dart';
- import 'package:lszlgl/page/reap_step/sample_task_list_tab_page.dart';
- import 'package:lszlgl/service/dict_service.dart';
- import 'package:lszlgl/widget/button.dart';
- import 'package:lszlgl/widget/page_widget.dart';
- /// 扦样环节列表
- class SampleTaskListPage extends StatefulWidget {
- final StepType type;
- final bool complete;
- const SampleTaskListPage({
- super.key,
- required this.type,
- this.complete = false,
- });
- @override
- State<SampleTaskListPage> createState() => _SampleTaskListPageState();
- }
- class _SampleTaskListPageState extends BaseLifecycleState<SampleTaskListPage> with AutomaticKeepAliveClientMixin {
- late EasyRefreshController refreshCtrl;
- int pageNo = 1;
- int pageSize = 10;
- final pageState = DataStatusModel<List<SampleTaskItem>>().notifier<DataStatusModel<List<SampleTaskItem>>>();
- /// 详情
- void startDetail() {
- if (!widget.complete) return;
- switch (widget.type) {
- case StepType.reap:
- MyRouter.startReapSampleTask(detail: true);
- break;
- case StepType.stock:
- break;
- }
- }
- /// 扦样
- void startSample() {
- switch (widget.type) {
- case StepType.reap:
- MyRouter.startReapSampleTask();
- break;
- case StepType.stock:
- break;
- }
- }
- void getData({bool first = false, bool refresh = true}) async {
- if (refresh) {
- pageNo = 1;
- }
- try {
- var value = await Api().sampleTaskList(
- pageNo,
- pageSize,
- deliveryStatus: widget.complete ? 1 : 0,
- rwlx: widget.type.value,
- );
- List<SampleTaskItem> data = value.data?.list ?? [];
- var list = pageState.value.data ?? [];
- if (refresh) {
- list = data;
- refreshCtrl.finishRefresh(IndicatorResult.success, true);
- refreshCtrl.resetFooter();
- } else {
- list.addAll(data);
- }
- pageState.update(pageState.value.success(data: list));
- if (data.isEmpty) {
- refreshCtrl.finishLoad(IndicatorResult.noMore, true);
- } else {
- refreshCtrl.finishLoad(IndicatorResult.success, true);
- }
- pageNo++;
- } on DioException catch (err) {
- logger.e('${err.message}');
- if (pageNo == 1) pageState.update(pageState.value.error());
- if (refresh) {
- refreshCtrl.finishRefresh(IndicatorResult.fail, true);
- } else {
- refreshCtrl.finishLoad(IndicatorResult.fail, true);
- }
- }
- }
- @override
- void onInit() {
- refreshCtrl = EasyRefreshController(
- controlFinishRefresh: true,
- controlFinishLoad: true,
- );
- }
- @override
- void onFirstShow(Duration timeStamp) {
- refreshCtrl.callRefresh(overOffset: 200);
- }
- @override
- void onDestroy() {
- refreshCtrl.dispose();
- }
- @override
- Widget build(BuildContext context) {
- super.build(context);
- return Container(
- clipBehavior: Clip.hardEdge,
- decoration: const BoxDecoration(
- color: Colors.white,
- borderRadius: BorderRadius.vertical(top: Radius.circular(16)),
- ),
- alignment: Alignment.center,
- child: buildBody(),
- );
- }
- Widget buildBody() {
- return EasyRefresh.builder(
- controller: refreshCtrl,
- onRefresh: () => getData(refresh: true),
- onLoad: () => getData(refresh: false),
- childBuilder: (_, physics) => buildList(physics),
- );
- }
- Widget buildList(ScrollPhysics physics) {
- var sliver = pageState.builder((v) {
- var list = v.data;
- if (v.status == DataStatus.error) {
- // 加载失败
- return SliverToBoxAdapter(child: PageLoadingWidget.error(onTap: () => refreshCtrl.callRefresh()));
- } else if (list == null || list.isEmpty) {
- // 无数据
- return const SliverToBoxAdapter(child: PageLoadingWidget.empty());
- } else {
- return SliverList.builder(
- itemCount: list.length,
- itemBuilder: (_, index) => buildItem(index, list[index]),
- );
- }
- });
- return CustomScrollView(
- physics: physics,
- slivers: [sliver],
- );
- }
- Widget buildItem(int index, SampleTaskItem item) {
- return GestureDetector(
- behavior: HitTestBehavior.opaque,
- onTap: () => startDetail(),
- child: Container(
- margin: const EdgeInsets.only(left: 12, right: 12, top: 12),
- decoration: const BoxDecoration(
- color: Color(0xFFF5FFFD),
- borderRadius: BorderRadius.all(Radius.circular(8)),
- ),
- child: Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- const SizedBox(height: 15),
- buildTop(item.getDeliveryStatusText()),
- buildNumber(item.qyrwdh ?? ''),
- buildGrid(item),
- buildBottom(item),
- const SizedBox(height: 15),
- ],
- ),
- ),
- );
- }
- Widget buildTop(String state) {
- return Row(
- children: [
- buildVLine(),
- const Expanded(
- child: Text(
- '扦样任务单号',
- style: TextStyle(color: MyColor.c_333333, fontSize: 18, fontWeight: FontWeight.w500),
- ),
- ),
- buildState(state),
- ],
- );
- }
- Widget buildVLine() {
- return Container(
- width: 4,
- height: 20,
- margin: const EdgeInsets.only(right: 8),
- decoration: const BoxDecoration(
- color: MyColor.c_25A6EE,
- borderRadius: BorderRadius.all(Radius.circular(2)),
- ),
- );
- }
- Widget buildState(String state) {
- return Container(
- padding: const EdgeInsets.symmetric(horizontal: 14, vertical: 4),
- decoration: BoxDecoration(
- color: MyColor.c_25A6EE.withOpacity(0.1),
- borderRadius: const BorderRadius.horizontal(left: Radius.circular(100)),
- ),
- child: Text(
- '状态:$state',
- style: const TextStyle(color: MyColor.c_1383C2, fontSize: 16),
- ),
- );
- }
- Widget buildNumber(String number) {
- return Padding(
- padding: const EdgeInsets.only(left: 12, top: 4, bottom: 6),
- child: Text(
- number,
- style: const TextStyle(color: MyColor.c_333333, fontSize: 18, fontWeight: FontWeight.w500),
- ),
- );
- }
- Widget buildGrid(SampleTaskItem item) {
- List<Map<String, String>> infoList;
- var jclb = DictService.get().getLabel(DictType.jclb, value: item.jclb)?.label;
- if (widget.complete) {
- infoList = [
- {'采样品种': item.cypzName ?? ''},
- {'粮食品类': item.lspz ?? ''},
- {'监测类别': jclb ?? ''},
- {'扦样数量(kg)': '${item.qysl ?? ''}'},
- {'扦样人员': item.name ?? ''},
- {'扦样时间': item.qysj ?? ''},
- ];
- } else {
- infoList = [
- {'采样品种': item.cypzName ?? ''},
- {'报送截止时间': item.bsjzsj ?? ''},
- {'监测类别': jclb ?? ''},
- {'扦样人员': item.name ?? ''},
- ];
- }
- return Padding(
- padding: const EdgeInsets.symmetric(horizontal: 12),
- child: LayoutBuilder(builder: (context, constraints) {
- return Wrap(
- spacing: 4,
- runSpacing: 4,
- children: infoList.map((item) {
- return SizedBox(
- width: constraints.maxWidth / 2 - 2,
- child: Text(
- '${item.keys.first}:${item.values.first}',
- style: const TextStyle(fontSize: 16, color: MyColor.c_666666),
- ),
- );
- }).toList(),
- );
- }),
- );
- }
- Widget buildBottom(SampleTaskItem item) {
- if (widget.complete) return const SizedBox.shrink();
- return Column(
- children: [
- buildDivider(),
- Row(
- children: [
- const SizedBox(width: 12),
- Expanded(
- child: Text(
- '[${item.qyryName ?? ''}]创建于${item.createTime ?? ''}',
- style: const TextStyle(fontSize: 16, color: MyColor.c_666666),
- ),
- ),
- const SizedBox(width: 4),
- MyButton(
- '开始扦样',
- onTap: () => startSample(),
- fountSize: 16,
- alignment: null,
- padding: const EdgeInsets.symmetric(vertical: 6, horizontal: 12),
- ),
- const SizedBox(width: 12),
- ],
- ),
- ],
- );
- }
- Widget buildDivider() {
- return Container(
- width: double.infinity,
- height: 1,
- color: MyColor.c_3BD2E5.withOpacity(0.15),
- margin: const EdgeInsets.symmetric(vertical: 10),
- );
- }
- @override
- bool get wantKeepAlive => true;
- }
|