feat(client): 全模块 API 对接 + 修复登陆跳转 + 菜单 UI 优化
API 对接: - 入库/出库/库存/财务/往来单位/基础数据全部对接后端 REST API - 新增 repositories、providers、models 层,统一分层架构 - auth 从 flutter_secure_storage 迁移到 shared_preferences 登陆跳转修复: - 将 _RouterNotifier 提取为独立 Riverpod provider,appRouterProvider 使用 ref.read 避免依赖链导致 router 重建后跳回 /login - redirect 函数新增 initialized 守卫,防止 auth 未恢复时误重定向 - 添加调试日志(Router/Auth/ApiClient)定位 401 触发的 logout 链路 退出菜单 UI: - 去掉 ListTile,改用 Row + 自定义 padding,文字左对齐 - MouseRegion + AnimatedContainer 实现 hover 高亮(普通项蓝底/退出红底) - 菜单圆角 6px,elevation 8,分割线高度 1px Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,108 @@
|
||||
class StockInItem {
|
||||
final int? orderId;
|
||||
final int productId;
|
||||
final double quantity;
|
||||
final double unitPrice;
|
||||
final double totalPrice;
|
||||
final String? batchNo;
|
||||
// Denormalized for display
|
||||
final String? productName;
|
||||
final String? productCode;
|
||||
final String? productSpec;
|
||||
final String? productUnit;
|
||||
|
||||
const StockInItem({
|
||||
this.orderId,
|
||||
required this.productId,
|
||||
required this.quantity,
|
||||
required this.unitPrice,
|
||||
required this.totalPrice,
|
||||
this.batchNo,
|
||||
this.productName,
|
||||
this.productCode,
|
||||
this.productSpec,
|
||||
this.productUnit,
|
||||
});
|
||||
|
||||
factory StockInItem.fromJson(Map<String, dynamic> json) => StockInItem(
|
||||
orderId: json['order_id'] != null
|
||||
? (json['order_id'] as num).toInt()
|
||||
: null,
|
||||
productId: (json['product_id'] as num).toInt(),
|
||||
quantity: (json['quantity'] as num).toDouble(),
|
||||
unitPrice: (json['unit_price'] as num).toDouble(),
|
||||
totalPrice: (json['total_price'] as num).toDouble(),
|
||||
batchNo: json['batch_no'] as String?,
|
||||
productName: json['product_name'] as String?,
|
||||
productCode: json['product_code'] as String?,
|
||||
productSpec: json['product_spec'] as String?,
|
||||
productUnit: json['product_unit'] as String?,
|
||||
);
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
'product_id': productId,
|
||||
'quantity': quantity,
|
||||
'unit_price': unitPrice,
|
||||
'total_price': totalPrice,
|
||||
if (batchNo != null) 'batch_no': batchNo,
|
||||
};
|
||||
}
|
||||
|
||||
class StockInOrder {
|
||||
final int id;
|
||||
final String orderNo;
|
||||
final String? type;
|
||||
final int warehouseId;
|
||||
final String? warehouseName;
|
||||
final int? partnerId;
|
||||
final String? partnerName;
|
||||
final int? operatorId;
|
||||
final String status; // draft | pending | approved | rejected
|
||||
final String? orderDate;
|
||||
final double? totalAmount;
|
||||
final String? remark;
|
||||
final List<StockInItem> items;
|
||||
|
||||
const StockInOrder({
|
||||
required this.id,
|
||||
required this.orderNo,
|
||||
this.type,
|
||||
required this.warehouseId,
|
||||
this.warehouseName,
|
||||
this.partnerId,
|
||||
this.partnerName,
|
||||
this.operatorId,
|
||||
required this.status,
|
||||
this.orderDate,
|
||||
this.totalAmount,
|
||||
this.remark,
|
||||
this.items = const [],
|
||||
});
|
||||
|
||||
factory StockInOrder.fromJson(Map<String, dynamic> json) => StockInOrder(
|
||||
id: (json['id'] as num).toInt(),
|
||||
orderNo: json['order_no'] as String,
|
||||
type: json['type'] as String?,
|
||||
warehouseId: (json['warehouse_id'] as num).toInt(),
|
||||
warehouseName: json['warehouse_name'] as String?,
|
||||
partnerId: json['partner_id'] != null
|
||||
? (json['partner_id'] as num).toInt()
|
||||
: null,
|
||||
partnerName: json['partner_name'] as String?,
|
||||
operatorId: json['operator_id'] != null
|
||||
? (json['operator_id'] as num).toInt()
|
||||
: null,
|
||||
status: json['status'] as String,
|
||||
orderDate: json['order_date'] as String?,
|
||||
totalAmount: json['total_amount'] != null
|
||||
? (json['total_amount'] as num).toDouble()
|
||||
: null,
|
||||
remark: json['remark'] as String?,
|
||||
items: json['items'] != null
|
||||
? (json['items'] as List)
|
||||
.map((e) =>
|
||||
StockInItem.fromJson(e as Map<String, dynamic>))
|
||||
.toList()
|
||||
: [],
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user