Qt物料管理系统--局域网版
项目报告
项目名称 萤火虫物料管理系统
项目负责人 王XX
二O二一年 六月——二O二一年 七月
目录
目录
第一章 绪论
第二章 环境介绍
第三章 项目总体设计
第四章 数据库设计
第五章 项目介绍
第六章 重点代码
第一章 绪论
1.1背景
一个组织的运营,都需要对内部的办公用品,生产消耗物料进行台账管理,好用的ERP软件管理系统大大提高物料管理的效率和便捷性,目前市面上的大型ERP都是收费软件,对于功能需求不是太强,刚起步的小组织来说采用收费ERP系统开销较大,而接下来的萤火虫物料管理系统设计就是为了帮助中小组成设计一个开源的精简版ERP,免费提供给需要服务的用户。本系统追求的是算法优化、代码精简、界面简洁优雅、操作简单、实用。
第二章 环境介绍
2.1硬件环境
本系统可以运行在windows版的个人台式机、笔记本上。
2.2软件环境
本系统仅可以运行在window8/window10系统上。
第三章 项目总体设计
3.1功能列表
序号 功能 描述
1 用户管理 添加、修改、删除用户
2 商品管理 完善商品的基本信息
3 进货管理 进货处理
4 库存管理 库存查询、导出
5 出库管理 出库处理
6 生产库存管理 生产临时库存管理
3.2各管理模块功能需求
3.2.1用户管理模块功能介绍
1>新增用户
根据输入的用户名、用户密码、权限分配新增用户
2>删除用户
删除已启用的用户
3>修改用户
根据需求修改用户的密码、权限等级
3.2.2商品管理模块功能介绍
1>新增物料,完善物料的基本信息
2>修改物料信息,根据实际物料信息的变化,及时修改物料信息
3>删除物料,根据实际需求,删除已经弃用的物料
4>新增物料类别,根据实际需要,新增/删除物料类别列表
3.2.3进货管理模块功能介绍
1>进货,已完善基本的信息的物料可以根据实际采购进度,将其录入到采购库存
2>如果库存中的物料价格与后进物料价格不一致,需先将库存中的物料出库操作再进行新物料入库操作
3.2.4库存管理模块功能介绍
1>查看当前采购库存中的所有物料
2>以EXCEL格式导出整个采购库存或筛选后的库存
3.2.5出库管理模块功能介绍
1>根据实际需要,从库存选取合适的物料入库
2>删除当前准备出库的物料信息
3>清空当前所有准备出库的物料信息
第四章 数据库设计
4.1表格关系
本系统为了显示方便,每个表格都比较独立,都是以同一ID作为主键,本系统用的数据库是Qt版sqlite
4.1.1用户表格
4.1.2商品信息表格
4.1.3商品类别表格
4.1.4商品库存表格
4.1.5生产库存表格
项目介绍
5.1登录界面
5.2出库界面
5.3出库明细界面
5.4添加商品类别界面
5.5商品信息界面
5.6进货管理界面
5.7库存管理界面
5.8用户管理界面
5.9生产库存管理界面
第六章 关键代码详解
6.1创建数据库
loginwindow.cpp
//创建数据库句柄
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setUserName("material"); //数据库户名和密码
db.setPassword("11223344");
//设置数据库名称,用户名, 密码
db.setDatabaseName("my.db");
//打开数据库
if(!db.open())
{
qDebug() << db.lastError().text(); //输出错误信息
}
//创建数据库--用户表格,执行创建表格语句 唯一用户
QString sql = "create table USER(user varchar(125) primary key, password varchar(256), limits varchar(15),loginTime varchar(125));";
QSqlQuery query;
if(!query.exec(sql))
{
qDebug() << query.lastError().text();
}
//创建数据库--库存表格,执行创建表格语句 唯一用户 //, num int, sum varchar(256)
sql = "create table GOODS(goodsID integer primary key, goodsName varchar(135), goodsClass varchar(35),"
" goodsModel varchar(35), goodsNum int, goodsUnit varchar(35), goodsPrice float(4,3),goodsSupplier varchar(256), goodsNote varchar(256));";
if(!query.exec(sql))
{
qDebug() << query.lastError().text();
}
//创建数据库--商品表格,执行创建表格语句 唯一用户
sql = "create table MGOODS(goodsID int primary key, goodsClass varchar(15),goodsName varchar(125), "
"goodsPrice float(4,3), goodsModel varchar(15),goodsUnit varchar(15), goodsSupplier varchar(256), goodsNote varchar(256));";
if(!query.exec(sql))
{
qDebug() << query.lastError().text();
}
//创建数据库--进货订单表格,执行创建表格语句 唯一用户
sql = "create table ORD(orderID varchar(35), stockTime date not null, supplier varchar(35), stockSum float(3,7), worker varchar(35), stockNote varchar(35));";
if(!query.exec(sql))
{
qDebug() << query.lastError().text();
}
//创建数据库--进货订单明细表格,执行创建表格语句 唯一用户
sql = "create table DETAIL(orderID varchar(35), goodsID integer, goodsName varchar(35), goodsSupplier varchar(135), goodsNum int);";
if(!query.exec(sql))
{
qDebug() << query.lastError().text();
}
//创建数据库--类型表格,执行创建表格语句 唯一用户
sql = "create table TYPE(type varchar(25));";
if(!query.exec(sql))
{
qDebug() << query.lastError().text();
}
//创建数据库--出库订单表格,执行创建表格语句 唯一用户
sql = "create table OUTORD(orderID varchar(35), worker varchar(35), outBoundTime date not null, outNum integer, outSum float(3,7), outNote varchar(35));";
if(!query.exec(sql))
{
qDebug() << query.lastError().text();
}
//创建数据库--商品表格,执行创建表格语句 唯一用户
sql = "create table OUTORDDETAIL(orderID varchar(35),goodsID integer, goodsName varchar(125), "
" goodsModel varchar(15),goodsPrice float(4,3), outNum integer);";
if(!query.exec(sql))
{
qDebug() << query.lastError().text();
}
//创建数据库--生产库存表格,执行创建表格语句 唯一用户
sql = "create table PDSTORE(goodsID int, goodsName varchar(125), goodsClass varchar(15), "
" goodsModel varchar(15), goodsNum integer);";
if(!query.exec(sql))
{
qDebug() << query.lastError().text();
}
//创建数据库--生产库存表格,执行创建表格语句 唯一用户
sql = "create table PDOUTTB(goodsID int, goodsName varchar(125), goodsModel varchar(15), goodsNum integer, outBoundTime date not null, goodsNote varchar(256));";
if(!query.exec(sql))
{
qDebug() << query.lastError().text();
}
6.2.2登录代码
loginwindow.cpp
//登录
void LoginWindow::on_pushButton_login_clicked()
{
QString username = ui->userlineEdit->text();
QString password = ui->passwordlineEdit->text();
QString curDateTime = QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss");
QString sql = QString("select * from USER where user = '%1' and password = '%2'")
.arg(username).arg(password);
QSqlQuery query;
if(!query.exec(sql))
{
qDebug() << query.lastError().text();
return;
}
//查询
if(query.next())
{
qDebug() << "查到数据";
QSqlRecord record = query.record();
this->hide(); //隐藏窗口
//显示主窗口
YHQManagementSystemWin *w = new YHQManagementSystemWin();
w->show();
/* 获取当前用户 */
w->worker = record.value("user").toString();
w->limits = record.value("limits").toString();
delete this;
//更新用户登录时间
QString update = QString("update USER set loginTime = '%1' where user = '%2'").arg(curDateTime).arg(username);
query.exec(update);
if(!query.exec(update))
{
qDebug() << query.lastError().text();
return;
}
}else
{
qDebug()<< "未查询到数据";
QMessageBox::warning(this, "提示" , "登录失败!");
}
}
6.3主应用
6.3.1功能选择代码
yhqmanagementsystemwin.cpp
//功能界面选择函数
void YHQManagementSystemWin::on_treeWidget_itemClicked(QTreeWidgetItem *item, int column)
{
if(item->text(column) == "出库")
{
if((this->limits=="1") | (this->limits=="2"))
{
showOutStockSlot();
}
}else if (item->text(column) == "出库明细") {
if((this->limits=="1") | (this->limits=="2"))
{
showOutBoundSlot();
}
}else if (item->text(column) == "商品信息") {
showGoodsPageSlot();
}
else if (item->text(column) == "商品类别") {
showAddTypeSlot();
}
else if (item->text(column) == "进货处理") {
if((this->limits=="1") | (this->limits=="2"))
{
showStockSlot();
}
}
else if (item->text(column) == "库存管理") {
qDebug() << "库存管理";
showStoreSlot();
}
else if (item->text(column) == "用户管理") {
if(this->limits=="1")
{
showUserTable();
}
}
else if (item->text(column) == "首页") {
ui->stackedWidget->setCurrentIndex(5); //跳转到出库管理界面
}
else if (item->text(column) == "生产库存") {
showPDTable();
}
else {
}
}
6.3.2出库管理代码
yhqmanagementsystemwin.cpp
//显示出库管理界面
void YHQManagementSystemWin::showOutStockSlot()
{
qDebug() << "显示出库管理界面";
ui->stackedWidget->setCurrentIndex(4); //跳转到出库管理界面
QStringList headTextList;
headTextList.push_back(QString("编号"));
headTextList.push_back(QString("商品名称"));
headTextList.push_back(QString("分类"));
headTextList.push_back(QString("规格"));
headTextList.push_back(QString("库存量"));
headTextList.push_back(QString("单位"));
headTextList.push_back(QString("单价"));
headTextList.push_back(QString("出库量"));
headTextList.push_back(QString("金额"));
//设置行列数(只有列存在的前提下,才可以设置列标签)
int HlableCnt = headTextList.count();
ui->outStockTable->setColumnCount(HlableCnt);
//表头设置
QTableWidgetItem *headerItem;
for(int i=0; i<ui->outStockTable->columnCount(); i++)
{
headerItem = new QTableWidgetItem(headTextList.at(i));
//获取原有字体设置
QFont font = headerItem->font();
//设置为粗体
font.setBold(true);
//设置字体大小
font.setPointSize(11);
//设置字体颜色
headerItem->setForeground(QBrush(QColor(qRgb(60,60, 60))));
//应用字体设置
headerItem->setFont(font);
//对每个单元格进行设置
ui->outStockTable->setHorizontalHeaderItem(i, headerItem);
}
//不显示序号
ui->outStockTable->verticalHeader()->hide();
//设置整行选中
ui->outStockTable->setSelectionBehavior(QAbstractItemView::SelectRows);
//获取库存数据库所有的ID
QStringList idList;
QString sql = QString("SELECT goodsID FROM GOODS");
QSqlQuery query;
query.exec(sql);
if(!query.exec(sql))
{
qDebug() <<query.lastError().text();
return;
}
//查询
while (query.next()) {
//将查询到的所有ID号放入qstringList列表中
idList << query.value(0).toString();
}
qDebug() << "所有ID:" << idList;
//设置ID搜索自动补全
QCompleter *completer = new QCompleter(idList, this);
ui->outStockIDlineEdit->setCompleter(completer);
//生成订单号
//设置随机数种子
qsrand(QTime(0, 0, 0).secsTo(QTime::currentTime()));
//生成随机数
int rand = qrand()%899 + 100; //加100是为了让随机数一直为3位数,便于对齐
// qDebug() << "生成的随机数:" << rand;
//生成订单号
QString str = QDateTime::currentDateTime().toString("yyMMddhhmmss")
+ QString::number(rand);
//将订单号写入输入栏
ui->outBoundOrdEdit->setText(str);
}
//出库管理--显示出库明细界面
void YHQManagementSystemWin::showOutBoundSlot()
{
qDebug() << "显示出库明细界面";
ui->stackedWidget->setCurrentIndex(6); //跳转到出库明细界面
//初始化数据表格模型
outBoundOrdermodel = new MySqlTableModel(this);
//绑定数据
outBoundOrdermodel->setTable("OUTORD");
//查询数据
outBoundOrdermodel->select();
//设置表水平头显示
outBoundOrdermodel->setHeaderData(0, Qt::Horizontal, "出库单号");
outBoundOrdermodel->setHeaderData(1, Qt::Horizontal, "处理者");
outBoundOrdermodel->setHeaderData(2, Qt::Horizontal, "出库时间");
outBoundOrdermodel->setHeaderData(3, Qt::Horizontal, "数量");
outBoundOrdermodel->setHeaderData(4, Qt::Horizontal, "金额");
outBoundOrdermodel->setHeaderData(5, Qt::Horizontal, "备注");
//模型与视图绑定
ui->outBoundOrdertableView->setModel(outBoundOrdermodel);
//设置表格不可编辑
ui->outBoundOrdertableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
//不显示序号
ui->outBoundOrdertableView->verticalHeader()->hide();
//设置表格宽度
ui->outBoundOrdertableView->setColumnWidth(0, 150);
//最后一行是否铺满剩余空间
ui->outBoundOrdertableView->horizontalHeader()->setStretchLastSection(true);
//窗体无边框
ui->outBoundOrdertableView->setFrameShape(QFrame::NoFrame);
// 初始化日期
ui->enddateEdit_2->setDate(QDate::currentDate());
ui->startdateEdit_2->setDate(QDate::currentDate().addDays(-7));
/********************************************************************/
//订单明细表格
//初始化数据表格模型
outBoundOrderDetailmodel = new MySqlTableModel(this);
//绑定数据
outBoundOrderDetailmodel->setTable("OUTORDDETAIL");
//查询数据
outBoundOrderDetailmodel->select();
//设置表水平头显示
outBoundOrderDetailmodel->setHeaderData(0, Qt::Horizontal, "出库单号");
outBoundOrderDetailmodel->setHeaderData(1, Qt::Horizontal, "商品编号");
outBoundOrderDetailmodel->setHeaderData(2, Qt::Horizontal, "商品名称");
outBoundOrderDetailmodel->setHeaderData(3, Qt::Horizontal, "规格");
outBoundOrderDetailmodel->setHeaderData(4, Qt::Horizontal, "单价");
outBoundOrderDetailmodel->setHeaderData(5, Qt::Horizontal, "商品数量");
//模型与视图绑定
ui->outBoundorderDetailtableView->setModel(outBoundOrderDetailmodel);
//设置表格不可编辑
ui->outBoundorderDetailtableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
//不显示序号
ui->outBoundorderDetailtableView->verticalHeader()->hide();
//设置表格宽度
ui->outBoundorderDetailtableView->setColumnWidth(0, 150);
//最后一行是否铺满剩余空间
ui->outBoundorderDetailtableView->horizontalHeader()->setStretchLastSection(true);
//窗体无边框
ui->outBoundorderDetailtableView->setFrameShape(QFrame::NoFrame);
}
//出库管理界面--确定键
void YHQManagementSystemWin::on_checkBtn_clicked()
{
QString goodsID = ui->outStockIDlineEdit->text();
QString select = QString("select * from GOODS where goodsID = '%1'").arg(goodsID);
QSqlQuery query;
query.exec(select);
if(!query.exec(select))
{
qDebug() << query.lastError().text();
}
//查询
if(query.next())
{
qDebug() << "查询成功";
}else {
qDebug() << "未查询到数据";
return;
}
//查询到的记录信息
QStringList goodsMsgList;
float price ;
QString price_str;
QSqlRecord record = query.record();
price = record.value("goodsPrice").toFloat();
price_str = QString::number(price, 'f', 3);
goodsMsgList << record.value("goodsID").toString()
<< record.value("goodsName").toString()
<< record.value("goodsClass").toString()
<< record.value("goodsModel").toString()
<< record.value("goodsNum").toString()
<< record.value("goodsUnit").toString()
<< price_str;
//将查询到的商品信息添加到出库列表显示
QString str;
QString ID;
QString Name;
QString Class;
QString Model;
QString Num;
QString Unit;
QString Price;
QString OutNum;
QString TotalPic;
float totalPic = 0.00;
for(int i=0; i<goodsMsgList.size(); i++)
{
str = goodsMsgList.at(i);
switch (i) {
case 0:
ID = str;
break;
case 1:
Name = str;
break;
case 2:
Class = str;
break;
case 3:
Model = str;
break;
case 4:
Num = str;
break;
case 5:
Unit = str;
break;
case 6:
Price = str;
break;
case 7:
break;
default:
break;
}
}
/* 新增出库数量 */
OutNum = ui->outStockNumspinBox->text();
//判断当前表格是否已经有该ID号的商品
int curRow = ui->outStockTable->rowCount();//获取当前表格总行数
QString existID;
//为一行的单元格创建Items
QTableWidgetItem *outStockitem;
if(curRow >0)
{
for(int i=0; i<curRow; i++)
{
existID = ui->outStockTable->item(i, 0)->text();
if(ID == existID)
{
int num = ui->outStockTable->item(i,7)->text().toInt();
//同ID相加后数量num, 不大于库存量
num += OutNum.toInt();
if(num > Num.toInt())
{
num = Num.toInt();
}
/* 金额相加后totalPic */
// float existTotalPic = ui->outStockTable->item(i, 8)->text().toFloat();
/* 新的总金额=原有金额+增加金额 */
totalPic = price*num;
TotalPic = QString::number(totalPic, 'f', 2);
//修改当前行row-1商品数量
outStockitem = new QTableWidgetItem(QString::number(num), 0);
outStockitem->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); //文本对齐方式
ui->outStockTable->setItem(i, YHQManagementSystemWin::outStockcolNum, outStockitem); //为单元格设置item
//修改当前行row-1商品金额
outStockitem = new QTableWidgetItem(QString::number(totalPic, 'f', 2), 0);
outStockitem->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); //文本对齐方式
ui->outStockTable->setItem(i, YHQManagementSystemWin::outStockcolTotalPic, outStockitem); //为单元格设置item
//更新总出库数量
outStockSum();
//初始化spinBox数量
ui->outStockNumspinBox->setValue(1);
//退出该函数
return;
}
}
}
ui->outStockTable->insertRow(curRow); //在表格尾部添加一行/*要先插入一行空行,否则无法添加数据*/
//商品ID
outStockitem = new QTableWidgetItem(ID, 0);
outStockitem->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); //文本对齐方式
ui->outStockTable->setItem(curRow, YHQManagementSystemWin::outStockcolID, outStockitem); //为单元格设置item
//商品名称
outStockitem = new QTableWidgetItem(Name, 0);
outStockitem->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); //文本对齐方式
ui->outStockTable->setItem(curRow, YHQManagementSystemWin::outStockcolName, outStockitem); //为单元格设置item
//商品类别
outStockitem = new QTableWidgetItem(Class, 0);
outStockitem->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); //文本对齐方式
ui->outStockTable->setItem(curRow, YHQManagementSystemWin::outStockcolClass, outStockitem); //为单元格设置item
//商品型号
outStockitem = new QTableWidgetItem(Model, 0);
outStockitem->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); //文本对齐方式
ui->outStockTable->setItem(curRow, YHQManagementSystemWin::outStockcolModel, outStockitem); //为单元格设置item
//商品数量
outStockitem = new QTableWidgetItem(Num, 0);
outStockitem->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); //文本对齐方式
ui->outStockTable->setItem(curRow, YHQManagementSystemWin::StockcolNum, outStockitem); //为单元格设置item
//商品单位
outStockitem = new QTableWidgetItem(Unit, 0);
outStockitem->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); //文本对齐方式
ui->outStockTable->setItem(curRow, YHQManagementSystemWin::outStockcolUnit, outStockitem); //为单元格设置item
//商品进价
outStockitem = new QTableWidgetItem(Price, 0);
outStockitem->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); //文本对齐方式
ui->outStockTable->setItem(curRow, YHQManagementSystemWin::outStockcolPrice, outStockitem); //为单元格设置item
//出库数量
int num = Num.toInt();
if(OutNum.toInt() > num)
{
OutNum = Num;
}
outStockitem = new QTableWidgetItem(OutNum, 0);
outStockitem->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); //文本对齐方式
ui->outStockTable->setItem(curRow, YHQManagementSystemWin::outStockcolNum, outStockitem); //为单元格设置item
ui->outStockNumspinBox->setValue(1);
qDebug() << "第一次出库的数量:" << OutNum;
//出库金额
totalPic = price*OutNum.toInt();
TotalPic = QString::number(totalPic, 'f', 3);
outStockitem = new QTableWidgetItem(TotalPic, 0);
outStockitem->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); //文本对齐方式
ui->outStockTable->setItem(curRow, YHQManagementSystemWin::outStockcolTotalPic, outStockitem); //为单元格设置item
//更新总出库数量
outStockSum();
}
//获取出库总数量和总金额
void YHQManagementSystemWin::outStockSum()
{
int Sum2 = 0;
float totalPic = 0.00;
//获取当前表格行数
int row = ui->outStockTable->rowCount();
for(int i=0; i<row; i++)
{
Sum2 += ui->outStockTable->item(i, 7)->text().toInt();
totalPic += ui->outStockTable->item(i, 8)->text().toFloat();
}
//更新出库总量标签
ui->stockNumLab->setText(QString("出库量:%1").arg(QString::number(Sum2)));
//更新出库总金额标签
ui->stockSumLab->setText(QString("总金额:%1").arg(QString::number(totalPic, 'f', 2)));
}
//出库管理界面--出库按钮--将当前表格中对应的ID商品数量从库存表格中减去
void YHQManagementSystemWin::on_stockOutBtn_clicked()
{
QString existID;
QString Num;
QString name;
QString model;
QMap <QString, QString> map;
int curRow = ui->outStockTable->rowCount();//获取当前表格总行数
qDebug() << "当前行号:" <<curRow;
//当表格有数据时--将数据保存到字典中
if(curRow >0)
{
for(int i=0; i<curRow; i++)
{
existID = ui->outStockTable->item(i, 0)->text();
Num = ui->outStockTable->item(i, 7)->text();
name = ui->outStockTable->item(i, 1)->text();
model = ui->outStockTable->item(i, 3)->text();
qDebug() << "需要入库的ID:" << existID;
qDebug() << "需要入库的Num:" << Num;
map.insert(existID, Num);
}
qDebug() << "字典数据:" << map;
//当表格有数据时--将数据保存到库存表格中
//创建迭代器遍历map中所有的键:值
QMapIterator<QString, QString> i(map);
int exitNumData = 0; //初始化已存在库存
QString exitNumStr;
QString goodsNum;
QSqlQuery query;
while (i.hasNext()) {
i.next();
qDebug() << i.key() << ": " << i.value();
//根据ID获取GOODS表格的数据
QString select = QString("select * from GOODS where goodsID = '%1'").arg(i.key());
query.exec(select);
if(!query.exec(select))
{
qDebug() << query.lastError().text();
}
//查询
if(query.next())
{
qDebug() << "查询成功";
}
else {
qDebug() << "未查询到数据";
return;
}
//更新后的库存数量
goodsNum = i.value();
qDebug() << "需出库量:" << goodsNum;
QSqlRecord record = query.record();
exitNumStr = record.value("goodsNum").toString();
qDebug() << "已有库存量2:"<< exitNumStr;
exitNumData = exitNumStr.toInt();
exitNumData -= i.value().toInt();
qDebug() << "更新后库存数量1:" << exitNumData;
QString update;
if(exitNumData <=0)
{
qDebug() << "删除库存";
update = QString("delete from GOODS where goodsID = '%1'").arg(i.key());
}else {
update = QString("update GOODS set goodsNum = '%1' where goodsID = '%2'").arg(QString::number(exitNumData)).arg(i.key());
}
//执行修改数量
query.exec(update);
if(!query.exec(update))
{
qDebug() << query.lastError().text();
}
qDebug() << "修改成功";
//将出库的数量添加到生产库存
addNumToPDStore(i.key(), goodsNum.toInt());
continue;
}
qDebug() << "添加成功";
addOutBoundOrder(); //写入出库订单表格
addOutBoundDetal(); //写入出库订单明细
}
//清空除表头外所有数据
for(int i=curRow; i>=0; i--)
{
ui->outStockTable->removeRow(i);
}
}
mysqltablemodel.h
#ifndef MYSQLTABLEMODEL_H
#define MYSQLTABLEMODEL_H
#include <QSqlTableModel>
#include <QtSql>
class MySqlTableModel : public QSqlTableModel
{
Q_OBJECT
public:
explicit MySqlTableModel(QObject *parent = nullptr,QSqlDatabase db = QSqlDatabase());
// explicit MySqlTableModel(QObject *parent=0);
QVariant data(const QModelIndex &idx, int role) const override;
};
#endif // MYSQLTABLEMODEL_H
mysqltablemodel.cpp
#include "mysqltablemodel.h"
#include <QColor>
#include <QFont>
MySqlTableModel::MySqlTableModel(QObject *parent, QSqlDatabase db) : QSqlTableModel(parent, db)
{
}
QVariant MySqlTableModel::data(const QModelIndex &index, int role) const
{
QVariant value = QSqlTableModel::data(index,role);
if(role == Qt::TextAlignmentRole)
{
value = int(Qt::AlignCenter | Qt::AlignHCenter); //设置文本对齐方式
return value;
}
if(Qt::ForegroundRole == role)
{
/* 根据客户需求,取消颜色显示
if(0 == index.column())
return QVariant(QColor(255,144,144)); //第几列--设置颜色
*/
}
if(Qt::FontRole == role)
{
if(0 == index.column())
{
QFont font;
font.setBold(false); //取消粗体设置
return QVariant(font); //第几列--设置粗体
}
}
if(role==Qt::DisplayRole && index.column()==2)
{
// value=((value.toInt()==0)?"饮料":"零食");
//qDebug()<<value.toInt();
return value;
}
if(role==Qt::DisplayRole && index.column()==3)
{
// value=value.toString().mid(0,2); //切割字符串
return value;
}
else
return QSqlTableModel::data(index, role);
}
stock.h
#ifndef STOCK_H
#define STOCK_H
#include <QWidget>
#include <QSqlTableModel>
#include <QTableView>
#include <QSqlDatabase>
#include <QDebug>
#include <QSqlError>
#include <QSqlQuery>
#include <QSqlRecord>
#include <QMessageBox>
namespace Ui {
class Stock;
}
class Stock : public QWidget
{
Q_OBJECT
public:
explicit Stock(QWidget *parent = nullptr);
~Stock();
void addOrder();
void addOrderDetail();
private slots:
void on_stkaddBtn_clicked();
void on_stkDelBtn_clicked();
void on_stkCheckBtn_clicked();
void on_stkCancleBtn_clicked();
private:
Ui::Stock *ui;
//各字段在表格中的列号
enum FileColNum{colID=0, colName, colNum, colPrice, colSupplier};
QSqlTableModel *stockmodel;
QSqlTableModel *storemodel;
};
#endif // STOCK_H
stock.cpp
#include "stock.h"
#include "ui_stock.h"
#include <QAbstractItemView>
#include <QCompleter>
#include <QTableWidget>
#include <QTime>
#include <QDate>
Stock::Stock(QWidget *parent) :
QWidget(parent),
ui(new Ui::Stock)
{
ui->setupUi(this);
//隐藏标题栏
// this->setWindowFlag(Qt::FramelessWindowHint);
//设置窗口标题
this->setWindowTitle("进货处理");
QStringList headTextList;
headTextList.push_back(QString("商品ID"));
headTextList.push_back(QString("商品名称"));
headTextList.push_back(QString("商品数量"));
headTextList.push_back(QString("商品单价"));
headTextList.push_back(QString("供应商"));
//设置行列数(只有列存在的前提下,才可以设置列标签)
int HlableCnt = headTextList.count();
ui->tableWidget->setColumnCount(HlableCnt);
//设置行数
// ui->tableWidget->setRowCount(2);
//设置列标签
// ui->tableWidget->setHorizontalHeaderLabels(headTextList); //方法一
#if 1 //方法二
QTableWidgetItem *headerItem;
for(int i=0; i<ui->tableWidget->columnCount(); i++)
{
headerItem = new QTableWidgetItem(headTextList.at(i));
QFont font = headerItem->font(); //获取原有字体设置
font.setBold(true); //设置为粗体
font.setPointSize(10); //设置字体大小
// headerItem->setTextColor(Qt::red); //设置字体颜色
// headerItem->setTextColor(QColor(qRgb(60,60, 60)));
headerItem->setForeground(QBrush(QColor(qRgb(60,60, 60))));
headerItem->setFont(font); //应用字体设置
ui->tableWidget->setHorizontalHeaderItem(i, headerItem);
}
#endif
//将tableWidget表格设置为不可编辑模式
ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
//不显示序号
ui->tableWidget->verticalHeader()->hide();
//设置最后一栏铺满
ui->tableWidget->horizontalHeader()->setStretchLastSection(true);
//设置整行选中
ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
//设置列宽
// ui->tableWidget->setColumnWidth(0, 80);
// ui->tableWidget->setColumnWidth(1, 80);
// ui->tableWidget->setColumnWidth(2, 80);
// ui->tableWidget->setColumnWidth(3, 80);
// ui->tableWidget->setColumnWidth(4, 80);
//获取数据库所有的ID
QStringList idList;
QString sql = QString("SELECT goodsID FROM MGOODS");
QSqlQuery query;
query.exec(sql);
if(!query.exec(sql))
{
qDebug() <<query.lastError().text();
return;
}
//查询
while (query.next()) {
//将查询到的所有ID号放入qstringList列表中
idList << query.value(0).toString();
}
qDebug() << "所有ID:" << idList;
//设置ID搜索自动补全
QCompleter *completer = new QCompleter(idList, this);
ui->stkIDEdit->setCompleter(completer);
//生成订单号
//设置随机数种子
qsrand(QTime(0, 0, 0).secsTo(QTime::currentTime()));
//生成随机数
int rand = qrand()%899 + 100; //加100是为了让随机数一直为3位数,便于对齐
qDebug() << "生成的随机数:" << rand;
//生成订单号
QString str = QDateTime::currentDateTime().toString("yyMMddhhmmss")
+ QString::number(rand);
//将订单号写入输入栏
ui->orderNumberEdit->setText(str);
//更新进货日期
ui->dateEdit->setDate(QDate::currentDate());
}
Stock::~Stock()
{
delete ui;
}
//将搜索到的商品信息添加到准备入库列表
void Stock::on_stkaddBtn_clicked()
{
QString goodsID = ui->stkIDEdit->text();
QString select = QString("select * from MGOODS where goodsID = '%1'").arg(goodsID);
QSqlQuery query;
query.exec(select);
if(!query.exec(select))
{
qDebug() << query.lastError().text();
}
//查询
if(query.next())
{
qDebug() << "查询成功";
int result = QMessageBox::question(this, "提示", "新增物料价格是否需要更改?",QMessageBox::Yes | QMessageBox::No);
// qDebug() << "result:" << result;
if(result == QMessageBox::No)
{
qDebug () << "继续";
}else if (result == QMessageBox::Yes) {
qDebug () << "退出";
return;
}
}else {
qDebug() << "未查询到数据";
return;
}
//查询到的记录信息
QStringList goodsMsgList;
float price ;
QString price_str;
QSqlRecord record = query.record();
price = record.value("goodsPrice").toFloat();
price_str = QString::number(price, 'f', 3);
// qDebug() << "商品价格:" << price << "**" << price_str;
// qDebug() << "goodsID:" << record.value("goodsID").toString();
goodsMsgList << record.value("goodsID").toString() << record.value("goodsName").toString()
<< record.value("goodsNum").toString()
<< price_str
<< record.value("goodsSupplier").toString();
qDebug() << "商品信息列表内容:" << goodsMsgList;
//将查询到对应ID的商品信息填入准备入库表格
//为一行的单元格创建Items
QTableWidgetItem *item;
QString str;
QString ID;
QString Name;
QString Num;
QString Price;
QString Supplier;
for(int i=0; i<goodsMsgList.size(); i++)
{
str = goodsMsgList.at(i);
switch (i) {
case 0:
ID = str;
break;
case 1:
Name = str;
break;
case 2:
Num = ui->stkNumspinBox->text();
break;
case 3:
Price = str;
break;
case 4:
Supplier = str;
break;
default:
break;
}
}
//判断当前表格是否已经有该ID号的商品
int curRow = ui->tableWidget->rowCount();//获取当前表格总行数
QString existID;
qDebug() << "当前行号:" <<curRow;
if(curRow >0)
{
qDebug() << ui->tableWidget->item(curRow-1, 0)->text();
for(int i=0; i<curRow; i++)
{
existID = ui->tableWidget->item(i, 0)->text();
if(ID == existID)
{
qDebug() << "已存在相同ID" << "对应行号为:" << i;
int num = ui->tableWidget->item(i,2)->text().toInt();
num += Num.toInt();
qDebug() << "相加后数量为:" <<num;
//修改当前行row-1商品数量
item = new QTableWidgetItem(QString::number(num), 0);
item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); //文本对齐方式
ui->tableWidget->setItem(i, Stock::colNum, item); //为单元格设置item
//退出该函数
return;
}
}
}
ui->tableWidget->insertRow(curRow); //在表格尾部添加一行/*要先插入一行空行,否则无法添加数据*/
//商品ID
item = new QTableWidgetItem(ID, 0);
item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); //文本对齐方式
ui->tableWidget->setItem(curRow, Stock::colID, item); //为单元格设置item
//商品名称
item = new QTableWidgetItem(Name, 0);
item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); //文本对齐方式
ui->tableWidget->setItem(curRow, Stock::colName, item); //为单元格设置item
//商品数量
item = new QTableWidgetItem(Num, 0);
item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); //文本对齐方式
ui->tableWidget->setItem(curRow, Stock::colNum, item); //为单元格设置item
//商品进价
item = new QTableWidgetItem(Price, 0);
item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); //文本对齐方式
ui->tableWidget->setItem(curRow, Stock::colPrice, item); //为单元格设置item
//供应商
item = new QTableWidgetItem(Supplier, 0);
item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); //文本对齐方式
ui->tableWidget->setItem(curRow, Stock::colSupplier, item); //为单元格设置item
}
//将当前选中的行删除
void Stock::on_stkDelBtn_clicked()
{
int row = ui->tableWidget->currentRow();
qDebug() << "当前选中的行为:" << row;
//如果当前表格除表头外还有数据
if(row >= 0)
{
ui->tableWidget->removeRow(row);
}
}
//确认键--将准备入库列表中的数据写入库存表格中
void Stock::on_stkCheckBtn_clicked()
{
QString existID;
QString Num;
QString Supplier;
// QStringList goodsIDList;
// QStringList goodsNumList;
QMap <QString, QString> map;
int curRow = ui->tableWidget->rowCount();//获取当前表格总行数
qDebug() << "当前行号:" <<curRow;
//当表格有数据时--将数据保存到库存表格中
if(curRow >0)
{
for(int i=0; i<curRow; i++)
{
existID = ui->tableWidget->item(i, 0)->text();
Num = ui->tableWidget->item(i, 2)->text();
Supplier= ui->tableWidget->item(i, 4)->text();
qDebug() << "需要入库的ID:" << existID;
qDebug() << "需要入库的Num:" << Num;
qDebug() << "需要入库的Supplier:" << Supplier;
map.insert(existID, Num);
}
qDebug() << "字典数据:" << map;
// qDebug() << "字典键值对数量:" << map.count();
// qDebug() << "字典中第一对键值对的key:" << map.first();
//将字典内容写入库存表格
//初始化库存表格模型
storemodel = new QSqlTableModel(this);
//绑定表格
storemodel->setTable("GOODS");
//查询数据--将表格中的数据提取放入模型中
storemodel->select();
//创建一条数据记录--根据当前表格创建(才知道有 哪些字段)
QSqlRecord record = storemodel->record();
//创建迭代器遍历map中所有的键:值
QMapIterator<QString, QString> i(map);
int exitNumData = 0; //初始化已存在库存
// int storeRecordNum = 0;
QString exitNumStr;
QString goodsNum;
QSqlQuery query;
QSqlRecord store_record;
QString store_select;
while (i.hasNext()) {
i.next();
qDebug() << i.key() << ": " << i.value();
// record.setValue("goodsID", i.key());
// record.setValue("goodsNum", i.value());
//根据ID获取MGOODS表格的数据
QString select = QString("select * from MGOODS where goodsID = '%1'").arg(i.key());
query.exec(select);
if(!query.exec(select))
{
qDebug() << query.lastError().text();
}
//查询
if(query.next())
{
qDebug() << "查询成功";
}
else {
qDebug() << "未查询到数据";
return;
}
QSqlRecord M_record = query.record();
goodsNum = i.value();
qDebug() << "goodsNum" << goodsNum;
// goodsIDList << M_record;
//判断库存中是否已存在该ID编号的商品,不存在则直接添加,存在则增加对应库存量后退出
store_select = QString("select * from GOODS where goodsID = '%1'").arg(i.key());
query.exec(store_select);
if(!query.exec(store_select))
{
qDebug() << query.lastError().text();
}
//查询
if(query.next())
{
qDebug() << "查询成功";
//获取目前库存的数量
store_record = query.record();
//将获取到的数据内容填入List中
QStringList storeRecordList;
storeRecordList << store_record.value("goodsNum").toString();
qDebug() << "已有库存数量:" << store_record.value("goodsNum") << "单位:" << store_record.value("goodsUnit").toString();
exitNumStr = storeRecordList.at(0);
qDebug() << "已有库存数量:" << exitNumStr;
exitNumData = exitNumStr.toInt();
exitNumData += i.value().toInt();
qDebug() << "更新后库存数量:" << exitNumData;
//执行修改数量
QString update = QString("update GOODS set goodsNum = '%1' where goodsID = '%2'").arg(QString::number(exitNumData)).arg(i.key());
query.exec(update);
if(!query.exec(update))
{
qDebug() << query.lastError().text();
}
qDebug() << "修改成功";
//关闭窗口
// this->close();
// return;
continue;
}
else {
qDebug() << "未查询到数据";
}
record.setValue("goodsID", M_record.value("goodsID"));
record.setValue("goodsName", M_record.value("goodsName"));
record.setValue("goodsClass", M_record.value("goodsClass"));
record.setValue("goodsModel", M_record.value("goodsModel"));
// record.setValue("goodsNum", goodsNum);
record.setValue("goodsNum", i.value());
record.setValue("goodsUnit", M_record.value("goodsUnit"));
record.setValue("goodsPrice", M_record.value("goodsPrice"));
record.setValue("goodsSupplier", M_record.value("goodsSupplier"));
record.setValue("goodsNote", M_record.value("goodsNote"));
//把记录添加到表格模型中
storemodel->insertRecord(0, record);
}
qDebug() << "添加成功";
//添加到订单列表
addOrder();
//添加到订单明细列表
addOrderDetail();
//隐藏窗口
this->hide();
}
}
//取消键--直接关闭进货窗口
void Stock::on_stkCancleBtn_clicked()
{
//隐藏窗口
this->hide();
}
//将数据添加到订单表格中
void Stock::addOrder()
{
QString orderNumber = ui->orderNumberEdit->text(); //订单号
QString date = ui->dateEdit->date().toString("yyyy-MM-dd"); //进货日期
QString supler = ui->suppliercomboBox->currentText(); //供应商
QString Num;
QString price;
QStringList moneyList;
QString moneySum_str;
float moneySum = 0;
QString worker = "admin";
QString note = ui->noteEdit->text();
if(note.isEmpty())
{
note = "Note";
}
//获取准备入库表格的行数
int curRow = ui->tableWidget->rowCount();//获取当前表格总行数
//当表格有数据时--将数据保存到库存表格中
if(curRow >0)
{
for(int i=0; i<curRow; i++)
{
Num = ui->tableWidget->item(i, 2)->text();
price = ui->tableWidget->item(i, 3)->text();
qDebug() << "需要入库的价格:" << price;
qDebug() << "需要入库的Num:" << Num;
moneySum_str = QString::number(Num.toInt()*price.toFloat(), 'f', 2);
moneyList << moneySum_str;
}
qDebug() << moneyList;
//计算订单总价
for(int i=0; i<moneyList.size(); i++)
{
moneySum += QString(moneyList.at(i)).toFloat();
}
qDebug() << "总价:" << moneySum;
//将float转为string格式,保留2位小数点
moneySum_str = QString::number(moneySum, 'f', 2);
}
qDebug() << "订单:" << orderNumber << date << supler << moneySum_str;
//将订单信息插入订单表格中
QString sql = QString("insert into ORD (orderID, stockTime, supplier, stockSum, worker, stockNote)"
"values('%1', '%2', '%3' , '%4', '%5', '%6')").arg(orderNumber, date, supler, moneySum_str, worker, note);
QSqlQuery query;
if(!query.exec(sql))
{
qDebug() << query.lastError().text();
}
}
//将数据添加到订单明细表格中
void Stock::addOrderDetail()
{
QString orderNumber = ui->orderNumberEdit->text(); //订单号
QStringList orderDetailList;
QString id;
QString name;
QString num;
QString detailSupplier;
QString sql;
QSqlQuery query;
//获取当前表格行数--判断是否有内容
int curRow = ui->tableWidget->rowCount();//获取当前表格总行数
if(curRow > 0)
{
for(int i=0; i<curRow; i++)
{
id = ui->tableWidget->item(i, 0)->text();
name = ui->tableWidget->item(i, 1)->text();
num = ui->tableWidget->item(i, 2)->text();
detailSupplier = ui->tableWidget->item(i, 4)->text();
qDebug() << "采购的商品:" << name;
qDebug() << "采购的Num:" << num;
orderDetailList << id << name << num;
//将数据插入订单明细表格
sql = QString("insert into DETAIL(orderID, goodsID, goodsName, goodsNum, goodsSupplier)"
"values('%1', '%2', '%3', '%4', '%5')")
.arg(orderNumber,id, name, num,detailSupplier );
if(!query.exec(sql))
{
query.lastError().text();
}
}
qDebug() << " orderDetailList:" << orderDetailList;
}
}
结尾
本Qt版的物料管理系统介绍基本完成,由于代码较多,部分代码就暂不展示,如读者感兴趣可留言,我再根据实际需求上传。