diff --git a/lib/api_client/baseDio.dart b/lib/api_client/baseDio.dart index 703b945..4d238ea 100644 --- a/lib/api_client/baseDio.dart +++ b/lib/api_client/baseDio.dart @@ -6,8 +6,8 @@ class BaseDio { static Dio instance() { if (!initializeComplete) { final options = BaseOptions( - baseUrl: 'http://10.0.2.2:9990', - // baseUrl: 'http://192.168.1.3:9990', + // baseUrl: 'http://10.0.2.2:9990', + baseUrl: 'http://10.24.0.62:9990', connectTimeout: const Duration(seconds: 10), receiveTimeout: const Duration(seconds: 5), ); diff --git a/lib/api_client/stock_in.dart b/lib/api_client/stock_in.dart index 0fcf799..b7f8be7 100644 --- a/lib/api_client/stock_in.dart +++ b/lib/api_client/stock_in.dart @@ -53,6 +53,28 @@ class StockInApi { return {"code": response.statusCode, "data": response.data}; } + /// 码盘完成 + static Future createInTask( + List stockInDataXuGong, String vehicleNo, + {int timeOut = 5000}) async { + logger.e("yuqili $stockInDataXuGong"); + final stockInDataJson = + stockInDataXuGong.map((item) => item.toJson()).toList(); + final request = { + "data": stockInDataJson, + "vehicleNo": vehicleNo + }; + final response = + await BaseDio.instance().post("/app/task/createInRequest", + data: jsonEncode(request), + options: Options( + responseType: ResponseType.json, + sendTimeout: Duration(milliseconds: timeOut), + receiveTimeout: Duration(milliseconds: timeOut), + )); + return {"code": response.statusCode, "data": response.data}; + } + /// 扫描之后从数据库获取EBS数据 static Future getGoodsCanUse(String orderId, String goodsId, {int timeOut = 5000}) async { diff --git a/lib/api_client/stock_out.dart b/lib/api_client/stock_out.dart index 1b8bffb..fde82a8 100644 --- a/lib/api_client/stock_out.dart +++ b/lib/api_client/stock_out.dart @@ -11,7 +11,6 @@ class StockOutApi { ); static var uuidGen = Uuid(); - /// 码盘完成 static Future getEmptyVehicle({int timeOut = 5000}) async { final response = await BaseDio.instance() .post("/api/mobile/stockOut/outEmptyVehicle", @@ -23,11 +22,10 @@ class StockOutApi { return {"code": response.statusCode, "data": response.data}; } - /// 获取载具状态 - static Future getVehicleIsEmpty(int vehicleId, - {int timeOut = 5000}) async { + /// 获取载具状态列表 + static Future getAvailVehicleList({int timeOut = 5000}) async { final response = - await BaseDio.instance().get("/app/vehicle/$vehicleId", + await BaseDio.instance().get("/app/vehicle/listAvail", options: Options( responseType: ResponseType.json, sendTimeout: Duration(milliseconds: timeOut), @@ -36,24 +34,20 @@ class StockOutApi { return {"code": response.statusCode, "data": response.data}; } - static Future addStockOut({int timeOut = 5000}) async { - final response = await BaseDio.instance().post("/app/pmsOrderOut", - data: jsonEncode({ - "listId": uuidGen.v4(), - "orderType": 1, - "customerId": uuidGen.v1(), - "goodsId": uuidGen.v4(), - "goodsNum": 0, - "goodsDesc": "empty", - "spare1": uuidGen.v1(), - "spare2": uuidGen.v1(), - "orderStatus": 1, - }), - options: Options( - responseType: ResponseType.json, - sendTimeout: Duration(milliseconds: timeOut), - receiveTimeout: Duration(milliseconds: timeOut), - )); + static Future addStockOut(String goodsId, int needNum, String remark, + {int timeOut = 5000}) async { + final response = + await BaseDio.instance().post("/app/task/createOutRequest", + data: jsonEncode({ + "goodsId": goodsId, + "needNum": needNum, + "remark": remark + }), + options: Options( + responseType: ResponseType.json, + sendTimeout: Duration(milliseconds: timeOut), + receiveTimeout: Duration(milliseconds: timeOut), + )); logger.e("yuqili ${response.data}"); return {"code": response.statusCode, "data": response.data}; } diff --git a/lib/page/stockIn/stock_in_empty.dart b/lib/page/stockIn/stock_in_empty.dart index aeb75d3..7df4c3d 100644 --- a/lib/page/stockIn/stock_in_empty.dart +++ b/lib/page/stockIn/stock_in_empty.dart @@ -4,11 +4,14 @@ import 'package:bruno/bruno.dart'; import 'package:flutter/material.dart'; import 'package:wms_app/api_client/dto/empty_Vehicle_in_request.dart'; import 'package:wms_app/api_client/stock_in.dart'; +import 'package:wms_app/page/stockIn/stock_in_buy.dart'; +import '../../model/bo/stock_in_data_xugong.dart'; import '/common/colorCom.dart'; import 'package:wms_app/utils/dialogUtils.dart'; class StockInEmpty extends StatefulWidget { const StockInEmpty({super.key}); + @override State createState() => _StockInEmptyPageState(); } @@ -36,77 +39,152 @@ class _StockInEmptyPageState extends State { ), body: Center( child: Padding( - padding: const EdgeInsets.only(top: 5, left: 10, right: 10), - child: ListView( - children: [ - BrnTextInputFormItem( - controller: _vehicleTextController, - title: "料箱号:", - hint: "需要入库的料箱号", - isRequire: true, - ), - Padding( - padding: const EdgeInsets.only(top: 5), - child: ElevatedButton( - onPressed: emptyIn, - style: ButtonStyle( - backgroundColor: - WidgetStateProperty.all(ColorCommon.colorScheme), - ), - child: const Text("空载具入库", style: TextStyle(color: Colors.white)) - ) - ) - ], - ) - ), + padding: const EdgeInsets.only(top: 5, left: 10, right: 10), + child: ListView( + children: [ + BrnTextInputFormItem( + controller: _vehicleTextController, + title: "料箱号:", + hint: "需要入库的料箱号", + isRequire: true, + ), + Padding( + padding: const EdgeInsets.only(top: 5), + child: ElevatedButton( + onPressed: emptyIn, + style: ButtonStyle( + backgroundColor: + WidgetStateProperty.all(ColorCommon.colorScheme), + ), + child: const Text("空载具入库", + style: TextStyle(color: Colors.white)))) + ], + )), ), ); } - /// 空托入库方法 void emptyIn() { String vehicleNo = _vehicleTextController.text.trim(); - if (vehicleNo == "") { + if (vehicleNo.isEmpty) { DialogUtils.showWarningMessage(context, "请先填写容器号", "", btnLabel: "返回填写"); return; } + + // 显示加载对话框 BrnLoadingDialog.show(context, content: "请稍后...", barrierDismissible: false); - // var emptyVehicleInReq = EmptyVehicleInReq(vehicleNo: vehicleNo).toJsonString(); - StockInApi.emptyVehicleIn(vehicleNo).then((response) { - if (response["code"] != 200) { - var thisContext = context; - if (thisContext.mounted) { - DialogUtils.showWarningMessage(thisContext, "警告", "服务器请求失败", btnLabel: "我知道了"); - } + + // 第一步:调用 emptyVehicleIn + _emptyVehicleIn(vehicleNo).then((isEmptyVehicleInSuccess) { + if (!isEmptyVehicleInSuccess) { + _dismissLoading(); return; } - final data = Map.from(jsonDecode(response["data"])); - if (data["code"] == 200) { - // 请求成功 - var thisContext = context; - if (thisContext.mounted) { - DialogUtils.showSuccessMessage(thisContext, "成功", "", btnLabel: "我知道了"); - _vehicleTextController.clear(); + + // 第二步:调用 createInTask + _createInTask(vehicleNo).then((isCreateInTaskSuccess) { + _dismissLoading(); + if (isCreateInTaskSuccess) { + _showSuccessDialog("空托入库成功"); + _clearData(); + } else { + _showWarningDialog("创建入库任务失败"); } - return; - } - var thisContext = context; - if (thisContext.mounted) { - DialogUtils.showWarningMessage(thisContext, "警告", "服务器返回失败:${data["message"]}", btnLabel: "我知道了"); - } - return; + }).catchError((err) { + _dismissLoading(); + _handleError(err); + }); }).catchError((err) { - var thisContext = context; - if (thisContext.mounted) { - DialogUtils.showErrorMessage(thisContext, "请求发生错误", "请求服务器发生错误:${err.toString()}", btnLabel: "我知道了"); - } - return; - }).whenComplete(() { - var thisContext = context; - if (thisContext.mounted) { - BrnLoadingDialog.dismiss(thisContext); - } + _dismissLoading(); + _handleError(err); }); } + +// 调用 emptyVehicleIn 接口 + Future _emptyVehicleIn(String vehicleNo) async { + try { + var response = await StockInApi.emptyVehicleIn(vehicleNo); + if (response["code"] != 200) { + _showWarningDialog("服务器请求失败"); + return false; + } + return true; + } catch (err) { + _handleError(err); + return false; + } + } + +// 调用 createInTask 接口 + Future _createInTask(String vehicleNo) async { + try { + var response = await StockInApi.createInTask([ + StockInDataXuGong( + goodsId: "0", + goodsNum: 1, + goodsDesc: "空托", + orderType: 1, + weight: 10, + size: 10, + listId: uuidGen.v4(), + unit: "个", + customerName: "test", + spare2: "test", + spare1: "test") + ], vehicleNo); + + if (response["code"] != 200) { + _showWarningDialog("服务器请求失败"); + return false; + } + return true; + } catch (err) { + _handleError(err); + return false; + } + } + +// 显示错误提示 + void _handleError(dynamic err) { + var thisContext = context; + if (thisContext.mounted) { + DialogUtils.showErrorMessage( + thisContext, "请求发生错误", "请求服务器发生错误:${err.toString()}", + btnLabel: "我知道了"); + } + } + +// 显示成功提示 + void _showSuccessDialog(String message) { + var thisContext = context; + if (thisContext.mounted) { + DialogUtils.showSuccessMessage(thisContext, message, "", + btnLabel: "我知道了"); + } + } + +// 显示警告提示 + void _showWarningDialog(String message) { + var thisContext = context; + if (thisContext.mounted) { + DialogUtils.showWarningMessage(thisContext, "警告", message, + btnLabel: "我知道了"); + } + } + +// 清除数据 + void _clearData() { + setState(() { + _vehicleTextController.clear(); + }); + } + +// 隐藏加载对话框 + void _dismissLoading() { + var thisContext = context; + if (thisContext.mounted) { + BrnLoadingDialog.dismiss(thisContext); + } + } } diff --git a/lib/page/stockIn/stock_in_normal.dart b/lib/page/stockIn/stock_in_normal.dart index 4c569df..26ec066 100644 --- a/lib/page/stockIn/stock_in_normal.dart +++ b/lib/page/stockIn/stock_in_normal.dart @@ -197,67 +197,136 @@ class _StockInNormalState extends State { return; } - /// 码盘完成 void wheelComplete() { if (stockInDataXuGong.isEmpty) { DialogUtils.showWarningMessage(context, "警告", "您的码盘数据为空", btnLabel: "确定"); return; } + String vehicleNo = _vehicleTextController.text; int dataCount = stockInDataXuGong.length; + DialogUtils.showConfirmMessage( - context, "码盘完成", "载具:$vehicleNo 码盘 $dataCount 条数据,是否继续?", - confirmBtn: "继续", confirm: () { - int taskType = 1; // 1 表示进库,2 表示进站台 - BrnLoadingDialog.show(context, content: "正在请求入库"); - StockInApi.stockInComplete(stockInDataXuGong, vehicleNo) - .then((response) { - if (response["code"] != 200) { - var thisContext = context; - if (thisContext.mounted) { - DialogUtils.showWarningMessage(thisContext, "警告", "服务器请求失败", - btnLabel: "我知道了"); - } - return; - } - final data = Map.from(jsonDecode(response["data"])); - if (data["code"] == 200) { - // 请求成功 - setState(() { - _vehicleTextController.clear(); - stockInDataXuGong = []; + context, + "码盘完成", + "载具:$vehicleNo 码盘 $dataCount 条数据,是否继续?", + confirmBtn: "继续", + confirm: () { + int taskType = 1; // 1 表示进库,2 表示进站台 + BrnLoadingDialog.show(context, content: "正在请求入库"); + + _stockInComplete(vehicleNo).then((isCompleteSuccess) { + if (!isCompleteSuccess) { + _dismissLoading(); + return; + } + + _createInTask(vehicleNo).then((isTaskSuccess) { + _dismissLoading(); + if (isTaskSuccess) { + _showSuccessDialog("入库成功"); + _clearData(); + } else { + _showWarningDialog("创建任务失败"); + } + }).catchError((err) { + _dismissLoading(); + _handleError(err); + }); + }).catchError((err) { + _dismissLoading(); + _handleError(err); }); - var thisContext = context; - if (thisContext.mounted) { - DialogUtils.showSuccessMessage(thisContext, "码盘成功", "", - btnLabel: "我知道了"); - } - return; } - var thisContext = context; - if (thisContext.mounted) { - DialogUtils.showWarningMessage( - thisContext, "警告", "服务器返回失败:${data["message"]}", - btnLabel: "我知道了"); - } - return; - }).catchError((err) { - var thisContext = context; - if (thisContext.mounted) { - DialogUtils.showErrorMessage( - thisContext, "请求发生错误", "请求服务器发生错误:${err.toString()}", - btnLabel: "我知道了"); - } - return; - }).whenComplete(() { - var thisContext = context; - if (thisContext.mounted) { - BrnLoadingDialog.dismiss(thisContext); - } - }); + ); + } + +// 完成入库请求 + Future _stockInComplete(String vehicleNo) async { + try { + var response = await StockInApi.stockInComplete(stockInDataXuGong, vehicleNo); + if (response["code"] != 200) { + _showWarningDialog("服务器请求失败"); + return false; + } + return true; + } catch (err) { + _handleError(err); + return false; + } + } + +// 创建入库任务 + Future _createInTask(String vehicleNo) async { + try { + var response = await StockInApi.createInTask(stockInDataXuGong, vehicleNo); + if (response["code"] != 200) { + _showWarningDialog("服务器请求失败"); + return false; + } + return true; + } catch (err) { + _handleError(err); + return false; + } + } + +// 显示错误提示 + void _handleError(dynamic err) { + var thisContext = context; + if (thisContext.mounted) { + DialogUtils.showErrorMessage( + thisContext, + "请求发生错误", + "请求服务器发生错误:${err.toString()}", + btnLabel: "我知道了" + ); + } + } + +// 显示成功提示 + void _showSuccessDialog(String message) { + var thisContext = context; + if (thisContext.mounted) { + DialogUtils.showSuccessMessage( + thisContext, + message, + "", + btnLabel: "我知道了" + ); + } + } + +// 显示警告提示 + void _showWarningDialog(String message) { + var thisContext = context; + if (thisContext.mounted) { + DialogUtils.showWarningMessage( + thisContext, + "警告", + message, + btnLabel: "我知道了" + ); + } + } + +// 清除数据 + void _clearData() { + setState(() { + _vehicleTextController.clear(); + stockInDataXuGong = []; }); } +// 隐藏加载对话框 + void _dismissLoading() { + var thisContext = context; + if (thisContext.mounted) { + BrnLoadingDialog.dismiss(thisContext); + } + } + + /// 出一个空空箱 getEmptyVehicle() { DialogUtils.showConfirmMessage(context, "空载具出库", "出一个空载具?", diff --git a/lib/page/stockOut/stock_out_empty.dart b/lib/page/stockOut/stock_out_empty.dart index fc4d189..76c141a 100644 --- a/lib/page/stockOut/stock_out_empty.dart +++ b/lib/page/stockOut/stock_out_empty.dart @@ -3,6 +3,11 @@ import '/common/colorCom.dart'; import 'package:wms_app/utils/dialogUtils.dart'; import 'package:wms_app/api_client/stock_out.dart'; import 'dart:convert'; +import 'package:logger/logger.dart'; + +var logger = Logger( + printer: PrettyPrinter(), +); class StockOutEmpty extends StatefulWidget { const StockOutEmpty({super.key}); @@ -12,17 +17,22 @@ class StockOutEmpty extends StatefulWidget { } class _CallEmptyCartPageState extends State { - int vehicle_0 = 0, vehicle_1 = 1; - String status_0 = "不可用", status_1 = "不可用"; + int availableVehiclesNum = 0; // 可用空托盘的数量 + bool isDataLoaded = false; // 用于标记数据是否已经加载过 + String goodsId = "0"; // 商品ID + int selectedQuantity = 1; // 用户选择的空托盘数量 @override void initState() { super.initState(); - _fetchData(); + _fetchAvailableVehicles(); // 获取所有可用空托盘的数量 } - Future _fetchData() async { - await StockOutApi.getVehicleIsEmpty(vehicle_0).then((response) { + Future _fetchAvailableVehicles() async { + // 只有在数据未加载过时才重新发起请求 + if (isDataLoaded) return; + + await StockOutApi.getAvailVehicleList().then((response) { if (response["code"] != 200) { var thisContext = context; if (thisContext.mounted) { @@ -31,91 +41,50 @@ class _CallEmptyCartPageState extends State { } return; } - final data = Map.from(jsonDecode(response["data"])); - if (data["code"] == 200) { - // 请求成功 - if (data["data"]["isEmpty"] == 1 && data["data"]["isLock"] == 0) { - status_0 = "可用"; - return; - } - } - return; - }).catchError((err) { - var thisContext = context; - if (thisContext.mounted) { - DialogUtils.showErrorMessage( - thisContext, "请求发生错误", "请求服务器发生错误:${err.toString()}", - btnLabel: "我知道了"); - } - return; - }); + logger.e("yuqili response ${response}"); + final data = List.from(jsonDecode(response["data"])); + logger.e("yuqili data ${data}"); - await StockOutApi.getVehicleIsEmpty(vehicle_1).then((response) { - if (response["code"] != 200) { - var thisContext = context; - if (thisContext.mounted) { - DialogUtils.showWarningMessage(thisContext, "警告", "服务器请求失败", - btnLabel: "我知道了"); - } - return; - } - final data = Map.from(jsonDecode(response["data"])); - if (data["code"] == 200) { - // 请求成功 - if (data["data"]["isEmpty"] == 1 && data["data"]["isLock"] == 0) { - status_1 = "可用"; - return; - } - } - return; - }).catchError((err) { - var thisContext = context; - if (thisContext.mounted) { - DialogUtils.showErrorMessage( - thisContext, "请求发生错误", "请求服务器发生错误:${err.toString()}", - btnLabel: "我知道了"); - } - return; - }); - } - - String selectedOption = "1"; - String status = "可用"; - bool isLoading = false; - - void callEmptyCart() { - if ((selectedOption == "1" && status_0 == "不可用") || - (selectedOption == "2" && status_1 == "不可用")) { - DialogUtils.showWarningMessage(context, "警告", "选中的空托不可用", - btnLabel: "我知道了"); - } else { - StockOutApi.addStockOut().then((response) { - if (response["code"] != 200) { - var thisContext = context; - if (thisContext.mounted) { - DialogUtils.showWarningMessage(thisContext, "警告", "服务器请求失败", - btnLabel: "我知道了"); - } - return; - } - final data = Map.from(jsonDecode(response["data"])); - if (data["code"] == 200) { - DialogUtils.showSuccessMessage(context, "成功", "空托已呼叫", - btnLabel: "我知道了"); - return; - } - }).catchError((err) { - var thisContext = context; - if (thisContext.mounted) { - DialogUtils.showErrorMessage( - thisContext, "请求发生错误", "请求服务器发生错误:${err.toString()}", - btnLabel: "我知道了"); - } - return; + setState(() { + availableVehiclesNum = data.length; + isDataLoaded = true; // 数据加载完毕,设置标志位 }); - } + }).catchError((err) { + var thisContext = context; + if (thisContext.mounted) { + DialogUtils.showErrorMessage( + thisContext, "请求发生错误", "请求服务器发生错误:${err.toString()}", + btnLabel: "我知道了"); + } + }); } + void callEmptyCart(int quantity) { + // 业务逻辑,调用出库接口等 + StockOutApi.addStockOut(goodsId, quantity, "空托盘出库").then((response) { + if (response["code"] != 200) { + var thisContext = context; + if (thisContext.mounted) { + DialogUtils.showWarningMessage(thisContext, "警告", "服务器请求失败", + btnLabel: "我知道了"); + } + return; + } + final data = Map.from(jsonDecode(response["data"])); + if (data["code"] == 200) { + DialogUtils.showSuccessMessage(context, "成功", "空托已呼叫", + btnLabel: "我知道了"); + return; + } + }).catchError((err) { + var thisContext = context; + if (thisContext.mounted) { + DialogUtils.showErrorMessage( + thisContext, "请求发生错误", "请求服务器发生错误:${err.toString()}", + btnLabel: "我知道了"); + } + }); + } @override Widget build(BuildContext context) { return Scaffold( @@ -134,7 +103,7 @@ class _CallEmptyCartPageState extends State { ), ), body: FutureBuilder( - future: _fetchData(), // 使用FutureBuilder来等待_fetchData的完成 + future: _fetchAvailableVehicles(), // 使用FutureBuilder来等待获取所有车辆信息 builder: (context, snapshot) { if (snapshot.connectionState == ConnectionState.waiting) { return Center(child: CircularProgressIndicator()); // 显示加载中 @@ -143,51 +112,44 @@ class _CallEmptyCartPageState extends State { child: Text("请求失败: ${snapshot.error.toString()}"), ); } else { - return Center( - child: Padding( - padding: const EdgeInsets.only(top: 5, left: 10, right: 10), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Row( - children: [ - Expanded( - child: DropdownButton( - value: selectedOption, - isExpanded: true, - items: [ - DropdownMenuItem( - value: "1", - child: Text("1 - $status_0"), - ), - DropdownMenuItem( - value: "2", - child: Text("2 - $status_1"), - ), - ], - onChanged: (value) { - setState(() { - selectedOption = value!; - }); - }, - ), + return Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + // 添加一个文本来提示用户选择空托数量 + Text("呼叫空托数量: ", style: TextStyle(fontSize: 16)), + // 下拉框 + DropdownButton( + value: selectedQuantity, + items: List.generate(availableVehiclesNum, (index) { + return DropdownMenuItem( + value: index + 1, + child: Text("${index + 1}"), + ); + }), + onChanged: (value) { + setState(() { + selectedQuantity = value!; + }); + }, + hint: Text("选择空托盘数量"), + ), + SizedBox(width: 20), // 添加一些空间 + // 出库按钮 + ElevatedButton( + onPressed: () => callEmptyCart(selectedQuantity), + style: ButtonStyle( + backgroundColor: MaterialStateProperty.all( + ColorCommon.colorScheme), ), - Padding( - padding: const EdgeInsets.only(left: 10), - child: ElevatedButton( - onPressed: isLoading ? null : callEmptyCart, - style: ButtonStyle( - backgroundColor: WidgetStateProperty.all( - ColorCommon.colorScheme), - ), - child: Text("出库", - style: TextStyle(color: Colors.white)), - ), - ), - ], - ), - ], - ), + child: Text("出库", style: TextStyle(color: Colors.white)), + ), + ], + ), + ], ), ); }