/// <summary> /// 通过ID获取会员;并接收会员的所有信息 /// </summary> /// <param name="id"></param> /// <returns></returns> public SMMembersModel10 GetMembersById(string id) { string procName = "GetMemberById"; SqlParameter[] sp = new SqlParameter[] { new SqlParameter("@MemberId", System.Data.SqlDbType.Int), new SqlParameter("@PhoneNumber", System.Data.SqlDbType.NVarChar, 50) }; //获取手机Id(如果满足11位数字则进入获取手机号) if (id.Length == 11) { sp[0].Value = -1; sp[1].Value = id; } //获取会员编号(否则只获取会员编号) else { sp[0].Value = id; sp[1].Value = ""; } //sp[0].Value = id; SMMembersModel10 members = null; SqlDataReader reader = SQLHelper.GetDataReader(procName, sp); while (reader.Read()) { members = new SMMembersModel10() { MemberId = reader["MemberId"].ToString(), MemberAddress = reader["MemberAddress"].ToString(), MemberName = reader["MemberName"].ToString(), MemberStatus = Convert.ToInt32(reader["MemberStatus"]), OpenTime = Convert.ToDateTime(reader["OpenTime"]), PhoneNumber = reader["PhoneNumber"].ToString(), Points = Convert.ToInt32(reader["Points"]) }; } reader.Close(); return(members); }
//确认注册 private void btnSure_Click(object sender, EventArgs e) { if (txtmemberName.CheckNullOrEmpty() * txtmembertel.CheckDataD(@"^1\d[10]$", "手机号格式有误!") != 0) { //【1】manager3.GETMemberByIdOrPhone(txtmembertel.Text.Trim()): //【2】通过获取Id或手机号获取这个txtmembertel.Text文本框中的内容是否是空;(不等于空表示调用获取到数据) //【3】在C#中的作用是判断这个Id编号或手机号是否在数据库中可以拿到 if (manager3.GETMemberByIdOrPhone(txtmembertel.Text.Trim()) != null) { MessageBox.Show("改账号已经被注册", "提示"); return; } SMMembersModel10 members = new SMMembersModel10() { MemberName = txtmemberName.Text.Trim(), PhoneNumber = txtmembertel.Text.Trim(), MemberAddress = string.IsNullOrEmpty(txtAddress.Text.Trim())?"地址不详":txtAddress.Text.Trim() }; //获取添加会员的内容:把members原有的数据放在AddMember()方法里面,然后把添加会员的内容返回给members这样表示members不为空 members = manager3.AddMember(members); //表示members已经添加成功,members不为空 if (members != null) { //members不为空,表示已经添加到数据库,然后把窗口里面的内容清空 if (MessageBox.Show($"注册成功! 会员账号是【{members.MemberId}】\r\n是否继续注册?", "提示", MessageBoxButtons.YesNo) == DialogResult.OK) { txtmemberName.Text = ""; txtmembertel.Text = ""; txtAddress.Text = ""; txtmemberName.Focus();//获取焦点 } } else { MessageBox.Show("注册失败请稍后重新试"); } } }
/// <summary> /// 添加会员(AddMember存储过程名字),并返回一个会员编号 /// </summary> /// <param name="id"></param> /// <returns></returns> public SMMembersModel10 AddMember(SMMembersModel10 member) { //添加会员的存储过程 string procName = "AddMember"; SqlParameter[] sp = new SqlParameter[] { new SqlParameter("@memberName", member.MemberName), new SqlParameter("@phoneNumber ", member.PhoneNumber), new SqlParameter("@memberAddress ", member.MemberAddress) }; object obj = SQLHelper.ExecuteScalar(procName, sp); if (obj != null) { member.MemberId = obj.ToString(); } else { member = null; } return(member); }
//【四.1】 //【1.1】到【1.11】搭建大概矿建还没有显现存储过程 //【1.12】到【1.22】会员和普通客户给支付界面tag里面放值,方便主窗口获取:客户的收的钱数和Vip数据或只是客户的收的钱数 /// <summary> /// KeyDown首次按下某个键发生 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void txtVip_KeyDown(object sender, KeyEventArgs e) { //换行符进行处理,原因是会获取\r\n,所以用Replace处理\r\n txtAmount.Text = txtAmount.Text.Replace("\r\n", ""); txtVip.Text = txtVip.Text.Replace("\r\n", ""); //【1.1】 //【四.2】当按F1时 if (e.KeyCode == Keys.F1) { //当按F1时获取‘现金’是否被选中 radMoney.Checked = true; } //【1.2】 //当按下F2时刷卡 else if (e.KeyCode == Keys.F2) { //表示该空间被选中 radCard.Checked = true; } //【1.3】 //当按下F2时扫二维码 else if (e.KeyCode == Keys.F3) { //表示该空间被选中 radQRCode.Checked = true; } //【1.4】 //回车键:表示正常结算 else if (e.KeyCode == Keys.Enter) { //【1.5】 //txtAmount输入购物人给的钱数,必须满足条件,!=0 if (txtAmount.CheckData(@"^(([1-9]\d*)|(\d*.\d{0,2}))$", "输入金额有误") != 0) { //【1.6】 //‘.’符号是否出现过txtAmount文本框中的字符串,和‘.’获取以后的从0开始的索引是否==txtAmount字符串中的长度 //如果FrmBalance里面的应付只输入数字后面有.就会自动补上00 if (txtAmount.Text.Contains(".") && txtAmount.Text.IndexOf(".") == txtAmount.Text.Length) { //满足上面条件进入,给txtAmount.Text多加00 txtAmount.Text += "00"; } //【1.7】 //如果FrmBalance里面的应付只输入数字后面没有.就会自动补上.00 else if (!txtAmount.Text.Contains(".")) { txtAmount.Text += ".00"; } //把获取的输入钱数转换成ToDecimal类型再给txtAmount.Text里面放 txtAmount.Text = Convert.ToDecimal(txtAmount.Text).ToString("F2"); //【1.8】 //判断不是会员 if (txtVip.Text.Length == 0)//0不是会员 { //【1.9】 //txtVip文本框中的Tag中直接赋txtAmount的实付的钱数 this.Tag = txtAmount.Text.Trim(); } //【1.10】 else//有会员卡号 { //【1.12】 if (txtVip.CheckData(@"^[1-9]\d*$", "会员卡号有误") != 0) { //【1.13】 //进一步判断会员是否正常自己完成 //GetMembersById:通过ID获取会员;并接收会员的所有信息 SMMembersModel10 members = memberManager.GetMembersById(txtVip.Text.Trim()); //【1.14】表示拿到会员 if (members != null) { //【检查会员状态】 //【1.15】 //members.MemberStatus属性表示会员状态 //members.MemberStatus == 1表示拿到会员 if (members.MemberStatus == 1) { //用【&】连接(1)和(2)最后用表示框架的tag给里面负(1)和(2)的值 //(1)txtAmount.Text.Trim()拿到应支付的商品总价钱 //(2)txtVip.Text.Trim()拿到客户的VIP编号 this.Tag = $"{txtAmount.Text.Trim()}&{txtVip.Text.Trim()}"; } //【1.16】 else { //【1.17】 //会员XXX被冻结!请联系超市相关工作人员! if (members.MemberStatus == 0) { MessageBox.Show($"会员【{txtVip.Text.Trim()}】被冻结!请联系超市相关工作人员!", "提示"); } //【1.18】 //会员XXX已被注销! else { MessageBox.Show($"会员【{txtVip.Text.Trim()}】已被注销!", "提示"); } //【1.19】 //清空会员文本框 txtVip.Text = ""; return; } } //【1.20】 else { //【1.21】 MessageBox.Show($"会员【{txtVip.Text.Trim()}】不存在!请检查会员账号!", "提示"); txtVip.Text = ""; return; } } //【1.22】 else { //没有会员卡,tag直接用txtAmount.Text.Trim()实际收客户的钱数 this.Tag = txtAmount.Text.Trim(); } } //【1.6】 //证明客户付钱够了,比较应付的金额小于等于应付金额;表示客户拿的钱够了,可以付钱 if (Convert.ToDecimal(txtPay.Text) <= Convert.ToDecimal(txtAmount.Text)) { this.DialogResult = DialogResult.OK; this.Close(); } ////【1.11】 else { MessageBox.Show("客户实际付款金额不足!", "注意"); } } } //【1.12】 else if (e.KeyCode == Keys.Escape) { //如果键盘上按了Escape按钮,给Tag传了一个Tag数据,这个Tag数据方便给主窗口显示其他的功能 this.Tag = "Esc"; this.Close();//关闭这个窗口 } //【1.13】按Tab只让输入钱数和vip账号获取焦点,来回获取焦点 else if (e.KeyCode == Keys.Tab) { //按Tab判断文本框的Tag是什么值 SuperTextbox txt = sender as SuperTextbox; //【1.14】 if (txt.Tag.ToString() == "vip")//如果是vip { //获取焦点 txtAmount.Focus(); } //【1.15】 else if (txt.Tag.ToString() == "pay")//如果是pay { //获取焦点 txtVip.Focus(); } } }
/// <summary> /// 添加会员(AddMember存储过程名字),并返回一个会员编号 /// </summary> /// <param name="id"></param> /// <returns></returns> public SMMembersModel10 AddMember(SMMembersModel10 member) { return(GetManager3.AddMember(member)); }
//【1.1】到【1.5】先搭建构架;还没有实现存储过程 //【1.1】到【1.4】取消结算 //【1.5】到【1.20】正式开始结算([包含了客户卖东西的数据库中的表]和[收银员记录客户消费具体的信息表在数据库中显示]和[VIP会员的积分记录]) private void Balance() { //【1.1】 //显示结算窗口,考虑支付被取消或修改,并传递txtPay应付多少钱文本框 FrmBalance frm = new FrmBalance(txtPay.Text); //【1.2】 //如果打开FrmBalance不成功进入 if (frm.ShowDialog() != DialogResult.OK) { //客户放弃购买(忘记带钱等);在购买界面时键盘上按了Escape按钮,给Tag传了一个Tag数据,则frm.Tag.ToString() == "Esc"现在相等,进入if语句 //【1.3】 if (frm.Tag.ToString() == "Esc") { //【1.4】 //支付完成重置界面:就是把原有的界面里面的商品清空,从新开始 RestForm();//【二】弄完后进入【三.1】FrmBalance窗口里 } } //【1.5】 else//正式进入结算环节 { //【1.6】 //实例化会员类 SMMembersModel10 members = null; //Contains("&")表示&这个字符是否出现在此字符串中 //【1.7】 //获取含有&tag值 if (frm.Tag.ToString().Contains("&"))//输入了会员卡号 { //【1.8】 //把含有&的Tag值,分割两部分,用string数组记录 //这两部分分别是【客户实际付的钱数】和【VIP的编号】 string[] info = frm.Tag.ToString().Split('&'); //【1.9】【客户实际付的钱数】 txtAmount.Text = info[0]; //【1.10】 members = new SMMembersModel10() { //【1.11】【VIP的编号】 MemberId = info[1], //【1.12】给具体购买的商品的总金额/10 Points = (int)(Convert.ToDouble(txtPay.Text) / 10.0) }; } else { //【1.13】没有会员,直接获取【客户实际付的钱数】 txtAmount.Text = frm.Tag.ToString(); } //【1.14】 //找零 //【客户实际付的钱数】-【具体购买的商品的总金额】 txtChange.Text = (Convert.ToDecimal(txtAmount.Text) - Convert.ToDecimal(txtPay.Text)).ToString(); /*txtChange.Text = (Convert.ToDecimal(txtPay.Text) - Convert.ToDecimal(txtAmount.Text)).ToString();*/ //【1.15】上面弄完后,saleObj的每个数据就会附上具体的数据 //创建消费对象 SalesListModel1 saleObj = new SalesListModel1() { SerialNum = txtSerialNum.Text, TotalMoney = Convert.ToDecimal(txtPay.Text.Trim()), RealReceive = Convert.ToDecimal(txtAmount.Text.Trim()), ReturnMoney = Convert.ToDecimal(txtChange.Text.Trim()), SalesPersonId = Program.Seles.SalesPersonId }; //【1.16】 //封装消费明细列表 //productList放商品的具体数据盒子 foreach (ProdutsModel item in productList) { //【1.17】 //给saleObj里面的ListDetail属性里面添加方法 //ListDetail就是SalesListDetailModel的接收容器 //给 saleObj.ListDetail.Add里面添加new SalesListDetailModel(){}的原因是saleObj.ListDetail这个方法接收的是SalesListDetailModel类型的泛型所以用new SalesListDetailModel(){}添加 saleObj.ListDetail.Add( //【1.18】 new SalesListDetailModel() { //把商品列表中的所有信息给了SalesListDetailModel类里面 SerialNum = txtSerialNum.Text, ProductId = item.ProductId, ProductName = item.ProductName, Quantity = item.Quantity, UnitPrice = item.UnitPrice, Discount = item.Discount, SubTotalMoney = item.SubTotal } ); } try { //【1.19】 /// <summary> /// SaveSalerInfo: /// 【1】AddSalesList销售主表:以发票的形式记录消费的客户的小票数据,放在SalesList表里面记录客户的买的东西 /// 【2】AddSalesListDetail商品销售统计表:就是顾客买的东西记录一下,放在AddSalesListDetail表里面记录收银员的给客户卖东西是的账本 /// 【3】RefreshMemberPoint修改会员积分:如果有会员则修改会员积分 /// </summary> //把结算的内容相互通过数据库事务相互牵连 //saleObj(包含了在主窗口中文本框中的所有数据,还获取了ListDetail里面添加的所有数据)获取所有的商品表并数据传递到数据库里 //members把会员所需要的数据传递到数据库里 manager2.SaveSalerInfo(saleObj, members); } //【1.20】 catch (Exception ex) { MessageBox.Show($"保存销售数据的时候发生异常!{ex.Message}", "异常提示"); return; } //小票打印 //【1】在工具箱里获取打印工具printDocument(printDocument打印工具的名字) //【3】Print开始文档的打印进程 printDocument.Print(); //【4】小票打印预览 PrintPriview(); //重置主界面 RestForm(); } }
/// <summary> /// SaveSalerInfo: /// 【1】AddSalesList销售主表:以发票的形式记录消费的客户的小票数据,放在SalesList表里面记录客户的买的东西 /// 【2】AddSalesListDetail商品销售统计表:就是顾客买的东西记录一下,放在AddSalesListDetail表里面记录收银员的给客户卖东西是的账本 /// 【3】RefreshMemberPoint修改会员积分:如果有会员则修改会员积分 /// </summary> /// <param name="sales"></param> /// <param name="members"></param> /// <returns></returns> public bool SaveSalerInfo(SalesListModel1 sales, SMMembersModel10 members) { return(server.SaveSalerInfo(sales, members)); }
/// <summary> /// 【1】AddSalesList销售主表:以发票的形式记录消费的客户的小票数据,放在SalesList表里面记录客户的买的东西 /// 【2】AddSalesListDetail商品销售统计表:就是顾客买的东西记录一下,放在AddSalesListDetail表里面记录收银员的给客户卖东西是的账本 /// 【3】RefreshMemberPoint修改会员积分:如果有会员则修改会员积分 /// </summary> /// <param name="sales">sales(包含了在主窗口中文本框中的所有数据,还获取了ListDetail里面添加的所有数据)获取所有的商品表并数据传递到数据库里</param> /// <param name="members"></param> /// <returns></returns> public bool SaveSalerInfo(SalesListModel1 sales, SMMembersModel10 members) { //【4月8日】 List <string> procList = new List <string>(); List <SqlParameter[]> psList = new List <SqlParameter[]>(); //给消费主表中添加数据 procList.Add("AddSalesList"); //【1】 SqlParameter[] saleSp = new SqlParameter[] { new SqlParameter("@SerialNum", SqlDbType.NVarChar, 50), new SqlParameter("@TotalMoney", SqlDbType.Decimal), new SqlParameter("@RealReceive", SqlDbType.Decimal), new SqlParameter("@ReturnMoney", SqlDbType.Decimal), new SqlParameter("@SalesPersonId", SqlDbType.Int) }; saleSp[0].Value = sales.SerialNum; saleSp[1].Value = sales.TotalMoney; saleSp[2].Value = sales.RealReceive; saleSp[3].Value = sales.ReturnMoney; saleSp[4].Value = sales.SalesPersonId; // 把参数对应的值放在psList里面 psList.Add(saleSp); //【2】 //通过SalesListModel1也可以知道SalesListDetailModel里面对应的值 //给消费明细表中添加每次购物的详细数据 foreach (SalesListDetailModel detail in sales.ListDetail) { procList.Add("AddSalesListDetail"); SqlParameter[] detailList = new SqlParameter[] { new SqlParameter("@SerialNum", SqlDbType.NVarChar, 50), new SqlParameter("@ProductId", SqlDbType.NVarChar, 50), new SqlParameter("@ProductName", SqlDbType.NVarChar, 50), new SqlParameter("@UnitPrice", SqlDbType.Decimal), new SqlParameter("@Discount", SqlDbType.Float), new SqlParameter("@Quantity", SqlDbType.Int), new SqlParameter("@SubTotalMoney", SqlDbType.Decimal) }; detailList[0].Value = detail.SerialNum; detailList[1].Value = detail.ProductId; detailList[2].Value = detail.ProductName; detailList[3].Value = detail.UnitPrice; detailList[4].Value = detail.Discount; detailList[5].Value = detail.Quantity; detailList[6].Value = detail.SubTotalMoney; psList.Add(detailList); //【4月9日】 //更新库存数据:就是对商品数量的改变 procList.Add("InventoryOut"); SqlParameter[] inventorySp = new SqlParameter[] { new SqlParameter("@ProductId", SqlDbType.NVarChar, 50), new SqlParameter("@TotalCount", SqlDbType.Int) }; inventorySp[0].Value = detail.ProductId; inventorySp[1].Value = detail.Quantity; psList.Add(inventorySp); } //【4月8日】 //【3】 //更新会员的积分 if (members != null) { procList.Add("RefreshMemberPoint"); SqlParameter[] memberSp = new SqlParameter[] { new SqlParameter("@point", SqlDbType.Int), new SqlParameter("@memberId", SqlDbType.Int) }; memberSp[0].Value = members.Points; memberSp[1].Value = members.MemberId; psList.Add(memberSp); } return(SQLHelper.UpdateByTran(procList, psList)); }