大约 18 分钟
1. 库存管理
1.1. 库存管理数据库设计
前言
库存数据库表设计如下:
-- 如果存在就删除
DROP TABLE IF EXISTS t_inventory;
DROP TABLE IF EXISTS t_inventory_flow;
-- 库存表
CREATE TABLE `t_inventory` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '库存ID',
`medicine_code` varchar(50) NOT NULL COMMENT '药品编码',
`medicine_name` varchar(200) NOT NULL COMMENT '药品名字(冗余字段,方便查看)',
`batch_number` varchar(100) NOT NULL COMMENT '批次号',
`expiry_date` date NOT NULL COMMENT '有效期至',
`quantity` int(11) NOT NULL DEFAULT '0' COMMENT '当前库存数量',
`cost_price` decimal(10,2) DEFAULT NULL COMMENT '成本价(元)',
`status` tinyint(1) DEFAULT '1' COMMENT '状态(1:正常 0:冻结 -1:已销毁)',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_medicine_batch` (`medicine_code`, `batch_number`),
KEY `idx_medicine_name` (`medicine_name`), -- 新增药品名字索引
KEY `idx_expiry_date` (`expiry_date`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='库存表(含药品名字冗余)';
-- 库存流水表(含药品名字冗余)
CREATE TABLE `t_inventory_flow` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '流水ID',
`medicine_code` varchar(50) NOT NULL COMMENT '药品编码',
`medicine_name` varchar(200) NOT NULL COMMENT '药品名字(冗余字段,方便查看)',
`batch_number` varchar(100) NOT NULL COMMENT '批次号',
`operation_type` varchar(20) NOT NULL COMMENT '操作类型:入库、出库、调整',
`quantity_change` int(11) NOT NULL COMMENT '变动数量(正数为增加,负数为减少)',
`operator_name` varchar(20) NOT NULL COMMENT '操作人',
`operation_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '操作时间',
`remark` varchar(200) DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`id`),
KEY `idx_medicine_batch` (`medicine_code`, `batch_number`),
KEY `idx_medicine_name` (`medicine_name`), -- 药品名字索引
KEY `idx_time` (`operation_time`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='库存流水表(含药品名字冗余)';
INSERT INTO `t_inventory` (
`medicine_code`,
`medicine_name`,
`batch_number`,
`expiry_date`,
`quantity`,
`cost_price`,
`status`,
`create_time`
) VALUES
-- 阿莫西林胶囊 2 个批次
('YP2023001', '阿莫西林胶囊', 'BATCH202401001', '2027-01-15', 120, 9.50, 1, '2025-01-10 08:30:00'),
('YP2023001', '阿莫西林胶囊', 'BATCH202402001', '2027-02-20', 80, 9.80, 1, '2025-02-05 09:00:00'),
-- 头孢拉定胶囊 1 个批次
('YP2023002', '头孢拉定胶囊', 'BATCH202403001', '2027-03-10', 150, 6.50, 1, '2025-03-12 10:15:00'),
-- 左氧氟沙星片 1 个批次
('YP2023003', '左氧氟沙星片', 'BATCH202404001', '2025-04-18', 60, 12.00, 1, '2025-04-20 14:00:00'),
-- 阿奇霉素分散片 1 个批次
('YP2023004', '阿奇霉素分散片', 'BATCH202405001', '2026-01-19', 40, 22.00, 1, '2025-05-15 11:45:00'),
-- 硝苯地平控释片 1 个批次
('YP2023006', '硝苯地平控释片', 'BATCH202406001', '2027-06-30', 90, 28.00, 1, '2025-06-18 16:20:00'),
-- 阿司匹林肠溶片 1 个批次
('YP2023007', '阿司匹林肠溶片', 'BATCH202407001', '2027-07-22', 200, 11.00, 1, '2025-07-10 13:10:00'),
-- 奥美拉唑肠溶胶囊 1 个批次
('YP2023011', '奥美拉唑肠溶胶囊', 'BATCH202408001', '2027-08-14', 75, 18.00, 1, '2025-08-05 09:30:00'),
-- 感冒清热颗粒 1 个批次
('YP2023016', '感冒清热颗粒', 'BATCH202409001', '2027-09-01', 110, 13.00, 1, '2025-09-02 15:00:00'),
-- 板蓝根颗粒 2 个批次
('YP2023017', '板蓝根颗粒', 'BATCH202410001', '2027-10-10', 130, 9.00, 1, '2025-10-08 08:40:00'),
('YP2023017', '板蓝根颗粒', 'BATCH202411001', '2027-11-12', 95, 9.20, 1, '2025-11-01 10:00:00'),
-- 牛黄解毒片 1 个批次
('YP2023021', '牛黄解毒片', 'BATCH202412001', '2027-12-20', 180, 4.50, 1, '2025-12-05 17:00:00'),
-- 六味地黄丸 1 个批次
('YP2023026', '六味地黄丸', 'BATCH202501001', '2028-01-18', 65, 14.00, 1, '2026-01-06 09:55:00');
INSERT INTO `t_inventory_flow` (
`medicine_code`,
`medicine_name`,
`batch_number`,
`operation_type`,
`quantity_change`,
`operator_name`,
`operation_time`,
`remark`
) VALUES
-- 阿莫西林胶囊 BATCH202401001 入库
('YP2023001', '阿莫西林胶囊', 'BATCH202401001', '入库', 120, '管理员', '2025-01-10 08:35:00', '采购入库'),
-- 阿莫西林胶囊 BATCH202401001 出库
('YP2023001', '阿莫西林胶囊', 'BATCH202401001', '出库', -30, '张三', '2025-01-15 10:00:00', '门诊销售'),
-- 头孢拉定胶囊 入库
('YP2023002', '头孢拉定胶囊', 'BATCH202403001', '入库', 150, '管理员', '2025-03-12 10:20:00', '采购入库'),
-- 头孢拉定胶囊 出库
('YP2023002', '头孢拉定胶囊', 'BATCH202403001', '出库', -50, '李四', '2025-03-20 14:30:00', '住院部领用'),
-- 左氧氟沙星片 入库
('YP2023003', '左氧氟沙星片', 'BATCH202404001', '入库', 60, '管理员', '2025-04-20 14:10:00', '采购入库'),
-- 阿奇霉素分散片 入库
('YP2023004', '阿奇霉素分散片', 'BATCH202405001', '入库', 40, '管理员', '2025-05-15 11:50:00', '采购入库'),
-- 阿奇霉素分散片 出库
('YP2023004', '阿奇霉素分散片', 'BATCH202405001', '出库', -10, '王五', '2025-05-18 09:00:00', '门诊销售'),
-- 硝苯地平控释片 入库
('YP2023006', '硝苯地平控释片', 'BATCH202406001', '入库', 90, '管理员', '2025-06-18 16:25:00', '采购入库'),
-- 阿司匹林肠溶片 入库
('YP2023007', '阿司匹林肠溶片', 'BATCH202407001', '入库', 200, '管理员', '2025-07-10 13:15:00', '采购入库'),
-- 阿司匹林肠溶片 出库
('YP2023007', '阿司匹林肠溶片', 'BATCH202407001', '出库', -70, '赵六', '2025-07-12 15:00:00', '门诊销售'),
-- 奥美拉唑肠溶胶囊 入库
('YP2023011', '奥美拉唑肠溶胶囊', 'BATCH202408001', '入库', 75, '管理员', '2025-08-05 09:35:00', '采购入库'),
-- 感冒清热颗粒 入库
('YP2023016', '感冒清热颗粒', 'BATCH202409001', '入库', 110, '管理员', '2025-09-02 15:10:00', '采购入库'),
-- 板蓝根颗粒 BATCH202410001 入库
('YP2023017', '板蓝根颗粒', 'BATCH202410001', '入库', 130, '管理员', '2025-10-08 08:45:00', '采购入库'),
-- 板蓝根颗粒 BATCH202410001 出库
('YP2023017', '板蓝根颗粒', 'BATCH202410001', '出库', -20, '张三', '2025-10-12 11:00:00', '门诊销售'),
-- 板蓝根颗粒 BATCH202411001 入库
('YP2023017', '板蓝根颗粒', 'BATCH202411001', '入库', 95, '管理员', '2025-11-01 10:05:00', '采购入库'),
-- 牛黄解毒片 入库
('YP2023021', '牛黄解毒片', 'BATCH202412001', '入库', 180, '管理员', '2025-12-05 17:10:00', '采购入库'),
-- 牛黄解毒片 调整(盘盈)
('YP2023021', '牛黄解毒片', 'BATCH202412001', '调整', 5, '管理员', '2025-12-10 09:00:00', '盘点盘盈'),
-- 六味地黄丸 入库
('YP2023026', '六味地黄丸', 'BATCH202501001', '入库', 65, '管理员', '2026-01-06 10:00:00', '采购入库'),
-- 六味地黄丸 出库
('YP2023026', '六味地黄丸', 'BATCH202501001', '出库', -15, '李四', '2026-01-08 14:20:00', '门诊销售');
库存表和库存流水表以及药品表的关系如下:👇

接下来,使用MyBatisX或者AI,或者群里的文件,完成Mapper,Mapper.xml,实体类的创建:

然后参考之前的XXXDao,完成InventoryDao和InventoryFlowDao的开发:👇
public class TInventoryDao {
private SqlSessionFactory sqlSessionFactory;
public TInventoryDao() {
sqlSessionFactory = MybatisConfig.getSqlSessionFactory();
}
}
public class TInventoryFlowDao {
private SqlSessionFactory sqlSessionFactory;
public TInventoryDao() {
sqlSessionFactory = MybatisConfig.getSqlSessionFactory();
}
}
不用一次次写好,诸多方法,后期根据需求进行补充
1.2. 库存管理模块UI开发
前言
之前做过库存管理的空白模块,现在需要根据需求文档进行UI开发,提示词如下👇
TInventoryUI.java 开发需求文档(修订版)
库存数据库表设计如下:
-- 库存表
CREATE TABLE `t_inventory` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '库存ID',
`medicine_code` varchar(50) NOT NULL COMMENT '药品编码',
`medicine_name` varchar(200) NOT NULL COMMENT '药品名字',
`batch_number` varchar(100) NOT NULL COMMENT '批次号',
`expiry_date` date NOT NULL COMMENT '有效期至',
`quantity` int(11) NOT NULL DEFAULT '0' COMMENT '当前库存数量',
`cost_price` decimal(10,2) DEFAULT NULL COMMENT '成本价(元)',
`status` tinyint(1) DEFAULT '1' COMMENT '状态(1:正常 0:冻结 -1:已销毁)',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_medicine_batch` (`medicine_code`, `batch_number`),
KEY `idx_medicine_name` (`medicine_name`), -- 新增药品名字索引
KEY `idx_expiry_date` (`expiry_date`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='库存表(含药品名字冗余)';
-- 库存流水表
CREATE TABLE `t_inventory_flow` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '流水ID',
`medicine_code` varchar(50) NOT NULL COMMENT '药品编码',
`medicine_name` varchar(200) NOT NULL COMMENT '药品名字',
`batch_number` varchar(100) NOT NULL COMMENT '批次号',
`operation_type` varchar(20) NOT NULL COMMENT '操作类型:入库、出库、调整',
`quantity_change` int(11) NOT NULL COMMENT '变动数量(正数为增加,负数为减少)',
`operator_name` varchar(20) NOT NULL COMMENT '操作人',
`operation_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '操作时间',
PRIMARY KEY (`id`),
KEY `idx_medicine_batch` (`medicine_code`, `batch_number`),
KEY `idx_medicine_name` (`medicine_name`), -- 药品名字索引
KEY `idx_time` (`operation_time`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='库存流水表(含药品名字冗余)';
-- 药品表
CREATE TABLE `t_medicine` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '药品ID',
`medicine_code` varchar(50) NOT NULL COMMENT '药品编码(如"YP2023001")',
`medicine_name` varchar(200) NOT NULL COMMENT '药品通用名称',
`specification` varchar(100) DEFAULT NULL COMMENT '规格(如"0.25g*24片")',
`manufacturer` varchar(200) DEFAULT NULL COMMENT '生产企业名称',
`approval_number` varchar(100) DEFAULT NULL COMMENT '国家药监局批准文号',
`reference_price` decimal(10,2) DEFAULT NULL COMMENT '参考售价(元)',
`category_code` varchar(50) DEFAULT NULL COMMENT '所属分类编码(逻辑外键,关联 t_category.category_code)',
`status` tinyint(1) DEFAULT '1' COMMENT '状态(0-停用/1-在用)',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '记录创建时间',
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_medicine_code` (`medicine_code`),
UNIQUE KEY `uk_approval_number` (`approval_number`),
KEY `idx_category_code` (`category_code`) -- 普通索引提升按分类编码查询的性能
) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8mb4 COMMENT='药品表';
一、项目环境
• 所属模块:HomeUI.java 内容区嵌入的子界面(通过侧边栏"库存管理"菜单切换显示);
• 技术:Java Swing,风格与现有界面(UserUI、WelcomeUI、HomeUI、TMedicineUI)一致;
• 数据依赖:需加载数据(模拟从数据库查询,包含药品表t_medicine和分类表t_category的各个字段)。
二、界面设计(苹果风格:简洁、留白、色调统一、控件圆润)
1. 整体布局
采用 BorderLayout + FlowLayout + 边距控制,分区明确:
• 顶部:检索区(左:检索框+检索按钮;右:入库按钮+出库按钮);
• 中部:表格区(占满剩余空间,带滚动条);
• 整体背景白色,四周留白舒适(如 EmptyBorder(10, 10, 10, 10))。
2. 检索与操作区(顶部唯一行)
• 左侧:检索组件
• 检索输入框:宽度约 180px,提示文字"请输入药品名称/编码/批次号batch_number",无边框(或浅灰细边框),圆角(6px);
• 预警状态下拉框:宽度约 120px,下拉选项"全部"、"已过期"、"即将过期"、"低库存",默认"全部",无边框(或浅灰细边框),圆角(6px)
• 存储位置输入框:宽度约 120px,提示文字"存储位置",无边框(或浅灰细边框),圆角(6px)
• 检索按钮:文字"检索",浅灰背景(默认)、悬停加深、点击激活变色,圆角矩形,与输入框间距 8px。
• 重置按钮:文字"重置",浅灰背景(默认)、悬停加深、点击激活变色,圆角矩形,与输入框间距 8px。
• 右侧:出入库按钮组
• 入库按钮:文字"入库",样式同检索按钮(统一按钮风格),与左侧检索组件间距 16px。
• 出库按钮:文字"出库",样式同检索按钮(统一按钮风格),与入库按钮间距 8px。
• 布局:用 FlowLayout 横向排列,居中对齐,整体区域背景白色,高度约 50px(含内边距)。
3. 表格区(第二行)
• 表格组件:JTable + JScrollPane(带垂直滚动条,无水平滚动条,列宽自适应内容);
• 表头字段(按顺序):
预警状态 药品编码 药品名称 规格 批次号 有效期至 库存数量 单位 成本价 存储位置 操作
• 操作列:每行包含"查看流水"、"调整库存"、"编辑信息"3个按钮(文字按钮,样式同检索按钮,间距 2,列宽固定约 120px,按钮高度和列一致);
• 表格样式:
• 表头:浅灰背景,深灰文字,加粗,居中对齐;
• 内容行:白色背景,深灰文字,居中对齐;
• 预警状态列:彩色标签显示(已过期-红色、即将过期-橙色、低库存-黄色、正常-绿色)
• 行高:紧凑适中,隔行浅灰背景(斑马纹,提升可读性);
• 边框:表格外框浅灰细边框,单元格间无分隔线(或极浅灰分隔线,符合苹果简洁风格);
• 列宽:预警状态 80px,序号 20px,其他 100px,剩余的宽度自适应内容
• 按钮:所有的按钮通过一个方法 createButton() 统一初始化样式(如圆角、背景色、字体、边距等),避免重复代码。
三、交互与逻辑
1. 数据加载
• 定义独立方法 loadData():模拟从数据源(如 TInventoryDao)加载数据,返回 List<TInventory>,TInventory实体类在cn.yangeit.entity包下,需关联药品表和分类表数据;
• 页面初始化时自动调用 loadData() 加载数据并刷新表格;
• 检索按钮点击时,根据输入框关键词、分类、预警状态、存储位置过滤数据,调用 loadData(keyword,warningStatus,location) 重新加载并刷新表格;
• 重置按钮点击时,清空所有筛选条件,重新加载全部数据。
2. 表格初始化
• 定义独立方法 initTable():创建 DefaultTableModel(指定表头字段,操作列设为非 editable),关联 JTable,并设置表格样式(行高、对齐方式、斑马纹、预警状态列渲染器等);
• 数据加载后,将 List<TInventory> 转换为表格行数据,通过 tableModel.setDataVector() 更新表格内容。
3. 按钮交互
• 检索按钮:绑定 ActionListener,获取输入框文本、预警状态、存储位置,调用 loadData(keyword,warningStatus,location) 刷新表格;
• 重置按钮:绑定 ActionListener,清空所有筛选条件,调用 loadData() 重新加载全部数据;
• 入库按钮:绑定 ActionListener,点击后打开入库对话框,设计如下:
• 对话框标题:"药品入库"
• 表单字段:
◦ 药品选择:下拉框(加载所有药品数据,显示"药品名称(药品编码)"格式)
◦ 批次号:文本框(可手动输入,或自动生成规则:药品编码+年月日+3位序号)
◦ 有效期至:日期选择框
◦ 入库数量:数字输入框
◦ 单位:下拉框(盒、瓶、支、袋等常用单位)
◦ 成本价:数字输入框(支持小数)
◦ 存储位置:文本框
◦ 业务类型:下拉框(采购、调拨、捐赠、退货等)
◦ 业务单号:文本框(可自动生成或手动输入)
◦ 备注:多行文本框
• 按钮:底部"确认入库"和"取消"按钮
• 逻辑:选择药品后,自动填充规格、生产企业等信息(只读显示),确认后生成入库记录和库存记录
• 出库按钮:绑定 ActionListener,点击后打出入库对话框,设计如下:
• 对话框标题:"药品出库"
• 表单字段:
◦ 库存选择:下拉框(加载所有可用库存,显示"药品名称-批次号-存储位置-当前库存"格式)
◦ 药品信息区:只读显示药品编码、药品名称、规格、生产企业、成本价
◦ 出库数量:数字输入框(不能超过当前库存)
◦ 业务类型:下拉框(销售、报损、领用、调拨出库等)
◦ 业务单号:文本框
◦ 操作员:下拉框(加载用户数据,默认当前登录用户)
◦ 备注:多行文本框
• 按钮:底部"确认出库"和"取消"按钮
• 逻辑:选择库存后,自动显示药品基本信息和当前库存数量,确认后生成出库流水记录和更新库存数量
• 查看流水按钮:操作列的每行按钮绑定 ActionListener,点击时获取当前行数据,弹出流水记录对话框显示该药品该批次的出入库记录(表格展示,),记录通过loadinventoryflow(药品编码,批次号)方法获取,显示字段:流水号、业务类型、业务单号、操作员、操作时间、数量、成本价、金额、备注;
• 调整库存按钮:操作列的每行按钮绑定 ActionListener,点击时获取当前行数据,弹出调整对话框(当前数量、调整后数量、调整原因),确认后执行逻辑adjustInventory(当前先留空,仅打印日志);
• 编辑信息按钮:操作列的每行按钮绑定 ActionListener,点击时获取当前行数据(显示药品信息、批次号、有效期至、库存数量、单位、成本价、存储位置、状态),弹出对应的编辑对话框(确认和取消按钮在最下方),确认后执行逻辑save(当前先留空,仅打印日志)。
• 预警状态渲染:通过自定义 TableCellRenderer 实现预警状态的彩色标签显示;
• 要让 JTable正确显示操作列的按钮(水平布局,查看流水在左,调整库存在中,编辑信息在右),必须通过自定义 TableCellRenderer和 TableCellEditor 实现,操作列背景颜色和其他列一致;
• 出入库/删除/销毁数据完成时,会刷新数据,但容易导致角标越界异常,因此需要结合SwingUtilities.invokeLater安全操作
4. 组件命名规范
• 检索输入框:searchField;
• 分类下拉框:categoryCombo;
• 预警状态下拉框:warningStatusCombo;
• 存储位置输入框:locationField;
• 检索按钮:searchBtn;
• 重置按钮:resetBtn;
• 入库按钮:stockInBtn;
• 出库按钮:stockOutBtn;
• 表格:dataTable;
• 表格模型:tableModel;
• 滚动面板:scrollPane。
• 日期组件:使用JDatePicker组件(已经导入了Maven坐标)
四、风格一致性
• 色调:浅灰+白色为主(背景、按钮默认色),深灰文字(表头、内容),按钮悬停/激活色为深一点的浅灰(如 #E0E0E0 → #D0D0D0);
• 字体:系统无衬线字体(苹方/微软雅黑/SansSerif),表头字号 13px(加粗),内容字号 12px;
• 预警状态配色:已过期(#FF6B6B)、即将过期(#FFA726)、低库存(#FFEB3B)、正常(#4CAF50);
• 与现有界面统一:按钮样式、对话框风格、背景色与 HomeUI 侧边栏按钮、TMedicineUI 输入框保持一致。
五、输出要求
1. 提供 TInventoryUI.java 完整可运行代码(含 import、成员变量、构造方法、界面初始化、事件绑定);
2. 代码注释清晰:说明各区域作用(如"检索区""表格区")、主要方法逻辑(如 loadData() 数据加载流程、入库/出库对话框逻辑);
3. 独立方法定义:
• initTable():初始化表格模型和样式(含预警状态渲染器);
• loadData():无参,加载全部库存数据;
• loadData(String keyword,String warningStatus,String location):带参,根据条件过滤加载库存数据;
• loadMedicineData():获取所有TMedicine药品数据(仅打印日志,造几条药品测试数据);
• stockIn():执行入库操作(生成库存记录和流水记录,仅打印日志);
• stockOut():执行出库操作(生成流水记录和更新库存,仅打印日志);
• save():保存库存数据(仅打印日志);
• adjustInventory():调整库存数量(仅打印日志);
• createButton():统一创建按钮样式;
• showStockInDialog():显示入库对话框;
• showStockOutDialog():显示出库对话框。
• loadInventoryFlow():获取库存流水记录TInventoryFlow(仅打印日志);
4. 暂不实现业务逻辑(如实际数据查询、保存/删除后端交互),仅模拟数据:
• 库存测试数据 8-10 条(包含不同预警状态:已过期、即将过期、低库存、正常);
• 药品测试数据 5-8 条;
• 分类测试数据沿用TMedicineUI的分类数据;
• 用户测试数据 3-5 条;
• 前端交互(按钮点击日志打印、对话框显示、表单验证提示)。
5. 表格功能要求:
• 操作列按钮可点击,点击时打印当前行数据(如"点击查看流水:药品编码XXX,批次号XXX");
• 预警状态列显示彩色标签,不同状态不同颜色;
• 支持表格排序(点击表头按该列排序);
• 支持行选择高亮。
6. 对话框功能要求:
• 入库对话框:药品选择后自动填充相关信息,支持批次号自动生成;
• 出库对话框:库存选择后显示药品信息和当前库存,出库数量不能大于当前库存;
• 表单验证:必填字段检查,数字字段格式检查,日期有效性检查;
• 按钮状态:表单验证不通过时,确认按钮置灰不可用。
7. 核心步骤都要输出 System.out.println() 日志,方便检查,如果有异常,直接输出ex.printStackTrace() 方便在控制台查看,且代码中需要添加中文注释说明
目标:符合 JavaSE Swing 开发规范,界面美观(苹果风格)、交互流畅,数据与界面分离,便于后续扩展业务逻辑,打造专业级的库存管理界面。
将提示词和文件拖拽到tongyi中,点击“一键生成”按钮,即可生成对应的代码。

1.3 库存管理列表和检索
前言
效果图:👇 
编码技巧:👇

1.4 库存入库和出库
前言
入库
效果图:👇

编码技巧:👇

出库
效果图和代码位置:👇 
1.5 库存流水
前言
效果图:👇

编码技巧:👇

1.6 库存调整
前言
效果图:👇 
编码技巧:👇

1.7 库存编辑
前言
效果图:👇

编码技巧:👇
