Beispiel #1
0
        /// <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);
        }
Beispiel #2
0
        //确认注册
        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));
 }
Beispiel #6
0
        //【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));
        }