添加EBS入库

This commit is contained in:
葛林强 2024-12-06 08:13:16 +08:00
parent 5a3c411169
commit d8189e00d2
6 changed files with 247 additions and 73 deletions

View File

@ -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';

View File

@ -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<Home> {
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<Home> {
top: 10,
left: 20,
right: 20
), child: ListView(
), child: ListView(
children: [
const Text("库存占用情况:"),
Row(

View File

@ -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 {

View File

@ -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<StockInWheelEBS> createState() => _StockInWheelEBSPageState();
}
/// EBS码盘入库
class _StockInWheelEBSPageState extends State<StockInWheelEBS> {
final _vehicleTextController = TextEditingController(); //
List<dynamic> 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<dynamic> selectData = tableData.where((w) => w["action"] == "").toList();
if(selectCount < 1) {
DialogUtils.showWarningMessage(context, "警告", "您还没有选择入库单", btnLabel: "返回选择");
return;
}
DialogUtils.showConfirmMessage(context, "完成确认?", "当前选择了 $selectCount 条入库单,是否继续?", confirmBtn: "继续", confirm: (){
});
}
}

View File

@ -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<StockInWheel> createState() => _StockInWheelPageState();
State<StockInWheelMes> createState() => _StockInWheelMesPageState();
}
///
class _StockInWheelPageState extends State<StockInWheel> {
/// MES码盘入
class _StockInWheelMesPageState extends State<StockInWheelMes> {
final _vehicleTextController = TextEditingController(); //
final _boxNoTextController = TextEditingController(); //
@ -35,7 +35,7 @@ class _StockInWheelPageState extends State<StockInWheel> {
),
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<StockInWheel> {
centerTitle: true,
backgroundColor: ColorCommon.colorScheme,
title: const Text(
"码盘入库",
"MES成品入库",
style: TextStyle(
color: Colors.white
),
@ -58,43 +58,39 @@ class _StockInWheelPageState extends State<StockInWheel> {
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<StockInWheel> {
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<StockInWheel> {
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<dynamic> bindingGoods = [];
dynamic requestData = {"vehicleNo" : tableData.first["vehicleNo"], "taskType" : taskType, "bindingGoods" : bindingGoods };

View File

@ -39,18 +39,16 @@ class _StockInEmptyPageState extends State<StockInEmpty> {
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<StockInEmpty> {
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;