add inTask && add listAvailVehicle

This commit is contained in:
李宇奇 2025-02-25 16:00:50 +08:00
parent 5194d953ed
commit ead32cfa5f
6 changed files with 385 additions and 260 deletions

View File

@ -6,8 +6,8 @@ class BaseDio {
static Dio instance() { static Dio instance() {
if (!initializeComplete) { if (!initializeComplete) {
final options = BaseOptions( final options = BaseOptions(
baseUrl: 'http://10.0.2.2:9990', // baseUrl: 'http://10.0.2.2:9990',
// baseUrl: 'http://192.168.1.3:9990', baseUrl: 'http://10.24.0.62:9990',
connectTimeout: const Duration(seconds: 10), connectTimeout: const Duration(seconds: 10),
receiveTimeout: const Duration(seconds: 5), receiveTimeout: const Duration(seconds: 5),
); );

View File

@ -53,6 +53,28 @@ class StockInApi {
return {"code": response.statusCode, "data": response.data}; return {"code": response.statusCode, "data": response.data};
} }
///
static Future<dynamic> createInTask(
List<StockInDataXuGong> 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<String>("/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数据 /// EBS数据
static Future<dynamic> getGoodsCanUse(String orderId, String goodsId, static Future<dynamic> getGoodsCanUse(String orderId, String goodsId,
{int timeOut = 5000}) async { {int timeOut = 5000}) async {

View File

@ -11,7 +11,6 @@ class StockOutApi {
); );
static var uuidGen = Uuid(); static var uuidGen = Uuid();
///
static Future<dynamic> getEmptyVehicle({int timeOut = 5000}) async { static Future<dynamic> getEmptyVehicle({int timeOut = 5000}) async {
final response = await BaseDio.instance() final response = await BaseDio.instance()
.post<String>("/api/mobile/stockOut/outEmptyVehicle", .post<String>("/api/mobile/stockOut/outEmptyVehicle",
@ -23,11 +22,10 @@ class StockOutApi {
return {"code": response.statusCode, "data": response.data}; return {"code": response.statusCode, "data": response.data};
} }
/// ///
static Future<dynamic> getVehicleIsEmpty(int vehicleId, static Future<dynamic> getAvailVehicleList({int timeOut = 5000}) async {
{int timeOut = 5000}) async {
final response = final response =
await BaseDio.instance().get<String>("/app/vehicle/$vehicleId", await BaseDio.instance().get<String>("/app/vehicle/listAvail",
options: Options( options: Options(
responseType: ResponseType.json, responseType: ResponseType.json,
sendTimeout: Duration(milliseconds: timeOut), sendTimeout: Duration(milliseconds: timeOut),
@ -36,24 +34,20 @@ class StockOutApi {
return {"code": response.statusCode, "data": response.data}; return {"code": response.statusCode, "data": response.data};
} }
static Future<dynamic> addStockOut({int timeOut = 5000}) async { static Future<dynamic> addStockOut(String goodsId, int needNum, String remark,
final response = await BaseDio.instance().post<String>("/app/pmsOrderOut", {int timeOut = 5000}) async {
data: jsonEncode({ final response =
"listId": uuidGen.v4(), await BaseDio.instance().post<String>("/app/task/createOutRequest",
"orderType": 1, data: jsonEncode({
"customerId": uuidGen.v1(), "goodsId": goodsId,
"goodsId": uuidGen.v4(), "needNum": needNum,
"goodsNum": 0, "remark": remark
"goodsDesc": "empty", }),
"spare1": uuidGen.v1(), options: Options(
"spare2": uuidGen.v1(), responseType: ResponseType.json,
"orderStatus": 1, sendTimeout: Duration(milliseconds: timeOut),
}), receiveTimeout: Duration(milliseconds: timeOut),
options: Options( ));
responseType: ResponseType.json,
sendTimeout: Duration(milliseconds: timeOut),
receiveTimeout: Duration(milliseconds: timeOut),
));
logger.e("yuqili ${response.data}"); logger.e("yuqili ${response.data}");
return {"code": response.statusCode, "data": response.data}; return {"code": response.statusCode, "data": response.data};
} }

View File

@ -4,11 +4,14 @@ import 'package:bruno/bruno.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:wms_app/api_client/dto/empty_Vehicle_in_request.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/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 '/common/colorCom.dart';
import 'package:wms_app/utils/dialogUtils.dart'; import 'package:wms_app/utils/dialogUtils.dart';
class StockInEmpty extends StatefulWidget { class StockInEmpty extends StatefulWidget {
const StockInEmpty({super.key}); const StockInEmpty({super.key});
@override @override
State<StockInEmpty> createState() => _StockInEmptyPageState(); State<StockInEmpty> createState() => _StockInEmptyPageState();
} }
@ -36,77 +39,152 @@ class _StockInEmptyPageState extends State<StockInEmpty> {
), ),
body: Center( body: Center(
child: Padding( child: Padding(
padding: const EdgeInsets.only(top: 5, left: 10, right: 10), padding: const EdgeInsets.only(top: 5, left: 10, right: 10),
child: ListView( child: ListView(
children: [ children: [
BrnTextInputFormItem( BrnTextInputFormItem(
controller: _vehicleTextController, controller: _vehicleTextController,
title: "料箱号:", title: "料箱号:",
hint: "需要入库的料箱号", hint: "需要入库的料箱号",
isRequire: true, isRequire: true,
), ),
Padding( Padding(
padding: const EdgeInsets.only(top: 5), padding: const EdgeInsets.only(top: 5),
child: ElevatedButton( child: ElevatedButton(
onPressed: emptyIn, onPressed: emptyIn,
style: ButtonStyle( style: ButtonStyle(
backgroundColor: backgroundColor:
WidgetStateProperty.all(ColorCommon.colorScheme), WidgetStateProperty.all(ColorCommon.colorScheme),
), ),
child: const Text("空载具入库", style: TextStyle(color: Colors.white)) child: const Text("空载具入库",
) style: TextStyle(color: Colors.white))))
) ],
], )),
)
),
), ),
); );
} }
///
void emptyIn() { void emptyIn() {
String vehicleNo = _vehicleTextController.text.trim(); String vehicleNo = _vehicleTextController.text.trim();
if (vehicleNo == "") { if (vehicleNo.isEmpty) {
DialogUtils.showWarningMessage(context, "请先填写容器号", "", btnLabel: "返回填写"); DialogUtils.showWarningMessage(context, "请先填写容器号", "", btnLabel: "返回填写");
return; return;
} }
//
BrnLoadingDialog.show(context, BrnLoadingDialog.show(context,
content: "请稍后...", barrierDismissible: false); content: "请稍后...", barrierDismissible: false);
// var emptyVehicleInReq = EmptyVehicleInReq(vehicleNo: vehicleNo).toJsonString();
StockInApi.emptyVehicleIn(vehicleNo).then((response) { // emptyVehicleIn
if (response["code"] != 200) { _emptyVehicleIn(vehicleNo).then((isEmptyVehicleInSuccess) {
var thisContext = context; if (!isEmptyVehicleInSuccess) {
if (thisContext.mounted) { _dismissLoading();
DialogUtils.showWarningMessage(thisContext, "警告", "服务器请求失败", btnLabel: "我知道了");
}
return; return;
} }
final data = Map<String, dynamic>.from(jsonDecode(response["data"]));
if (data["code"] == 200) { // createInTask
// _createInTask(vehicleNo).then((isCreateInTaskSuccess) {
var thisContext = context; _dismissLoading();
if (thisContext.mounted) { if (isCreateInTaskSuccess) {
DialogUtils.showSuccessMessage(thisContext, "成功", "", btnLabel: "我知道了"); _showSuccessDialog("空托入库成功");
_vehicleTextController.clear(); _clearData();
} else {
_showWarningDialog("创建入库任务失败");
} }
return; }).catchError((err) {
} _dismissLoading();
var thisContext = context; _handleError(err);
if (thisContext.mounted) { });
DialogUtils.showWarningMessage(thisContext, "警告", "服务器返回失败:${data["message"]}", btnLabel: "我知道了");
}
return;
}).catchError((err) { }).catchError((err) {
var thisContext = context; _dismissLoading();
if (thisContext.mounted) { _handleError(err);
DialogUtils.showErrorMessage(thisContext, "请求发生错误", "请求服务器发生错误:${err.toString()}", btnLabel: "我知道了");
}
return;
}).whenComplete(() {
var thisContext = context;
if (thisContext.mounted) {
BrnLoadingDialog.dismiss(thisContext);
}
}); });
} }
// emptyVehicleIn
Future<bool> _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<bool> _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);
}
}
} }

View File

@ -197,67 +197,136 @@ class _StockInNormalState extends State<StockInNormal> {
return; return;
} }
///
void wheelComplete() { void wheelComplete() {
if (stockInDataXuGong.isEmpty) { if (stockInDataXuGong.isEmpty) {
DialogUtils.showWarningMessage(context, "警告", "您的码盘数据为空", btnLabel: "确定"); DialogUtils.showWarningMessage(context, "警告", "您的码盘数据为空", btnLabel: "确定");
return; return;
} }
String vehicleNo = _vehicleTextController.text; String vehicleNo = _vehicleTextController.text;
int dataCount = stockInDataXuGong.length; int dataCount = stockInDataXuGong.length;
DialogUtils.showConfirmMessage( DialogUtils.showConfirmMessage(
context, "码盘完成", "载具:$vehicleNo 码盘 $dataCount 条数据,是否继续?", context,
confirmBtn: "继续", confirm: () { "码盘完成",
int taskType = 1; // 1 2 "载具:$vehicleNo 码盘 $dataCount 条数据,是否继续?",
BrnLoadingDialog.show(context, content: "正在请求入库"); confirmBtn: "继续",
StockInApi.stockInComplete(stockInDataXuGong, vehicleNo) confirm: () {
.then((response) { int taskType = 1; // 1 2
if (response["code"] != 200) { BrnLoadingDialog.show(context, content: "正在请求入库");
var thisContext = context;
if (thisContext.mounted) { _stockInComplete(vehicleNo).then((isCompleteSuccess) {
DialogUtils.showWarningMessage(thisContext, "警告", "服务器请求失败", if (!isCompleteSuccess) {
btnLabel: "我知道了"); _dismissLoading();
} return;
return; }
}
final data = Map<String, dynamic>.from(jsonDecode(response["data"])); _createInTask(vehicleNo).then((isTaskSuccess) {
if (data["code"] == 200) { _dismissLoading();
// if (isTaskSuccess) {
setState(() { _showSuccessDialog("入库成功");
_vehicleTextController.clear(); _clearData();
stockInDataXuGong = []; } 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: "我知道了"); Future<bool> _stockInComplete(String vehicleNo) async {
} try {
return; var response = await StockInApi.stockInComplete(stockInDataXuGong, vehicleNo);
}).catchError((err) { if (response["code"] != 200) {
var thisContext = context; _showWarningDialog("服务器请求失败");
if (thisContext.mounted) { return false;
DialogUtils.showErrorMessage( }
thisContext, "请求发生错误", "请求服务器发生错误:${err.toString()}", return true;
btnLabel: "我知道了"); } catch (err) {
} _handleError(err);
return; return false;
}).whenComplete(() { }
var thisContext = context; }
if (thisContext.mounted) {
BrnLoadingDialog.dismiss(thisContext); //
} Future<bool> _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() { getEmptyVehicle() {
DialogUtils.showConfirmMessage(context, "空载具出库", "出一个空载具?", DialogUtils.showConfirmMessage(context, "空载具出库", "出一个空载具?",

View File

@ -3,6 +3,11 @@ import '/common/colorCom.dart';
import 'package:wms_app/utils/dialogUtils.dart'; import 'package:wms_app/utils/dialogUtils.dart';
import 'package:wms_app/api_client/stock_out.dart'; import 'package:wms_app/api_client/stock_out.dart';
import 'dart:convert'; import 'dart:convert';
import 'package:logger/logger.dart';
var logger = Logger(
printer: PrettyPrinter(),
);
class StockOutEmpty extends StatefulWidget { class StockOutEmpty extends StatefulWidget {
const StockOutEmpty({super.key}); const StockOutEmpty({super.key});
@ -12,17 +17,22 @@ class StockOutEmpty extends StatefulWidget {
} }
class _CallEmptyCartPageState extends State<StockOutEmpty> { class _CallEmptyCartPageState extends State<StockOutEmpty> {
int vehicle_0 = 0, vehicle_1 = 1; int availableVehiclesNum = 0; //
String status_0 = "不可用", status_1 = "不可用"; bool isDataLoaded = false; //
String goodsId = "0"; // ID
int selectedQuantity = 1; //
@override @override
void initState() { void initState() {
super.initState(); super.initState();
_fetchData(); _fetchAvailableVehicles(); //
} }
Future<void> _fetchData() async { Future<void> _fetchAvailableVehicles() async {
await StockOutApi.getVehicleIsEmpty(vehicle_0).then((response) { //
if (isDataLoaded) return;
await StockOutApi.getAvailVehicleList().then((response) {
if (response["code"] != 200) { if (response["code"] != 200) {
var thisContext = context; var thisContext = context;
if (thisContext.mounted) { if (thisContext.mounted) {
@ -31,91 +41,50 @@ class _CallEmptyCartPageState extends State<StockOutEmpty> {
} }
return; return;
} }
final data = Map<String, dynamic>.from(jsonDecode(response["data"])); logger.e("yuqili response ${response}");
if (data["code"] == 200) { final data = List<dynamic>.from(jsonDecode(response["data"]));
// logger.e("yuqili data ${data}");
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;
});
await StockOutApi.getVehicleIsEmpty(vehicle_1).then((response) { setState(() {
if (response["code"] != 200) { availableVehiclesNum = data.length;
var thisContext = context; isDataLoaded = true; //
if (thisContext.mounted) {
DialogUtils.showWarningMessage(thisContext, "警告", "服务器请求失败",
btnLabel: "我知道了");
}
return;
}
final data = Map<String, dynamic>.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<String, dynamic>.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;
}); });
} }).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<String, dynamic>.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 @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
@ -134,7 +103,7 @@ class _CallEmptyCartPageState extends State<StockOutEmpty> {
), ),
), ),
body: FutureBuilder<void>( body: FutureBuilder<void>(
future: _fetchData(), // 使FutureBuilder来等待_fetchData的完成 future: _fetchAvailableVehicles(), // 使FutureBuilder来等待获取所有车辆信息
builder: (context, snapshot) { builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) { if (snapshot.connectionState == ConnectionState.waiting) {
return Center(child: CircularProgressIndicator()); // return Center(child: CircularProgressIndicator()); //
@ -143,51 +112,44 @@ class _CallEmptyCartPageState extends State<StockOutEmpty> {
child: Text("请求失败: ${snapshot.error.toString()}"), child: Text("请求失败: ${snapshot.error.toString()}"),
); );
} else { } else {
return Center( return Padding(
child: Padding( padding: const EdgeInsets.all(16.0),
padding: const EdgeInsets.only(top: 5, left: 10, right: 10), child: Column(
child: Column( children: [
mainAxisAlignment: MainAxisAlignment.center, Row(
children: [ mainAxisAlignment: MainAxisAlignment.start,
Row( children: [
children: [ //
Expanded( Text("呼叫空托数量: ", style: TextStyle(fontSize: 16)),
child: DropdownButton<String>( //
value: selectedOption, DropdownButton<int>(
isExpanded: true, value: selectedQuantity,
items: [ items: List.generate(availableVehiclesNum, (index) {
DropdownMenuItem( return DropdownMenuItem<int>(
value: "1", value: index + 1,
child: Text("1 - $status_0"), child: Text("${index + 1}"),
), );
DropdownMenuItem( }),
value: "2", onChanged: (value) {
child: Text("2 - $status_1"), setState(() {
), selectedQuantity = value!;
], });
onChanged: (value) { },
setState(() { hint: Text("选择空托盘数量"),
selectedOption = value!; ),
}); SizedBox(width: 20), //
}, //
), ElevatedButton(
onPressed: () => callEmptyCart(selectedQuantity),
style: ButtonStyle(
backgroundColor: MaterialStateProperty.all(
ColorCommon.colorScheme),
), ),
Padding( child: Text("出库", style: TextStyle(color: Colors.white)),
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)),
),
),
],
),
],
),
), ),
); );
} }