From d8189e00d2bcd7c098b8051d2d1f1b6805420dd5 Mon Sep 17 00:00:00 2001 From: icewint Date: Fri, 6 Dec 2024 08:13:16 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0EBS=E5=85=A5=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/main.dart | 2 +- lib/{ => page}/layout/home.dart | 41 ++-- lib/{ => page}/layout/login.dart | 2 +- lib/page/stockIn/StackInWheelEBS.dart | 189 ++++++++++++++++++ ...StackInWheel.dart => StackInWheelMes.dart} | 70 +++---- lib/page/stockIn/StockInEmpty.dart | 16 +- 6 files changed, 247 insertions(+), 73 deletions(-) rename lib/{ => page}/layout/home.dart (72%) rename lib/{ => page}/layout/login.dart (98%) create mode 100644 lib/page/stockIn/StackInWheelEBS.dart rename lib/page/stockIn/{StackInWheel.dart => StackInWheelMes.dart} (89%) diff --git a/lib/main.dart b/lib/main.dart index acb5e27..5ce8384 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'layout/login.dart'; +import 'page/layout/login.dart'; import 'common/colorCom.dart'; import 'package:tdesign_flutter/tdesign_flutter.dart'; import 'package:wms_app/common/appConfig.dart'; diff --git a/lib/layout/home.dart b/lib/page/layout/home.dart similarity index 72% rename from lib/layout/home.dart rename to lib/page/layout/home.dart index 7371736..85cd7dc 100644 --- a/lib/layout/home.dart +++ b/lib/page/layout/home.dart @@ -1,7 +1,8 @@ import 'package:flutter/material.dart'; +import 'package:wms_app/page/stockIn/StackInWheelEBS.dart'; import '/common/colorCom.dart'; import 'package:bruno/bruno.dart'; -import 'package:wms_app/page/stockIn/StackInWheel.dart'; +import 'package:wms_app/page/stockIn/StackInWheelMes.dart'; import 'package:wms_app/page/stockIn/StockInEmpty.dart'; import 'package:wms_app/page/stock/stock.dart'; import 'package:wms_app/page/pick/pick.dart'; @@ -38,38 +39,28 @@ class _HomePageState extends State { padding: const EdgeInsets.all(0), children: [ UserAccountsDrawerHeader( - accountName: const Text("景旺电子"), - accountEmail: const Text("欢迎使用WMS移动终端"), - - decoration: BoxDecoration( - color: ColorCommon.colorScheme - ) + accountName: const Text("景旺电子"), + accountEmail: const Text("欢迎使用WMS移动终端"), + decoration: BoxDecoration( + color: ColorCommon.colorScheme + ) ), ListTile(title: const Text("空载具入库"), trailing: const Icon(Icons.grain), onTap: () { - Navigator.push( - context, - MaterialPageRoute(builder: (context) => const StockInEmpty()), - ); + Navigator.push(context, MaterialPageRoute(builder: (context) => const StockInEmpty())); }), - ListTile(title: const Text("码盘入库"), trailing: const Icon(Icons.add_box), onTap: () { - Navigator.push( - context, - MaterialPageRoute(builder: (context) => const StockInWheel()), - ); + ListTile(title: const Text("MES成品入库"), trailing: const Icon(Icons.add_box), onTap: () { + Navigator.push(context, MaterialPageRoute(builder: (context) => const StockInWheelMes())); + }), + ListTile(title: const Text("EBS成品入库"), trailing: const Icon(Icons.add_box), onTap: () { + Navigator.push(context, MaterialPageRoute(builder: (context) => const StockInWheelEBS())); }), ListTile(title: const Text("出库拣货"), trailing: const Icon(Icons.back_hand), onTap: () { - Navigator.push( - context, - MaterialPageRoute(builder: (context) => const Pick()), - ); + Navigator.push(context, MaterialPageRoute(builder: (context) => const Pick())); }), ListTile(title: const Text("库存盘点"), trailing: const Icon(Icons.checklist), onTap: () { }), ListTile(title: const Text("库存查询"), trailing: const Icon(Icons.list_alt), onTap: () { - Navigator.push( - context, - MaterialPageRoute(builder: (context) => const Stock()), - ); + Navigator.push(context, MaterialPageRoute(builder: (context) => const Stock())); }) ], ), @@ -78,7 +69,7 @@ class _HomePageState extends State { top: 10, left: 20, right: 20 - ), child: ListView( + ), child: ListView( children: [ const Text("库存占用情况:"), Row( diff --git a/lib/layout/login.dart b/lib/page/layout/login.dart similarity index 98% rename from lib/layout/login.dart rename to lib/page/layout/login.dart index 2c83925..932f0d3 100644 --- a/lib/layout/login.dart +++ b/lib/page/layout/login.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import '/common/colorCom.dart'; -import 'package:wms_app/layout/home.dart'; +import 'package:wms_app/page/layout/home.dart'; import 'package:dio/dio.dart'; class Login extends StatefulWidget { diff --git a/lib/page/stockIn/StackInWheelEBS.dart b/lib/page/stockIn/StackInWheelEBS.dart new file mode 100644 index 0000000..9496f2b --- /dev/null +++ b/lib/page/stockIn/StackInWheelEBS.dart @@ -0,0 +1,189 @@ +import 'dart:convert'; + +import 'package:bruno/bruno.dart'; +import 'package:flutter/material.dart'; +import '/common/colorCom.dart'; +import 'package:tdesign_flutter/tdesign_flutter.dart'; +import 'package:wms_app/utils/DialogUtils.dart'; +import 'package:wms_app/apiclient/WmsApiClient.dart'; + +class StockInWheelEBS extends StatefulWidget { + const StockInWheelEBS({super.key}); + @override + State createState() => _StockInWheelEBSPageState(); +} + +/// EBS码盘入库 +class _StockInWheelEBSPageState extends State { + + final _vehicleTextController = TextEditingController(); // 载具号输入框 + List tableData = []; // 表格数据类型 + int tableIndex = 0; // 序号 + int selectCount = 0; // 已选择的数量 + + @override + void initState() { + super.initState(); + tableData.add({ + "action":"", + "id":"1", + "vehicleNo":"测试" + }); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + iconTheme: const IconThemeData( + color: Colors.white + ), + leading: IconButton(onPressed: () { + Navigator.of(context).pop(); + }, icon: const Icon(Icons.arrow_back)), + actions: [ + IconButton(onPressed: () { + getTableData(); // 刷新表格按钮 + }, icon: const Icon(Icons.refresh)) + ], + centerTitle: true, + backgroundColor: ColorCommon.colorScheme, + title: const Text( + "EBS成品入库", + style: TextStyle( + color: Colors.white + ), + ), + ), + body: Center( + child: Padding(padding: const EdgeInsets.only( + top: 10, + left: 10, + right: 10, + ), child: ListView( + children: [ + BrnTextInputFormItem( + controller: _vehicleTextController, + title: "载具号:", hint: "请扫描或输入" + ), + BrnRadioInputFormItem( + title: "选择目的地:", + options: const ["立体库", "装箱线"], + value: "立体库", + onChanged: (oldValue, newValue) { + BrnToast.show("点击触发回调${oldValue}_${newValue}_onChanged", context); + }, + ), + Padding(padding: const EdgeInsets.only( + top: 5 + ), child: ElevatedButton( + onPressed: wheelComplete, + style: ButtonStyle( + backgroundColor: WidgetStateProperty.all(ColorCommon.colorScheme), + ), + child: const Text( + "码盘完成", + style: TextStyle( + color: Colors.white + )) + )), + Padding(padding: const EdgeInsets.only( + top: 10, + bottom: 10 + ), child: Text("已经载入的入库单(已选择:$selectCount):"), + ), + Container( + decoration: BoxDecoration( + border: Border.all(color: const Color(0x4D0C0C05), width: 0.3),// border + borderRadius: BorderRadius.circular((5)), // 圆角 + ), + child: TDTable( + bordered: true, + height: 300, + width: MediaQuery.of(context).size.width, + backgroundColor: Colors.transparent, + columns: [ + TDTableCol(title: '*', colKey: 'action', width: 45, align: TDTableColAlign.center), + TDTableCol(title: '序号', colKey: 'id', align: TDTableColAlign.center, width: 80), + TDTableCol(title: '载具号', colKey: 'vehicleNo', align: TDTableColAlign.center, ellipsis: true, width: 80), + TDTableCol(title: '箱号', colKey: 'boxNo', align: TDTableColAlign.center, ellipsis: true, width: 80), + TDTableCol(title: '包装数量', colKey: 'goodsNum', align: TDTableColAlign.center, ellipsis: true, width: 100), + TDTableCol(title: '产品编码', colKey: 'goodsId', align: TDTableColAlign.center, ellipsis: true, width: 100), + TDTableCol(title: '每包数量', colKey: 'numPerBox', align: TDTableColAlign.center, ellipsis: true, width: 100), + TDTableCol(title: '包数量', colKey: 'picketNum', align: TDTableColAlign.center, ellipsis: true, width: 100), + TDTableCol(title: '零包数量', colKey: 'otherNum', align: TDTableColAlign.center, ellipsis: true, width: 100), + TDTableCol(title: '销售订单', colKey: 'saleOrderNo', align: TDTableColAlign.center, ellipsis: true, width: 100), + TDTableCol(title: '包装层级', colKey: 'packetLevel', align: TDTableColAlign.center, ellipsis: true, width: 100), + TDTableCol(title: '周期', colKey: 'cycle', align: TDTableColAlign.center, ellipsis: true, width: 80), + TDTableCol(title: '客户销售订单', colKey: 'customSaleOrderNo', align: TDTableColAlign.center, ellipsis: true, width: 110), + TDTableCol(title: '子库', colKey: 'minorWarehouseId', align: TDTableColAlign.center, ellipsis: true, width: 80), + TDTableCol(title: '产品描述', colKey: 'goodsDesc', align: TDTableColAlign.center, ellipsis: true, width: 100), + ], + data: tableData, + onCellTap: (index, dynamic, cell) { + if(cell.colKey == "action") { + setState(() { + final action = dynamic["action"]; + dynamic["action"] = action == "✓" ? "" : "✓"; + selectCount = tableData.where((w) => w["action"] == "✓").length; + }); + } else { + showDetails(index, dynamic); + } + }), + ) + ], + )), + ), + ); + } + + /// 获取入库单数据 + void getTableData() { + + } + + + + /// 显示详细信息 + void showDetails(index, dynamic) { + String goodsDetails = ""; + goodsDetails += "序号:${dynamic["id"]??""}\r\n"; + goodsDetails += "载具号:${dynamic["vehicleNo"]??""}\r\n"; + goodsDetails += "箱号:${dynamic["boxNo"]??""}\r\n"; + goodsDetails += "包装数量:${dynamic["goodsNum"]??""}\r\n"; + goodsDetails += "产品编码:${dynamic["goodsId"]??""}\r\n"; + goodsDetails += "每包数量:${dynamic["numPerBox"]??""}\r\n"; + goodsDetails += "包数量:${dynamic["picketNum"]??""}\r\n"; + goodsDetails += "零包数量:${dynamic["otherNum"]??""}\r\n"; + goodsDetails += "销售订单:${dynamic["saleOrderNo"]??""}\r\n"; + goodsDetails += "包装层级:${dynamic["packetLevel"]??""}\r\n"; + goodsDetails += "周期:${dynamic["cycle"]??""}\r\n"; + goodsDetails += "客户销售订单:${dynamic["customSaleOrderNo"]??""}\r\n"; + goodsDetails += "子库:${dynamic["minorWarehouseId"]??""}\r\n"; + goodsDetails += "产品描述:${dynamic["goodsDesc"]??""}"; + DialogUtils.showMessage(context, "详情", goodsDetails, btnLabel: "我知道了"); + } + + /// 码盘完成 + void wheelComplete() { + if(tableData.isEmpty) { + DialogUtils.showWarningMessage(context, "警告", "您当前没有待入库的入库单", btnLabel: "确定"); + return; + } + if(_vehicleTextController.text == "") { + DialogUtils.showWarningMessage(context, "警告", "请先扫描载具号", btnLabel: "返回填写"); + return; + } + List selectData = tableData.where((w) => w["action"] == "✓").toList(); + if(selectCount < 1) { + DialogUtils.showWarningMessage(context, "警告", "您还没有选择入库单", btnLabel: "返回选择"); + return; + } + DialogUtils.showConfirmMessage(context, "完成确认?", "当前选择了 $selectCount 条入库单,是否继续?", confirmBtn: "继续", confirm: (){ + + + }); + } + +} \ No newline at end of file diff --git a/lib/page/stockIn/StackInWheel.dart b/lib/page/stockIn/StackInWheelMes.dart similarity index 89% rename from lib/page/stockIn/StackInWheel.dart rename to lib/page/stockIn/StackInWheelMes.dart index ec2212d..c123a49 100644 --- a/lib/page/stockIn/StackInWheel.dart +++ b/lib/page/stockIn/StackInWheelMes.dart @@ -7,14 +7,14 @@ import 'package:tdesign_flutter/tdesign_flutter.dart'; import 'package:wms_app/utils/DialogUtils.dart'; import 'package:wms_app/apiclient/WmsApiClient.dart'; -class StockInWheel extends StatefulWidget { - const StockInWheel({super.key}); +class StockInWheelMes extends StatefulWidget { + const StockInWheelMes({super.key}); @override - State createState() => _StockInWheelPageState(); + State createState() => _StockInWheelMesPageState(); } -/// 手动码盘入库 -class _StockInWheelPageState extends State { +/// MES码盘入库 +class _StockInWheelMesPageState extends State { final _vehicleTextController = TextEditingController(); // 载具号输入框 final _boxNoTextController = TextEditingController(); // 箱号输入框 @@ -35,7 +35,7 @@ class _StockInWheelPageState extends State { ), leading: IconButton(onPressed: () { if(tableData.isNotEmpty) { - DialogUtils.showConfirmMessage(context, "退出确认", "您还有未提交的码盘数据,如果退出本页面将全部丢失", confirmBtn: "继续退出", confirm: (){ + DialogUtils.showConfirmMessage(context, "退出确认", "您还有未提交的码盘数据,如果退出本页面将全部丢失", confirmBtn: "继续退出", confirm: () { Navigator.of(context).pop(); }); } else { @@ -45,7 +45,7 @@ class _StockInWheelPageState extends State { centerTitle: true, backgroundColor: ColorCommon.colorScheme, title: const Text( - "码盘入库", + "MES成品入库", style: TextStyle( color: Colors.white ), @@ -58,43 +58,39 @@ class _StockInWheelPageState extends State { right: 10, ), child: ListView( children: [ - TextField( - decoration: const InputDecoration( - labelText: "载具号:", - ), - controller: _vehicleTextController, + BrnTextInputFormItem( + controller: _vehicleTextController, + title: "载具号:", hint: "请扫描或输入" ), - TextField( - decoration: const InputDecoration( - labelText: "箱号:", - ), - controller: _boxNoTextController, + BrnTextInputFormItem( + controller: _boxNoTextController, + title: "箱号:", hint: "请扫描或输入" ), Padding(padding: const EdgeInsets.only( top: 20 ), child: ElevatedButton( - onPressed: addGoods, - style: ButtonStyle( - backgroundColor: WidgetStateProperty.all(ColorCommon.colorScheme), - ), - child: const Text( - "添加物料", - style: TextStyle( - color: Colors.white - )) + onPressed: addGoods, + style: ButtonStyle( + backgroundColor: WidgetStateProperty.all(ColorCommon.colorScheme), + ), + child: const Text( + "添加物料", + style: TextStyle( + color: Colors.white + )) )), Padding(padding: const EdgeInsets.only( top: 5 ), child: ElevatedButton( - onPressed: wheelComplete, - style: ButtonStyle( - backgroundColor: WidgetStateProperty.all(ColorCommon.colorScheme), - ), - child: const Text( - "码盘完成", - style: TextStyle( - color: Colors.white - )) + onPressed: wheelComplete, + style: ButtonStyle( + backgroundColor: WidgetStateProperty.all(ColorCommon.colorScheme), + ), + child: const Text( + "码盘完成", + style: TextStyle( + color: Colors.white + )) )), const Padding(padding: EdgeInsets.only( top: 10, @@ -168,7 +164,7 @@ class _StockInWheelPageState extends State { return; } } - BrnLoadingDialog.show(context, content: "正在拉取数据"); + BrnLoadingDialog.show(context, content: "正在拉取数据", barrierDismissible: false); // 请求服务器获取数据 WmsApiClient.getGoodsDetail(boxNo).then((response) { if(response["code"] != 200) { @@ -261,7 +257,7 @@ class _StockInWheelPageState extends State { DialogUtils.showWarningMessage(context, "警告", "您还没有码盘的数据", btnLabel: "返回填写"); return; } - DialogUtils.showSingleSelectDialog(context, "请输入入库位置", ["库内","站台"], onSubmitClick: (selectedIndex, value){ + DialogUtils.showSingleSelectDialog(context, "请输入入库位置", ["立体库","装箱线"], onSubmitClick: (selectedIndex, value){ int taskType = selectedIndex == 0 ? 1 : 2; // 1 表示进库,2 表示进站台 List bindingGoods = []; dynamic requestData = {"vehicleNo" : tableData.first["vehicleNo"], "taskType" : taskType, "bindingGoods" : bindingGoods }; diff --git a/lib/page/stockIn/StockInEmpty.dart b/lib/page/stockIn/StockInEmpty.dart index 74fb8f1..43fd1e5 100644 --- a/lib/page/stockIn/StockInEmpty.dart +++ b/lib/page/stockIn/StockInEmpty.dart @@ -39,18 +39,16 @@ class _StockInEmptyPageState extends State { body: Center( child: Padding(padding: const EdgeInsets.only( top: 20, - left: 20, - right: 20, + left: 10, + right: 10, ), child: ListView( children: [ - TextField( - decoration: const InputDecoration( - labelText: "载具号:", - ), - controller: _vehicleTextController, + BrnTextInputFormItem( + controller: _vehicleTextController, + title: "载具号:", hint: "请扫描或输入" ), Padding(padding: const EdgeInsets.only( - top: 20 + top: 10 ), child: ElevatedButton( onPressed: emptyIn, style: ButtonStyle( @@ -75,7 +73,7 @@ class _StockInEmptyPageState extends State { DialogUtils.showWarningMessage(context, "请先填写载具号", "", btnLabel: "返回填写"); return; } - BrnLoadingDialog.show(context, content: "正在请求"); + BrnLoadingDialog.show(context, content: "正在请求", barrierDismissible: false); WmsApiClient.emptyVehicleIn(vehicleNo).then((response) { if(response["code"] != 200) { var thisContext = context;