Repository navigation
Expand file tree
/
Copy pathwidget.cpp
More file actions
179 lines (171 loc) · 4.95 KB
/
Copy pathwidget.cpp
File metadata and controls
179 lines (171 loc) · 4.95 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
#include "widget.h"
#include "ui_widget.h"
#include "structure.h"
#include "function.h"
#include <QLabel>
#include <QLineEdit>
#include <QString>
#include <QButtonGroup>
#include <QMessageBox>
#include <QFont>
#include <QOverload>
//食物数量,套餐数量,关闭与开放系统的阈值
int N,M,n,maxOrder,minOrder;
//食物数组
FOOD foods[MAX_FOODS];
//套餐数组
SET sets[MAX_SETS];
//订单数组
ORDER orders[MAX_ORDERS];
//完成时间的数组
int completed_time[MAX_ORDERS];
int ordercount=0;
//初始化ui
void initUi(Ui::Widget* ui);
//将食物加入菜单
void initFood(FILE* menu,Ui::Widget* ui);
//将套餐加入菜单
void initSet(FILE* menu,Ui::Widget* ui);
//制作食物
void addFood();
//分配食物
void deliverFood(NODE** foodList,NODE** lastFood);
//上传到队列
void updateFoodList(NODE** lastFood,int prs);
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
//初始化变量
T=1000;
ui->setupUi(this);
initUi(ui);
FILE* menu=fopen("dict.dic","r");
fscanf(menu,"%d %d",&N,&M);
initFood(menu,ui);
fscanf(menu,"%d%d",&maxOrder,&minOrder);
initSet(menu,ui);
fclose(menu);
//把按钮加到按钮组
buttons=new QButtonGroup();
for(int i=0;i<M+N;i++){
QPushButton *confirm=this->findChild<QPushButton*>("confirm"+QString::number(i));
buttons->addButton(confirm,i);
}
foodList=createList(N);
lastFood=createLastNode(foodList,N);
waitingOrder=(NODE*)malloc(sizeof(NODE));
waitingOrder->next=NULL;
lastOrder=waitingOrder;
timer=new QTimer;
Widget::timeoutSlot();
//连接信号与槽
connect(buttons, &QButtonGroup::buttonClicked, this, [=](QAbstractButton* button){
int id = buttons->id(button);
this->purchase(id);
});
}
Widget::~Widget()
{
delete ui;
}
//处理订单
void Widget::timeoutSlot()
{
int second = sec % 60;
int min = (sec/60) % 60;
int hour = (sec/3600)%24+7;
QString timestr = QString("%1:%2:%3")
.arg(hour, 2, 10, QChar('0'))
.arg(min, 2, 10, QChar('0'))
.arg(second, 2, 10, QChar('0'));
ui->lineEdit->setText(timestr);
//制作食物
addFood();
//当前时刻产生新的订单
if(!reception){
lastOrder=addNode(prs,lastOrder);
waitNum++;
updateFoodList(lastFood,prs);
prs++;
reception=1;
}
//将食物按队列顺序分配给等待的订单并同步食物数量
deliverFood(foodList,lastFood);
//遍历等待订单的队列,检查各订单是否完成
ui->textEdit->clear();
for(NODE* cur=waitingOrder;cur->next!=NULL;){
//若已完成,将其从队列删除并同步状态,记录时间
if(orders[cur->next->num].foodState==0){
ui->textEdit_2->append( QString::number(cur->next->num+10001));
waitNum--;
completed_time[orders[cur->next->num].count]=sec;
lastOrder=deleteNode(cur,lastOrder);
}
else{
ui->textEdit->append( QString::number(cur->next->num+10001));
cur=cur->next;
}
}
for(int i=0;i<N;i++){
QLineEdit *quan=this->findChild<QLineEdit*>("quan"+QString::number(i));
quan->setText(QString::number(foods[i].quan));
QLineEdit *foodState=this->findChild<QLineEdit*>("foodState"+QString::number(i));
if(foods[i].producingState){
foodState->setText("生产中");
}
else{
foodState->setText("已停产");
}
}
//检查当前等待订单数,决定开放或关闭系统
switch(state){
case 1:if(waitNum>maxOrder) state=0;break;
case 0:if(waitNum<minOrder) state=1;break;
}
sec++;
}
//启动计时
void Widget::on_startButton_clicked()
{
QTimer::singleShot(T,this,SLOT(timeoutSlot()));
QTimer::singleShot(T,this,SLOT(on_startButton_clicked()));
}
//退出系统
void Widget::on_exitButton_clicked()
{
this->close();
FILE *fp=fopen("output.txt","w");
for(int i=1;i<=ordercount;i++){
if(completed_time[i]==-1)
fprintf(fp,"Fail\n");
else
fprintf(fp,"%02d:%02d:%02d\n", (completed_time[i]/3600)%24+7,(completed_time[i]/60)%60,completed_time[i]%60);
}
fclose(fp);
}
//下单
void Widget::purchase(int num)
{
if(reception&&state){
orders[prs].type=num;
orders[prs].foodState=sets[orders[prs].type].size;
ordercount++;
orders[prs].count=ordercount;
reception=0;
QMessageBox::information(this, "",tr("点餐成功,订单编号:%1").arg(prs+10001));
}
else if(!reception){
QMessageBox::information(this,"","系统繁忙,请稍后再试");
}
else{
ordercount++;
completed_time[ordercount]=-1;
QMessageBox::information(this,"","系统已关闭,点餐失败");
}
}
//更改倍速
void Widget::on_spinBox_valueChanged(int arg1)
{
T=1000/arg1;
}