XuGongTeJi_flutter/lib/page/stockIn/stock_in_buy.dart

361 lines
13 KiB
Dart
Raw Normal View History

2025-02-20 13:23:50 +08:00
import 'dart:convert';
2025-02-22 15:56:40 +08:00
import 'dart:math';
2025-02-20 13:23:50 +08:00
import 'package:bruno/bruno.dart';
import 'package:flutter/material.dart';
import 'package:wms_app/api_client/stock_in.dart';
import 'package:wms_app/model/bo/stock_in_data_xugong.dart';
import '../../common/colorCom.dart';
import '../../utils/dialogUtils.dart';
2025-02-22 15:56:40 +08:00
import 'package:logger/logger.dart';
import 'package:uuid/uuid.dart';
2025-02-20 13:23:50 +08:00
class StockInBuy extends StatefulWidget {
const StockInBuy({super.key});
@override
State<StockInBuy> createState() => _StockInBuyState();
}
class _StockInBuyState extends State<StockInBuy> {
List<StockInDataXuGong> stockInDataXuGong = [];
2025-02-22 15:56:40 +08:00
static var logger = Logger(
printer: PrettyPrinter(),
);
static var uuidGen = Uuid();
2025-02-20 13:23:50 +08:00
@override
void initState() {
super.initState();
_fetchOrderData();
}
void _fetchOrderData() {
2025-02-22 15:56:40 +08:00
_fetchGoodsData();
logger.e("yuqili1 ${stockInDataXuGong}");
2025-02-20 13:23:50 +08:00
}
2025-02-22 15:56:40 +08:00
Future<void> _fetchGoodsData() async {
final response = await StockInApi.getAppOrderGoodsList();
if (response["code"] != 200) {
var thisContext = context;
if (thisContext.mounted) {
DialogUtils.showWarningMessage(thisContext, "警告", "服务器请求失败", btnLabel: "我知道了");
}
return;
}
final data = jsonDecode(response["data"]);
logger.e("yuqili2 $data");
final List<dynamic> res = data["rows"];
stockInDataXuGong = res.map((item) => StockInDataXuGong.fromJson(item)).toList();
2025-02-20 13:23:50 +08:00
}
@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),
),
centerTitle: true,
backgroundColor: ColorCommon.colorScheme,
title: const Text(
"采购有货入库",
style: TextStyle(color: Colors.white),
),
),
2025-02-22 15:56:40 +08:00
body: FutureBuilder<void>(
future: _fetchGoodsData(),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return const Center(child: CircularProgressIndicator());
} else if (snapshot.hasError) {
return Center(child: Text("请求发生错误: ${snapshot.error}"));
} else {
return Center(
child: Padding(
padding: const EdgeInsets.only(top: 5, left: 10, right: 10),
child: Column(
children: [
Expanded(
child: ListView.builder(
itemCount: stockInDataXuGong.length,
itemBuilder: (context, index) {
final item = stockInDataXuGong[index];
return Card(
margin: const EdgeInsets.symmetric(vertical: 5),
child: ListTile(
onTap: () => _editGood(item),
title: Row(
children: [
Expanded(child: Text("物料号: ${item.goodsId}")),
Expanded(child: Text("数量: ${item.goodsNum}")),
Expanded(child: Text("描述: ${item.goodsDesc}")),
Expanded(child: Text("重量: ${item.weight} KG")),
Expanded(child: Text("尺寸: ${item.size}")),
IconButton(
icon: const Icon(Icons.add),
onPressed: () {
_addMaterial(item);
},
),
IconButton(
icon: const Icon(Icons.edit),
onPressed: () {
_editGood(item);
},
),
],
),
2025-02-20 13:23:50 +08:00
),
2025-02-22 15:56:40 +08:00
);
},
2025-02-20 13:23:50 +08:00
),
2025-02-22 15:56:40 +08:00
),
Padding(
padding: const EdgeInsets.all(10),
child: ElevatedButton(
onPressed: _completeStockIn,
child: const Text("码盘完成"),
),
),
],
2025-02-20 13:23:50 +08:00
),
),
2025-02-22 15:56:40 +08:00
);
}
},
2025-02-20 13:23:50 +08:00
),
);
}
2025-02-22 15:56:40 +08:00
void _editGood(StockInDataXuGong item) async {
final updatedItem = await Navigator.of(context).push(
2025-02-20 13:23:50 +08:00
MaterialPageRoute(
2025-02-22 15:56:40 +08:00
builder: (context) => EditStockInPage(item: item),
2025-02-20 13:23:50 +08:00
),
);
2025-02-22 15:56:40 +08:00
if (updatedItem != null) {
setState(() {
final index = stockInDataXuGong.indexWhere((e) => e.goodsId == item.goodsId);
if (index != -1) {
stockInDataXuGong[index] = updatedItem; // 更新列表
}
});
}
2025-02-20 13:23:50 +08:00
}
2025-02-22 15:56:40 +08:00
2025-02-20 13:23:50 +08:00
void _addMaterial(StockInDataXuGong item) {
2025-02-22 15:56:40 +08:00
StockInApi.addStockIn(item).then((response) {
logger.e("yuqili $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;
});
2025-02-20 13:23:50 +08:00
}
void _completeStockIn() {
if (stockInDataXuGong.isEmpty) {
DialogUtils.showWarningMessage(context, "警告", "您的码盘数据为空", btnLabel: "确定");
return;
}
DialogUtils.showConfirmMessage(context, "码盘完成", "是否完成入库?", confirmBtn: "完成",
confirm: () {
2025-02-22 15:56:40 +08:00
BrnLoadingDialog.show(context, content: "正在请求入库");
StockInApi.addCompleted(uuidGen.v4()).then((response) {
logger.e("yuqili $response");
if (response["code"] != 200) {
DialogUtils.showWarningMessage(context, "警告", "服务器请求失败", btnLabel: "我知道了");
return;
}
final data = Map<String, dynamic>.from(jsonDecode(response["data"]));
if (data["code"] == 200) {
setState(() {
stockInDataXuGong.clear();
});
DialogUtils.showSuccessMessage(context, "码盘成功", "", btnLabel: "我知道了");
} else {
DialogUtils.showWarningMessage(
context, "警告", "服务器返回失败:${data["message"]}", btnLabel: "我知道了");
}
}).catchError((err) {
DialogUtils.showErrorMessage(context, "请求发生错误", "请求服务器发生错误:${err.toString()}", btnLabel: "我知道了");
}).whenComplete(() {
BrnLoadingDialog.dismiss(context);
2025-02-20 13:23:50 +08:00
});
2025-02-22 15:56:40 +08:00
});
2025-02-20 13:23:50 +08:00
}
}
2025-02-22 15:56:40 +08:00
class EditStockInPage extends StatefulWidget {
2025-02-20 13:23:50 +08:00
final StockInDataXuGong item;
2025-02-22 15:56:40 +08:00
const EditStockInPage({super.key, required this.item});
2025-02-20 13:23:50 +08:00
@override
2025-02-22 15:56:40 +08:00
_EditStockInPageState createState() => _EditStockInPageState();
2025-02-20 13:23:50 +08:00
}
2025-02-22 15:56:40 +08:00
class _EditStockInPageState extends State<EditStockInPage> {
late TextEditingController goodsIdController;
late TextEditingController goodsNumController;
late TextEditingController goodsDescController;
late TextEditingController weightController;
late TextEditingController sizeController;
2025-02-20 13:23:50 +08:00
@override
void initState() {
super.initState();
2025-02-22 15:56:40 +08:00
goodsIdController = TextEditingController(text: widget.item.goodsId);
goodsNumController = TextEditingController(text: widget.item.goodsNum.toString());
goodsDescController = TextEditingController(text: widget.item.goodsDesc);
weightController = TextEditingController(text: widget.item.weight.toString());
sizeController = TextEditingController(text: widget.item.size);
}
@override
void dispose() {
goodsIdController.dispose();
goodsNumController.dispose();
goodsDescController.dispose();
weightController.dispose();
sizeController.dispose();
super.dispose();
}
void _saveEdits() {
// Create the updated item
StockInDataXuGong updatedItem = StockInDataXuGong(
goodsId: goodsIdController.text,
goodsNum: double.parse(goodsNumController.text),
orderNo: widget.item.orderNo, // Retain the original value
orderType: widget.item.orderType, // Retain the original value
customerName: widget.item.customerName, // Retain the original value
goodsDesc: goodsDescController.text,
weight: double.parse(weightController.text),
size: sizeController.text,
spare1: widget.item.spare1, // Retain the original value
spare2: widget.item.spare2, // Retain the original value
containerNo: widget.item.containerNo, // Retain the original value
);
// Pass the updated item back to the previous page
Navigator.of(context).pop(updatedItem);
2025-02-20 13:23:50 +08:00
}
2025-02-22 15:56:40 +08:00
2025-02-20 13:23:50 +08:00
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
2025-02-22 15:56:40 +08:00
iconTheme: const IconThemeData(color: Colors.white),
centerTitle: true,
title: const Text('编辑物料'),
2025-02-20 13:23:50 +08:00
backgroundColor: ColorCommon.colorScheme,
),
2025-02-22 15:56:40 +08:00
body: Padding(
padding: const EdgeInsets.all(16.0),
child: ListView(
2025-02-20 13:23:50 +08:00
children: [
2025-02-22 15:56:40 +08:00
TextField(
controller: goodsIdController,
decoration: const InputDecoration(labelText: '物料号'),
),
TextField(
controller: goodsNumController,
decoration: const InputDecoration(labelText: '数量'),
keyboardType: TextInputType.number,
),
TextField(
controller: goodsDescController,
decoration: const InputDecoration(labelText: '描述'),
),
TextField(
controller: weightController,
decoration: const InputDecoration(labelText: '重量 (kg)'),
keyboardType: TextInputType.number,
),
TextField(
controller: sizeController,
decoration: const InputDecoration(labelText: '尺寸'),
),
// Non-editable fields styled to look like editable ones but greyed out
TextField(
controller: TextEditingController(text: widget.item.orderNo),
decoration: const InputDecoration(labelText: "单据号"),
enabled: false,
style: TextStyle(color: Colors.grey),
),
TextField(
controller: TextEditingController(text: widget.item.orderType),
decoration: const InputDecoration(labelText: "单据类型"),
enabled: false,
style: TextStyle(color: Colors.grey),
),
TextField(
controller: TextEditingController(text: widget.item.customerName),
decoration: const InputDecoration(labelText: "客户名称"),
enabled: false,
style: TextStyle(color: Colors.grey),
),
TextField(
controller: TextEditingController(text: widget.item.containerNo),
decoration: const InputDecoration(labelText: "容器号"),
enabled: false,
style: TextStyle(color: Colors.grey),
),
TextField(
controller: TextEditingController(text: widget.item.spare1),
decoration: const InputDecoration(labelText: "备用1"),
enabled: false,
style: TextStyle(color: Colors.grey),
),
TextField(
controller: TextEditingController(text: widget.item.spare2),
decoration: const InputDecoration(labelText: "备用2"),
enabled: false,
style: TextStyle(color: Colors.grey),
),
Padding(
padding: const EdgeInsets.symmetric(vertical: 20.0),
child: ElevatedButton(
onPressed: _saveEdits,
child: const Text('保存'),
),
2025-02-20 13:23:50 +08:00
),
],
),
),
);
}
}
2025-02-22 15:56:40 +08:00