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() {
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),
);

View File

@ -53,6 +53,28 @@ class StockInApi {
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数据
static Future<dynamic> getGoodsCanUse(String orderId, String goodsId,
{int timeOut = 5000}) async {

View File

@ -11,7 +11,6 @@ class StockOutApi {
);
static var uuidGen = Uuid();
///
static Future<dynamic> getEmptyVehicle({int timeOut = 5000}) async {
final response = await BaseDio.instance()
.post<String>("/api/mobile/stockOut/outEmptyVehicle",
@ -23,11 +22,10 @@ class StockOutApi {
return {"code": response.statusCode, "data": response.data};
}
///
static Future<dynamic> getVehicleIsEmpty(int vehicleId,
{int timeOut = 5000}) async {
///
static Future<dynamic> getAvailVehicleList({int timeOut = 5000}) async {
final response =
await BaseDio.instance().get<String>("/app/vehicle/$vehicleId",
await BaseDio.instance().get<String>("/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<dynamic> addStockOut({int timeOut = 5000}) async {
final response = await BaseDio.instance().post<String>("/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<dynamic> addStockOut(String goodsId, int needNum, String remark,
{int timeOut = 5000}) async {
final response =
await BaseDio.instance().post<String>("/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};
}

View File

@ -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<StockInEmpty> createState() => _StockInEmptyPageState();
}
@ -36,77 +39,152 @@ class _StockInEmptyPageState extends State<StockInEmpty> {
),
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<String, dynamic>.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<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;
}
///
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<String, dynamic>.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<bool> _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<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() {
DialogUtils.showConfirmMessage(context, "空载具出库", "出一个空载具?",

View File

@ -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<StockOutEmpty> {
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<void> _fetchData() async {
await StockOutApi.getVehicleIsEmpty(vehicle_0).then((response) {
Future<void> _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<StockOutEmpty> {
}
return;
}
final data = Map<String, dynamic>.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<dynamic>.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<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;
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<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
Widget build(BuildContext context) {
return Scaffold(
@ -134,7 +103,7 @@ class _CallEmptyCartPageState extends State<StockOutEmpty> {
),
),
body: FutureBuilder<void>(
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<StockOutEmpty> {
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<String>(
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<int>(
value: selectedQuantity,
items: List.generate(availableVehiclesNum, (index) {
return DropdownMenuItem<int>(
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)),
),
],
),
],
),
);
}