机房重构中上机功能相对好实现一些,下机用到了职责链模式和策略模式,职责链模式算时间,策略模式算消费金额
部分代码
DAL层
public class OffDAL:IOffIDAL
{
//查询card表
public DataTable SelectCard(Card card)
{
SQLHelper.SqlHelper sqlhelper = new SQLHelper.SqlHelper();//实例化SQLHelper
SqlParameter[] sqlParas = { new SqlParameter("@CardNo", card.Cardno), };
string sql = "SELECT*FROM Card WHERE cardNo=@CardNo";
DataTable table = sqlhelper.ExecuteQuery(sql, sqlParas, CommandType.Text);
return table;
}
//查询student表
public DataTable SelectStudent_Info(Student_Info student)
{
SQLHelper.SqlHelper sqlhelper = new SQLHelper.SqlHelper();//实例化SQLHelper
SqlParameter[] sqlParas = { new SqlParameter("@CardNo", student.Cardno), };
string sql = "SELECT * FROM Student_Info Where cardNo=@CardNo"; //SQL语句查询
DataTable dt = sqlhelper.ExecuteQuery(sql, sqlParas, CommandType.Text);//函数ExecuterQuery查询
return dt;//返回值
}
//查LineLog表
public DataTable SelectLineLog(LineLog line)
{
SQLHelper.SqlHelper sqlhelper = new SQLHelper.SqlHelper();//实例化SQLHelper
SqlParameter[] sqlParas = { new SqlParameter("@CardNo", line.Cardno), };
string sql = "SELECT * FROM LineLog Where cardNo=@CardNo"; //SQL语句查询
DataTable dt = sqlhelper.ExecuteQuery(sql, sqlParas, CommandType.Text);//函数ExecuterQuery查询
return dt;//返回值
}
//查LineLog表,填充下机日期
public DataTable SelectLineLog1(LineLog line)//下机
{
SQLHelper.SqlHelper sqlhelper = new SQLHelper.SqlHelper();//实例化SQLHelper
SqlParameter[] sqlParas = { new SqlParameter("@CardNo", line.Cardno), };
string sql = "SELECT * FROM LineLog Where cardNo=@CardNo AND offDate IS NULL"; //SQL语句查询
DataTable dt = sqlhelper.ExecuteQuery(sql, sqlParas, CommandType.Text);//函数ExecuterQuery查询
return dt;//返回值
}
public DataTable UpdateLineLog1(LineLog line)
{
SQLHelper.SqlHelper sqlhelper = new SQLHelper.SqlHelper();//实例化SQLHelper
SqlParameter[] sqlParas = {
new SqlParameter("@CardNo",line.Cardno),//实例化字段穿参
new SqlParameter("@offdate",line.Offdate),
new SqlParameter("@offtime",line.Offtime),
new SqlParameter("@mins",line.Mins),
new SqlParameter("@cash",line.Cash),
};
string sql = "UPDATE LineLog SET cardNo=@CardNo, offDate=@offdate,offTime=@offtime,mins=@mins,cash=@cash WHERE cardNo=@CardNo"; //SQL语句查询
DataTable dt = sqlhelper.ExecuteQuery(sql, sqlParas, CommandType.Text);//函数ExecuterQuery查询
return dt;//返回值
}
//下机,修改Card表
public DataTable UpdateCard(Card card)
{
SQLHelper.SqlHelper sqlhelper = new SQLHelper.SqlHelper();//实例化SQLHelper
SqlParameter[] sqlParas = {
new SqlParameter("@CardNo", card.Cardno),//实例化字段穿参
new SqlParameter("@Cash", card.Balance),
};
string sql = "UPDATE Card SET Balance=Balance-@Cash WHERE cardNo = @CardNo"; //SQL语句查询
DataTable dt = sqlhelper.ExecuteQuery(sql, sqlParas, CommandType.Text);//函数ExecuterQuery查询
return dt;//返回值
}
}
设计模式
namespace Design_pattern
{
public class Context
{
private Strategy strategy;
public Context(Strategy strategy)
{
this.strategy = strategy;
}
public LineLog ContextInterface(LineLog line, BasicData basic)
{
strategy.Getconsum(line, basic);
return line;
}
}
public abstract class Strategy
{
//定义一个获得消费金额的抽象方法
public abstract LineLog Getconsum(LineLog line, BasicData basic);
}
public class Strategyone : Strategy
{
public override LineLog Getconsum(LineLog line, BasicData basic)//临时用户消费金额
{
//获取临时用户单位消费金额
line.Cash = (line.Mins * Convert.ToInt32(basic.TmpCash)).ToString();
return line;
}
}
public class Strategytwo : Strategy
{
public override LineLog Getconsum(LineLog line, BasicData basic)//固定用户消费金额
{
//获取固定用户单位消费金额
line.Cash = (line.Mins * Convert.ToInt32(basic.FixCash)).ToString();//固定用户消费金额
return line;
}
}
}
BLL层
namespace BLL
{
public class OffBLL
{
public DataTable SelectLineLogConsumetime(LineLog line)
{
BasicData basic = new BasicData();
OffFactory factory = new OffFactory();
IOffIDAL off = factory.CreateOff();
LineLog line1 = new LineLog();
DataTable dt = off.SelectLineLog(line);
BasicdataFactory factory1 = new BasicdataFactory();
#region 职责链模式算时间
//实体传值
IBasicdataIDAL data = factory1.CreateUser();
DataTable dt1 = data.ReadBasicData();
basic.TmpCash = dt1.Rows[0][0].ToString();
basic.FixCash = dt1.Rows[0][1].ToString();
basic.Leasttime = Convert.ToInt32(dt1.Rows[0][3].ToString());
basic.Readytime = Convert.ToInt32(dt1.Rows[0][4].ToString());
basic.Limitcash = dt1.Rows[0][5].ToString();
//调用职责链模式,计算花费时间
//创建具体的处理对象,实例化时就将"对象的具体执行者"传过去
Design_patterns.Preparetime DP = new Design_patterns.Preparetime();
Design_patterns.Consumetime DC = new Design_patterns.Consumetime();
//从最开始的低层,设置上级
DP.SetSuccessor(DC);
//从链的最低层开始执行
line1 = DP.GetcumeTime(basic, line1);
line.Mins = line1.Mins;
#endregion
#region 策略模式算消费金额
string type = line.Type;
switch (type)
{
case "固定用户":
Context context = new Context(new Strategyone());
line = context.ContextInterface(line, basic);
break;
case "临时用户":
Context context1 = new Context(new Strategytwo());
line = context1.ContextInterface(line, basic);
break;
}
#endregion
return dt1;
}
public DataTable SelectCard(Card card)
{
OffFactory factory = new OffFactory();//实例化工厂
IOffIDAL off = factory.CreateOff();
DataTable dt = off.SelectCard(card);
return dt;
}
//查学生表
public bool SelectStudent_Info(Student_Info student)
{
OffFactory factory = new OffFactory();//实例化工厂
IOffIDAL off = factory.CreateOff();
DataTable dt = off.SelectStudent_Info(student);
bool flag;
//返回值是datatable的类型,如果行数为0,则没有符合该账号及密码的用户
if (dt.Rows.Count == 0)
{
flag = false;
}
else
{
flag = true;
}
return flag;//返回flag
}
//查上机表
public bool SelectLineLog(LineLog line)
{
BasicData basic = new BasicData();
OffFactory factory = new OffFactory();//实例化工厂
IOffIDAL off = factory.CreateOff();
LineLog line1 = new LineLog();
DataTable dt = off.SelectLineLog(line);
bool flag1;
//返回值是datatable的类型,如果行数为0,则没有符合该账号及密码的用户
if (dt.Rows.Count == 0)
{
flag1 = false;
}
else
{
flag1 = true;
}
return flag1;//返回flag1
}
///
/// 下机
///
///
///
//下机获取下机日期
public Boolean GetoffDate(LineLog line)
{
OffFactory fact = new OffFactory();//实例化工厂
IOffIDAL idal = fact.CreateOff();//进入Factory层,调用工厂创建接口
DataTable dt = idal.SelectLineLog1(line);//接收D层的返回值
bool flag2;
if (dt.Rows.Count == 0)//不存在该卡号没有下机
{
flag2 = false;
}
else
{
flag2 = true;
}
return flag2;
}
//更新机日期
public DataTable UpdateoffDate(LineLog line)
{
OffFactory fact = new OffFactory();//实例化工厂
IOffIDAL idal = fact.CreateOff();//进入Factory层,调用工厂创建接口
DataTable dt = idal.UpdateLineLog1(line);//接收D层的返回值
return dt;
}
//更新时间和余额
public DataTable UpdateMins(LineLog line)
{
OffFactory fact = new OffFactory();//实例化工厂
IOffIDAL idal = fact.CreateOff();//进入Factory层,调用工厂创建接口
DataTable dt = idal.SelectLineLog1(line);//接收D层的返回值
return dt;
}
}
}
UI层
#region 上机
private void btnUp_Click(object sender, EventArgs e)
{
LineLog line = new LineLog();
Card card = new Card();
//定义一个bool类型的变量
bool flag;
bool flag1;
bool flag2;
UpFacade up = new UpFacade();
card.Cardno = txtCardNo.Text.Trim();//定义参数,接收U层的控件的值
line.Cardno = txtCardNo.Text.Trim();
InqbalanceFacade inqbalance = new InqbalanceFacade();//实例化外观层
DataTable table2 = new DataTable();//定义一个虚表变量
table2 = inqbalance.SelectCard(card);//接收外观层的返回值
line.Ondate = DateTime.Now.ToShortDateString();//实体,上机日期
line.Ontime = DateTime.Now.ToLongTimeString().ToString(); //实体,上机时间
//line.Type = table2.Rows[0]["Type"].ToString();
DataTable dt = up.ReadCard(card);
DataTable dt1 = up.Readoffdate(line);
///flag 查询卡表是否有该卡号
///flag1 查询LineLog表是否有该卡号
///dt 接收卡表的余额值
///dt1 接收LineLog表的offDate字段值
///table1 接收更新LineLog
//接收外观层的返回值
flag = up.SelectCard(card);
flag1 = up.SelectLineLog(line);
flag2 = up.SelectLineLogup(line);
//判断返回值是否为false
if (flag == false)
{
MessageBox.Show("没有这个卡号");
return;
}
if (flag1 == false)//LineLog表里没有卡号
{
DataTable table1 = up.UpdateLineLog(line);
DataTable table = new DataTable();//定义一个虚表变量
table = inqbalance.SelectCard(card);//接收外观层的返回值
txtCash.Text = table.Rows[0][2].ToString();
MessageBox.Show("上机成功");
return;
}
if (flag2 != false)//下机日期为空,不可以上机
{
MessageBox.Show("此卡号已上机");
return;
}
if (Convert.ToInt32(dt.Rows[0][2]) <= 1)//余额不足
{
MessageBox.Show("余额不足,请及时充值");
return;
}
else
{
DataTable table1 = up.UpdateLineLog(line);
InqbalanceFacade inqbalance1 = new InqbalanceFacade();//实例化外观层
DataTable table = new DataTable();//定义一个虚表变量
table = inqbalance1.SelectCard(card);//接收外观层的返回值
txtCash.Text = table.Rows[0][2].ToString();
}
}
#endregion
#region 下机
private void btnDown_Click(object sender, EventArgs e)
{
//实例化实体
Card card = new Card();
LineLog line = new LineLog();
BasicData basic = new BasicData();
Student_Info student = new Student_Info();
//接收U层值传入实体
student.Cardno = txtCardNo.Text.Trim();
line.Cardno = txtCardNo.Text.Trim();
card.Cardno = txtCardNo.Text.Trim();
//实例化外观层
OffFacade off = new OffFacade();
bool flag;
flag = off.SelectStudent_Info(student);//接收F层布尔值
//总时间=当前时间-上机时间
line.Offdate = DateTime.Now.ToShortDateString();//实体,下机日期
line.Offtime = DateTime.Now.ToLongTimeString().ToString(); //实体,下机时间
DataTable dt3 = off.UpdateMins(line);
if (flag == false)//学生表没有卡号
{
MessageBox.Show("没有这个卡号");
}
else
{
if (dt3.Rows.Count == 0)
{
MessageBox.Show("该卡号没有上机", "提示");
}
else
{
DateTime ontime = Convert.ToDateTime(dt3.Rows[0][2].ToString());
int datetime = ontime.Hour;//上机时间
int nowtime = DateTime.Now.Hour;//当前时间
BasicData basic1 = new BasicData();
DataTable dt4 = off.SelectCard(card);
card.Balance = dt4.Rows[0][2].ToString();
// 计算总时间
int mins = nowtime - datetime;
line.Mins = mins;
DataTable dt2 = off.SelectLineLogConsumetime(line);//运用职责链模式
//消费金额=消费总时间*单位消费金额
int fixrate = 2;
int balance = Convert.ToInt32(Convert.ToDouble(card.Balance));
int cash = Convert.ToInt32(mins * fixrate);
if (cash == 0)
{
int Banlance = balance - 2;
card.Balance = Banlance.ToString();
line.Cash = 0.ToString();//余额
}
}
///flag接收学生表是否有卡号
///flag1接收上机表是否有卡号
///flag3接收上机表下机日期是否为空
//定义布尔变量
bool flag1;
flag1 = off.SelectLineLog(line);
bool flag3 = off.GetoffDate(line);//接收B层offDate的值
DataTable dt = off.UpdateoffDate(line);
if (flag1 == false)//上机表没有卡号
{
MessageBox.Show("此卡号没有上机,请先上机");
}
else
{
if (flag3 == false)//不存在该卡号没有下机
{
MessageBox.Show("该卡号已下机");
}
else
{
MessageBox.Show("下机成功");
DataTable dt1 = off.UpdateoffDate(line);
}
}
}
}
#endregion