钟表维修管理系统技术解析(六) 录入保修单

录入保修单,此模块可以对已经付款的销售单进行保修服务,选择已经付款的销售单,选择要保修的产品,填写要保修的数量,点击保存,完成操作,录入界面如(图1)所示。


2.3.3(图1)

选择销售单界面如(图2)所示。


2.3.3(图2)

从界面上可以看到我们这里用到的控件有

控件名称

说明

日期控件(DateTimePicker)

控件可以在工具箱直接拖动至窗体,拖至窗体后右击属性可以修改控件的样式和各种属性,还可以编辑事件。

下拉框(ComboBox)

文本(TextBox)

按钮(Button)

数据表格(DataGridView)

数据库表与关系如(图3)所示:


2.3.3(图3)

表1:  销售单表(pw_XiaoShouDan)

列名

数据类型

主键/外键

说明

XiaoShouDanID

int

主键

销售单ID

LuRuYuanID

int

外键

员工表,员工ID

XiaoShouMenDianID

int

外键

备用

FuKuanZhuangTaiID

int

外键

属性明细表,付款状态ID

KeHuID

int

外键

客户表,客户ID

PinPaiID

int

外键

品牌表,品牌ID

ZhongBiaoKuanShiID

int

外键

属性明细表,钟表款式ID

XiaoShouLeiXingID

int

外键

属性明细表,销售类型ID

XiaoShouFangShiID

int

外键

属性明细表,销售方式ID

SongHuoFangShiID

int

外键

属性明细表,送货方式ID

FuKuanFangShiID

int

外键

属性明细表,付款方式ID

FuKuanLeiXingID

int

外键

属性明细表,付款类型ID

XiaoShouDanBianHao

nchar(50)

 

销售单自动编号

JieZhangBianHao

nchar(50)

 

结账单自动编号

DiKeHao

nchar(50)

 

底壳号

XiaoShouRiQi

date

 

销售日期

YingShouJinE

decimal(18, 4)

 

应收金额

ShiShouJinE

decimal(18, 4)

 

实收金额

GengXinShiJian

datetime

 

更新时间

BeiZhu

nchar(100)

 

备注

BaoFeiYuanYin

nchar(100)

 

报废时填写报废原因

YouXiaoFou

bit

 

有效否


表2:  销售单明细表(pw_XiaoShouDanMingXi)

列名

数据类型

主键/外键

说明

XiaoShouDanMingXiID

int

主键

销售单明细ID

XiaoShouDanID

int

外键

销售单表,销售单ID

ChanPinID

int

外键

产品表,产品ID

CangWeiID

int

外键

仓位表,仓位ID

(产品提取处)

BaoXiuQiID

int

外键

保修期表,保修期ID

DanJia

decimal(18, 4)

 

产品销售单价

ShuLiang

int

 

产品数量

YiTuiHuoShu

int

 

已退货数(默认为0)

YouXiaoFou

bit

 

有效否

GengXinShiJian

datetime

 

更新时间

BeiZhu

nchar(50)

 

备注


表3:  销售售后单(pw_XiaoShouShouHouDan)

列名

数据类型

主键/外键

说明

XiaoShouShouHouDanID

int

主键

销售售后单ID

LuRuYuanID

int

外键

员工表,员工ID

XiaoShouDanID

int

外键

销售单表,销售单ID

XiaoShouShouHouLeiXingID

int

外键

属性明细表,销售售后类型ID

XiaoShouShouHouDanBianHao

nchar(50)

 

销售售后单自动编号

RiQi

date

 

日期

JinE

decimal(18, 4)

 

金额

(换货单负数为支出)

GengXinShiJian

datetime

 

更新时间

YouXiaoFou

bit

 

有效否

BeiZhu

nchar(50)

 

备注


表4:  销售售后单明细(pw_XiaoShouShouHouDanMingXi)

列名

数据类型

主键/外键

说明

XiaoShouShouHouDanMingXiID

int

主键

销售售后单明细ID

XiaoShouShouHouDanID

int

外键

销售售后单表,销售售后单ID

XiaoShouDanMingXiID

int

外键

销售单明细表,销售单明细ID

ChanPinID

int

外键

产品表,产品ID

DanJia

decimal(18, 4)

 

单价

(换货单负数为支出)

ShuLiang

int

 

产品数量

GengXinShiJian

datetime

 

更新时间

YouXiaoFou

bit

 

有效否

BeiZhu

nchar(50)

 

备注


表5:产品资料表(pw_ChanPinZiLiao)

列名

数据类型

主键/外键

说明

ChanPinID

int

主键

产品ID

LuRuYuanID

int

外键

录入员ID

CangKuLeiXingID

int

外键

仓库类型ID

ChanPinLeiXingID

int

外键

产品类型ID

ChanPinZhongLeiID

int

外键

产品种类ID

ChanPinPinPaiID

int

外键

产品品牌ID

DanWeiID

int

外键

单位ID

ChanPinBianHao

nchar(10)

 

产品编号

ChanPinMingCheng

nchar(10)

 

产品名称

CaiGouDanJia

decimal(18, 2)

 

采购单价

YiJiXiaoShouJia

decimal(18, 2)

 

销售价

JianJie

nchar(50)

 

简介

GengXinShiJian

datetime

 

更新时间

YouXiaoFou

bit

 

有效否

 

表6:员工表(sys_YuanGong)

列名

数据类型

主键/外键

说明

YuanGongID

int

主键

员工ID

LuRuYuanID

int

外键

录入员ID

YuanGongZhuangTaiID

int

外键

员工状态ID

MenDianID

int

外键

门店ID

ZhiWuID

Int

外键

职务ID

JueSeID

int

外键

角色ID

YuanGongBianHao

nchar(50)

 

员工编号

YuanGongXingMing

nchar(50)

 

员工姓名

XingBie

nchar(50)

 

性别

JiGuan

nchar(50)

 

籍贯

XueLi

nchar(50)

 

学历

ChuShengRiQi

date

 

出生日期

ShenFenZhengHao

nchar(18)

 

身份证号

RuZhiRiQi

data

 

入职日期

RuZhiDiDian

nchar(50)

 

入职地点

YiDongShouJi

int

 

移动手机

JiaTingDianHua

nchar(50)

 

家庭电话

DiXin

decimal(18, 2)

 

底薪

JiShiFou

bit

 

技术否

HunFou

bit

 

婚否

TongXunDiZhi

nchar(50)

 

通讯地址

BeiZhu

nchar(50)

 

备注

MiMa

nchar(50)

 

密码

 

表7:客户表(sys_KeHu)

列名

数据类型

主键/外键

说明

KeHuID

int

主键

客户ID

LuRuYuanID

int

外键

录入员ID

KeHuLeiXingID

int

外键

客户类型ID

SuoShuMenDianID

int

外键

所属门店ID

KeHuBianHao

decimal(18, 2)

 

客户编号

KeHuXingMing

Nchar(20)

 

客户姓名

XingBie

Nchar(10)

 

性别

ShenFenZhengHao

Nchar(18)

 

身份证号

YiDongShouJi

Nchar(13)

 

移动手机

JiaTingDianHua

Nchar(10)

 

家庭电话

ChuShenRiQi

Date

 

出生日期

TongXunDiZhi

Date

 

通讯地址

KeHuJiFen

Nchar(10)

 

客户积分

SuoShuDiFang

Nchar(10)

 

所属地方

QQHao

Int

 

QQ号

WeiXinHao

Nchar(10)

 

维修号

WeiBoHao

Nchar(10)

 

微博号

GenXinShiJian

datetime

 

更新时间

BeiZhi

Nchar(10)

 

备注

YouXiaoFou

Bit

 

有效否

 

表8:当日最大单号数表(DangRiZuiDaDanHaoShu)

列名

数据类型

主键/外键

说明

ZuiDaDanHaoShuID

int

主键

最大单号数ID

CaiGouDanHao

int

 

采购单号

CaiGouTuiHuoDanHao

int

 

采购退货单号

XiaoShouDanHao

int

 

销售单号

XiaoShouTuiHuoDanHao

int

 

销售退货单号

XiaoShouBaoXiuDanHao

int

 

销售保修单号

XiaoShouHuanHuoDanHao

int

 

销售换货单号

GongDanBianHao

int

 

工单编号

ChuKuDanHao

int

 

出库单号

RuKuDanHao

int

 

入库单号

JieZhangDanHao

int

 

结账单号

WaiPaiDanJuHao

int

 

外派单据号

QuBiaoFuKuanDanJuHao

int

 

取表付款单据号

FuKuanBianHao

int

 

付款单号

 

1、录入保修单窗体的Load事件

第一步:数据库的存储过程

IF (@type='frmXiaoShouBaoXiu_Insert_Load_SelectFuKuanZhuangTai')
	BEGIN
		SELECT		ShuXingMingXiID AS ShuXingMingXiID,LTRIM(RTRIM(ShuXingMingXiMingCheng))AS ShuXingMingXiMingCheng
		FROM		sys_ShuXingMingXi
		WHERE		ShuXingJiHeID=17 AND YouXiaoFou=1
	END

第二步:逻辑层代码

public DataTable frmXiaoShouBaoXiu_Insert_Load_SelectFuKuanZhuangTai()
        {
            SqlParameter[] mySqlParameters ={
                                                new SqlParameter("@TYPE",SqlDbType.Char),
                                            };
            mySqlParameters[0].Value = "frmXiaoShouBaoXiu_Insert_Load_SelectFuKuanZhuangTai";

            return myDALMethod.QueryDataTable("frmXiaoShouBaoXiu", mySqlParameters);
        }

第三步:界面层代码

BLL.BLL_XiaoShouGuanLi.frmXiaoShouBaoXiu myfrmXiaoShouBaoXiu = new BLL.BLL_XiaoShouGuanLi.frmXiaoShouBaoXiu();//实例化逻辑层
        int intXiaoShouDanID = 0;//销售单ID
        TabControl myTabControlp;//选项卡页集

        /// <param name="myTabControl">主界面的选项卡控件(用于关闭当前选项卡)</param>
        public frmXiaoShouBaoXiu_Insert(TabControl myTabControl)
        {
            myTabControlp = myTabControl;//赋值给此窗体创建的变量myTabControlp
            InitializeComponent();
            btnBaoCun.BackColor = Color.FromArgb(80, 225, 225, 225);//改变Button的样式
        }

private void frmXiaoShouBaoXiu_Insert_Load(object sender, EventArgs e)
        {
            dgvChanPinMingXi.AllowUserToAddRows = false;//设置不让用户手动添加行
            dgvChanPinMingXi.AutoGenerateColumns = false;//设置不自动添加列

            cboFuKuanZhuangTai.DataSource = myfrmXiaoShouBaoXiu.frmXiaoShouBaoXiu_Insert_Load_SelectFuKuanZhuangTai();//查询付款状态,绑定下拉框
            cboFuKuanZhuangTai.DisplayMember = "ShuXingMingXiMingCheng";//设置显示文本
            cboFuKuanZhuangTai.ValueMember = "ShuXingMingXiID";//设置值文本
            cboFuKuanZhuangTai.SelectedIndex = -1;//默认为不选中任何数据

            txtBaoXiuDanBianHao.Text = "自动生成";//保修单编号是保存的时候自动生成
        }

2、选择销售单功能实现

第一步:选择销售单按钮的单击事件


(1)数据库的存储过程

IF (@TYPE = 'frmXiaoShouBaoXiu_Insert_btnTianJia_ChaXunXiaoShouDanMingXi')
	BEGIN
	SELECT     pw_XiaoShouDanMingXi.ChanPinID, pw_XiaoShouDanMingXi.CangWeiID, sys_CangWei.CangWeiMingCheng, sys_KuCun.KuCunShuLiang, pw_XiaoShouDanMingXi.DanJia AS XiaoShouDanJia, 
                      pw_XiaoShouDanMingXi.ShuLiang AS XiaoShouShuLiang, sys_ChanPinZiLiao.ChanPinZhongLeiID, sys_ChanPinZiLiao.ChanPinPinPaiID, sys_ChanPinZiLiao.ChanPinMingCheng, sys_ChanPinZiLiao.ChanPinBianHao, 
                      pw_XiaoShouDanMingXi.XiaoShouDanMingXiID, pw_XiaoShouDanMingXi.YiTuiHuoShu, sys_PinPai.PinPaiID, sys_PinPai.PinPaiMingCheng, sys_PinZhong.PinZhongMingCheng
	FROM         pw_XiaoShouDanMingXi INNER JOIN
                      sys_ChanPinZiLiao ON pw_XiaoShouDanMingXi.ChanPinID = sys_ChanPinZiLiao.ChanPinID INNER JOIN
                      sys_CangWei ON pw_XiaoShouDanMingXi.CangWeiID = sys_CangWei.CangWeiID INNER JOIN
                      sys_KuCun ON sys_CangWei.CangWeiID = sys_KuCun.CangWeiID AND sys_ChanPinZiLiao.ChanPinID = sys_KuCun.ChanPinID INNER JOIN
                      sys_PinPai ON sys_ChanPinZiLiao.ChanPinPinPaiID = sys_PinPai.PinPaiID INNER JOIN
                      sys_PinZhong ON sys_ChanPinZiLiao.ChanPinZhongLeiID = sys_PinZhong.PinZhongID
    WHERE		pw_XiaoShouDanMingXi.XiaoShouDanID=@XiaoShouDanID AND pw_XiaoShouDanMingXi.YouXiaoFou=1
	END

(2)逻辑层代码

public DataTable frmXiaoShouBaoXiu_Insert_btnTianJia_ChaXunXiaoShouDanMingXi(int intXiaoShouDanID)
        {
            SqlParameter[] mySqlParameters ={
                                                new SqlParameter("@TYPE",SqlDbType.Char),
                                                new SqlParameter("@XiaoShouDanID",SqlDbType.Int)
                                            };
            mySqlParameters[0].Value = "frmXiaoShouBaoXiu_Insert_btnTianJia_ChaXunXiaoShouDanMingXi";
            mySqlParameters[1].Value = intXiaoShouDanID;

            return myDALMethod.QueryDataTable("frmXiaoShouBaoXiu", mySqlParameters);
        }

(3)界面层代码,选择销售单按钮的单击事件

private void btnTianJia_Click(object sender, EventArgs e)
        {
            frmXuanZeXiaoShouDan myfrmXuanZeXiaoShouDan = new frmXuanZeXiaoShouDan();//实例化选择销售单窗体
            myfrmXuanZeXiaoShouDan.ShowDialog();//弹出窗体
            if (frmXuanZeXiaoShouDan.dtXiaoShouDan.Rows.Count > 0)
            {
                intXiaoShouDanID = Convert.ToInt32(frmXuanZeXiaoShouDan.dtXiaoShouDan.Rows[0]["销售单ID"]);//获取选中的销售单ID
                txtXiaoShouDanBianHao.Text = frmXuanZeXiaoShouDan.dtXiaoShouDan.Rows[0]["销售单编号"].ToString().Trim();//获取选中的销售单编号
                txtKeHuMingCheng.Text = frmXuanZeXiaoShouDan.dtXiaoShouDan.Rows[0]["客户姓名"].ToString().Trim();//获取选中的客户姓名
                cboFuKuanZhuangTai.SelectedValue = Convert.ToInt32(frmXuanZeXiaoShouDan.dtXiaoShouDan.Rows[0]["付款状态ID"]);//绑定选中的付款状态
                DataTable dtXiaoShouMingXi = myfrmXiaoShouBaoXiu.frmXiaoShouBaoXiu_Insert_btnTianJia_ChaXunXiaoShouDanMingXi(intXiaoShouDanID);//用销售单ID查询出销售单明细
                dtXiaoShouMingXi.Columns.Add("XiaoShouXiaoJi", typeof(string));//添加销售小计(列)
                dtXiaoShouMingXi.Columns.Add("DanJia", typeof(string));//添加保修单价(列)
                dtXiaoShouMingXi.Columns.Add("ShuLiang", typeof(string));//添加保修数量(列)
                dtXiaoShouMingXi.Columns.Add("XiaoJi", typeof(string));//添加保修小计(列)
                for (int i = 0; i < dtXiaoShouMingXi.Rows.Count; i++)//循环销售单明细表
                {
                    dtXiaoShouMingXi.Rows[i]["XiaoShouXiaoJi"] = (Convert.ToDecimal(dtXiaoShouMingXi.Rows[i]["XiaoShouShuLiang"]) * Convert.ToDecimal(dtXiaoShouMingXi.Rows[i]["XiaoShouDanJia"])).ToString();//计算销售小计=销售数量+销售单价
                    dtXiaoShouMingXi.Rows[i]["DanJia"] = 0;//保修单价默认为0
                    dtXiaoShouMingXi.Rows[i]["ShuLiang"] = "1";//保修数量默认为1
                    dtXiaoShouMingXi.Rows[i]["XiaoJi"] = 0;//保修小计默认为1
                }
                dgvChanPinMingXi.DataSource = dtXiaoShouMingXi;//处理完成的销售单明细表赋值给DGV
            }
            JiSuanBaoXiuFeiYong();//调用计算保修费用方法
        }

private void JiSuanBaoXiuFeiYong()
        {
            decimal decZongJinE = 0;//总金额
            for (int i = 0; i < dgvChanPinMingXi.Rows.Count; i++)//循环产品明细DGV
            {
                if (Convert.ToBoolean(dgvChanPinMingXi.Rows[i].Cells["选择"].FormattedValue) == true)//判断是否已选择
                {
                    decimal decJiaGe = 0;//每行的保修价格
                    try
                    {
                        decJiaGe = Convert.ToDecimal(dgvChanPinMingXi.Rows[i].Cells["保修单价"].Value);//获取保修价格,如果转换形态出错,则说明输入错误,跳到catch{}
                        if (decJiaGe < 0)
                        {
                            MessageBox.Show("第【" + (i + 1).ToString() + "】行,的【保修单价】不能小于零!");//保修价格不能小于0
                            dgvChanPinMingXi.Rows[i].Cells["保修单价"].Value = 0;
                            decJiaGe = 0;
                        }
                    }
                    catch
                    {
                        MessageBox.Show("第【" + (i + 1).ToString() + "】行,的【保修单价】填写不正确!");
                        dgvChanPinMingXi.Rows[i].Cells["保修单价"].Value = 0;
                        decJiaGe = 0;
                    }

                    decimal decShuLiang = 0;//每行的保修数量
                    try
                    {
                        decShuLiang = Convert.ToDecimal(dgvChanPinMingXi.Rows[i].Cells["保修数量"].Value);//获取保修数量,如果转换形态出错,则说明输入错误,跳到catch{}
                        if (Convert.ToDecimal(dgvChanPinMingXi.Rows[i].Cells["已退货数"].Value) != Convert.ToDecimal(dgvChanPinMingXi.Rows[i].Cells["销售数量"].Value))
                        {
                            if (decShuLiang < 1)
                            {
                                MessageBox.Show("第【" + (i + 1).ToString() + "】行,的【保修数量】不能小于一!");//保修数量不能小于1
                                dgvChanPinMingXi.Rows[i].Cells["保修数量"].Value = 1;
                                decShuLiang = 1;
                            }
                            if (decShuLiang + Convert.ToDecimal(dgvChanPinMingXi.Rows[i].Cells["已退货数"].Value) > Convert.ToDecimal(dgvChanPinMingXi.Rows[i].Cells["销售数量"].Value))//保修数量+已退货数不能大于销售数量
                            {
                                MessageBox.Show("第【" + (i + 1).ToString() + "】行,的【保修数量】+【已退货数】不能大于销售数量!");
                                dgvChanPinMingXi.Rows[i].Cells["保修数量"].Value = 1;
                                decShuLiang = 1;
                            }
                        }
                        if (decShuLiang % 1 != 0)//判断保修数量有没有小数
                        {
                            MessageBox.Show("第【" + (i + 1).ToString() + "】行,的【保修数量】不能为小数!");
                            dgvChanPinMingXi.Rows[i].Cells["保修数量"].Value = 1;
                            decShuLiang = 1;
                        }
                    }
                    catch
                    {
                        MessageBox.Show("第【" + (i + 1).ToString() + "】行,的【保修数量】填写不正确!");
                        dgvChanPinMingXi.Rows[i].Cells["保修数量"].Value = 1;
                        decShuLiang = 1;
                    }

                    dgvChanPinMingXi.Rows[i].Cells["保修小计"].Value = decJiaGe * decShuLiang;//计算每行的保修小计
                    if (Convert.ToBoolean(dgvChanPinMingXi.Rows[i].Cells["选择"].FormattedValue))
                    {
                        decZongJinE += Convert.ToDecimal(dgvChanPinMingXi.Rows[i].Cells["保修小计"].Value);//累加所有选中的行的保修小计
                    }
                }
            }
            txtBaoXiuFeiYong.Text = decZongJinE.ToString();//总金额赋值给保修费用文本框
            if (cboFuKuanZhuangTai.SelectedIndex == 1)
            {
                txtBaoXiuFeiYong.Text = "0";
            }
        }

第二步:选择销售单窗体的Load事件

(1)数据库的存储过程

IF (@TYPE = 'frmXiaoShouKaiDan_Select_Load_SelectFuKuanZhuangTai')
	BEGIN
		SELECT		ShuXingMingXiID AS ShuXingMingXiID,LTRIM(RTRIM(ShuXingMingXiMingCheng))AS ShuXingMingXiMingCheng
		FROM		sys_ShuXingMingXi
		WHERE		ShuXingJiHeID=17 AND YouXiaoFou=1
	END

(2)逻辑层代码

public DataTable frmXiaoShouKaiDan_Select_Load_SelectFuKuanZhuangTai()
        {
            SqlParameter[] mySqlParameters ={
                                                new SqlParameter("@TYPE",SqlDbType.Char)
                                            };
            mySqlParameters[0].Value = "frmXiaoShouKaiDan_Select_Load_SelectFuKuanZhuangTai";

            return myDALMethod.QueryDataTable("frmXiaoShouKaiDan_Select", mySqlParameters);
        }

(3)界面层代码,选择销售单窗体的Load事件

private void frmXuanZeXiaoShouDan_Load(object sender, EventArgs e)
        {
            cboYeDaXiao.Text = "20";//每页的行数,默认为20
            dgvXiaoShouDan.AllowUserToAddRows = false;//设置禁止用户自行添加行
            dgvXiaoShouDan.AutoGenerateColumns = false;//设置禁止自动添加列
            dgvXiaoShouDan.ReadOnly = true;//设置禁止编辑DGV的内容

            DataTable dtFuKuanZhuangTai = myfrmXiaoShouKaiDan_Select.frmXiaoShouKaiDan_Select_Load_SelectFuKuanZhuangTai();//查询付款状态明细,并绑定下拉框
            dtFuKuanZhuangTai.Rows.Add(2, "全部");//添加一行"2"属于"ShuXingMingXiID","全部"属于"ShuXingMingXiMingCheng"
            cboFuKuanZhuangTai.DataSource = dtFuKuanZhuangTai;//绑定数据源
            cboFuKuanZhuangTai.DisplayMember = "ShuXingMingXiMingCheng";//绑定显示的文本
            cboFuKuanZhuangTai.ValueMember = "ShuXingMingXiID";//绑定值文本
            cboFuKuanZhuangTai.SelectedIndex = 0;//默认选择第一个值(已付款)

            dtpKaiShi.Value = DateTime.Now.AddMonths(-3);//默认给开始时间减去3个月
            dtpJeiShu.Value = DateTime.Now.AddDays(1);//默认给结束时间加上1天

            if (dtXiaoShouDan.Columns.Count < 1)//如果dtXiaoShouDan还没添加过列(第一次打开此界面),则加以下列
            {
                dtXiaoShouDan.Columns.Add("销售单ID", typeof(string));//添加列("列名",typeof(数据类型))
                dtXiaoShouDan.Columns.Add("付款状态ID", typeof(string));
                dtXiaoShouDan.Columns.Add("销售单编号", typeof(string));
                dtXiaoShouDan.Columns.Add("销售日期", typeof(string));
                dtXiaoShouDan.Columns.Add("实收金额", typeof(string));
                dtXiaoShouDan.Columns.Add("客户姓名", typeof(string));
                dtXiaoShouDan.Columns.Add("付款状态", typeof(string));
                dtXiaoShouDan.Columns.Add("更新时间", typeof(string));
            }
            dtXiaoShouDan.Rows.Clear();//清空dtXiaoShouDan所有行的集合

            btnChaXun_Click(null, null);//调用查询按钮的单击事件,查询功能代码和销售记录中的查询代码一样
        }

第三步:完成选择

(1) 销售单DGV的双击事件

private void dgvXiaoShouDan_CellMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            if (dgvXiaoShouDan.Rows.Count > 0)//判断dgvXiaoShouDan是否有数据
            {
                if (dgvXiaoShouDan.CurrentRow.Cells["付款状态"].Value.ToString().Trim() == "已付款")//判断是否已付款
                {
                    dtXiaoShouDan.Rows.Clear();//清除所有行
                    dtXiaoShouDan.Rows.Add(1);//添加一行
                    dtXiaoShouDan.Rows[0]["销售单ID"] = dgvXiaoShouDan.CurrentRow.Cells["销售单ID"].Value.ToString().Trim();//给刚添加的行赋值
                    dtXiaoShouDan.Rows[0]["付款状态ID"] = dgvXiaoShouDan.CurrentRow.Cells["付款状态ID"].Value.ToString().Trim();
                    dtXiaoShouDan.Rows[0]["销售单编号"] = dgvXiaoShouDan.CurrentRow.Cells["销售单编号"].Value.ToString().Trim();
                    dtXiaoShouDan.Rows[0]["销售日期"] = dgvXiaoShouDan.CurrentRow.Cells["销售日期"].Value.ToString().Trim();
                    dtXiaoShouDan.Rows[0]["实收金额"] = dgvXiaoShouDan.CurrentRow.Cells["实收金额"].Value.ToString().Trim();
                    dtXiaoShouDan.Rows[0]["客户姓名"] = dgvXiaoShouDan.CurrentRow.Cells["客户姓名"].Value.ToString().Trim();
                    dtXiaoShouDan.Rows[0]["付款状态"] = dgvXiaoShouDan.CurrentRow.Cells["付款状态"].Value.ToString().Trim();
                    dtXiaoShouDan.Rows[0]["更新时间"] = dgvXiaoShouDan.CurrentRow.Cells["更新时间"].Value.ToString().Trim();
                    this.Dispose();//释放资源
                    this.Close();//关闭窗体
                }
                else
                {
                    MessageBox.Show("当前销售单还未付款,不能执行售后服务业务!", "提示!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                }
            }
        }

(2)确定按钮的单击事件

private void btnQueDing_Click(object sender, EventArgs e)
        {
            if (dgvXiaoShouDan.Rows.Count > 0)//判断dgvXiaoShouDan是否有数据
            {
                if (dgvXiaoShouDan.CurrentRow.Cells["付款状态"].Value.ToString().Trim() == "已付款")//判断是否已付款
                {
                    dtXiaoShouDan.Rows.Clear();//清除所有行
                    dtXiaoShouDan.Rows.Add(1);//添加一行
                    dtXiaoShouDan.Rows[0]["销售单ID"] = dgvXiaoShouDan.CurrentRow.Cells["销售单ID"].Value.ToString().Trim();//给刚添加的行赋值
                    dtXiaoShouDan.Rows[0]["付款状态ID"] = dgvXiaoShouDan.CurrentRow.Cells["付款状态ID"].Value.ToString().Trim();
                    dtXiaoShouDan.Rows[0]["销售单编号"] = dgvXiaoShouDan.CurrentRow.Cells["销售单编号"].Value.ToString().Trim();
                    dtXiaoShouDan.Rows[0]["销售日期"] = dgvXiaoShouDan.CurrentRow.Cells["销售日期"].Value.ToString().Trim();
                    dtXiaoShouDan.Rows[0]["实收金额"] = dgvXiaoShouDan.CurrentRow.Cells["实收金额"].Value.ToString().Trim();
                    dtXiaoShouDan.Rows[0]["客户姓名"] = dgvXiaoShouDan.CurrentRow.Cells["客户姓名"].Value.ToString().Trim();
                    dtXiaoShouDan.Rows[0]["付款状态"] = dgvXiaoShouDan.CurrentRow.Cells["付款状态"].Value.ToString().Trim();
                    dtXiaoShouDan.Rows[0]["更新时间"] = dgvXiaoShouDan.CurrentRow.Cells["更新时间"].Value.ToString().Trim();
                    this.Dispose();//释放资源
                    this.Close();//关闭窗体
                }
                else
                {
                    MessageBox.Show("当前销售单还未付款,不能执行售后服务业务!", "提示!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                }
            }
            else
            {
                MessageBox.Show("请查询并选择销售单,再执行确定!", "提示!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
            }
        }

3、选择需要保修的产品,和输入数量,金额功能实现

第一步:产品明细DGV的行完成验证时发生的事件

private void dgvChanPinMingXi_RowValidated(object sender, DataGridViewCellEventArgs e)
        {
            JiSuanBaoXiuFeiYong();
        }

第二步:产品明细DGV的单击事件

private void dgvChanPinMingXi_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            if (dgvChanPinMingXi.Rows.Count > 0)//判断产品明细DGV是否有数据
            {
                if (dgvChanPinMingXi.CurrentCell.ColumnIndex == 2)//判断点击的是不是"选择"这一列
                {
                    if (Convert.ToDecimal(dgvChanPinMingXi.CurrentRow.Cells["已退货数"].Value) == Convert.ToDecimal(dgvChanPinMingXi.CurrentRow.Cells["销售数量"].Value))//判断是否已经全部退货
                    {
                        MessageBox.Show("该产品已经全部退货,不能进行保修", "提示!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                        return;
                    }
                    if (Convert.ToBoolean(dgvChanPinMingXi.CurrentRow.Cells["选择"].FormattedValue))
                    {
                        dgvChanPinMingXi.CurrentRow.Cells["选择"].Value = false;//如果之前是已选,则改为未选
                    }
                    else
                    {
                        dgvChanPinMingXi.CurrentRow.Cells["选择"].Value = true;//如果之前是未选,则改为已选

                    }
                }
            }
            JiSuanBaoXiuFeiYong();//调用计算保修费用方法
        }

4、保存功能实现

第一步:数据的存储过程

IF (@type='frmXiaoShouBaoXiu_Insert_Load_ChaXunBaoXiuZuiDaDanHao')
	BEGIN
	BEGIN TRAN
		UPDATE		DangRiZuiDaDanShu
		SET			XiaoShouBaoXiuDanHao+=1
		
		SELECT     XiaoShouBaoXiuDanHao
		FROM         DangRiZuiDaDanShu
	COMMIT TRAN
	END

IF (@type='frmXiaoShouBaoXiu_Insert_btnBaoCun_InsertXiaoShouBaoXiuDan')
	BEGIN
	BEGIN TRAN 
		INSERT		pw_XiaoShouShouHouDan(XiaoShouDanID, XiaoShouShouHouLeiXingID, XiaoShouShouHouDanBianHao, RiQi, JinE, BeiZhu,LuRuYuanID)
		VALUES		(@XiaoShouDanID, @XiaoShouShouHouLeiXingID, @XiaoShouShouHouDanBianHao, @RiQi, @JinE, @BeiZhu,@LuRuYuanID)
		
		SELECT		@@IDENTITY
	COMMIT TRAN
	END

IF (@type='frmXiaoShouBaoXiu_Insert_btnBaoCun_InsertXiaoShouBaoXiuDanMingXi')
	BEGIN
		INSERT		pw_XiaoShouShouHouDanMingXi(XiaoShouShouHouDanID, ChanPinID, DanJia, ShuLiang,XiaoShouDanMingXiID)
		VALUES		(@XiaoShouShouHouDanID, @ChanPinID, @DanJia, @ShuLiang,@XiaoShouDanMingXiID)
	END

第二步:;逻辑层代码

public DataTable frmXiaoShouBaoXiu_Insert_Load_ChaXunBaoXiuZuiDaDanHao()
        {
            SqlParameter[] mySqlParameters ={
                                                new SqlParameter("@TYPE",SqlDbType.Char),
                                            };
            mySqlParameters[0].Value = "frmXiaoShouBaoXiu_Insert_Load_ChaXunBaoXiuZuiDaDanHao";

            return myDALMethod.QueryDataTable("frmXiaoShouBaoXiu", mySqlParameters);
        }

public DataTable frmXiaoShouBaoXiu_Insert_btnBaoCun_InsertXiaoShouBaoXiuDan(int intXiaoShouDanID, int intXiaoShouShouHouLeiXingID, string strXiaoShouShouHouDanBianHao, DateTime dtmRiQi, decimal decJinE, string strBeiZhu,int intLuRuYuanID)
        {
            SqlParameter[] mySqlParameters ={
                                                new SqlParameter("@TYPE",SqlDbType.Char),
                                                new SqlParameter("@XiaoShouDanID",SqlDbType.Int),
                                                new SqlParameter("@XiaoShouShouHouLeiXingID",SqlDbType.Int),
                                                new SqlParameter("@XiaoShouShouHouDanBianHao",SqlDbType.Char),
                                                new SqlParameter("@RiQi",SqlDbType.Date),
                                                new SqlParameter("@JinE",SqlDbType.Decimal),
                                                new SqlParameter("@BeiZhu",SqlDbType.Char),
                                                new SqlParameter("@LuRuYuanID",SqlDbType.Int),
                                            };
            mySqlParameters[0].Value = "frmXiaoShouBaoXiu_Insert_btnBaoCun_InsertXiaoShouBaoXiuDan";
            mySqlParameters[1].Value = intXiaoShouDanID;
            mySqlParameters[2].Value = intXiaoShouShouHouLeiXingID;
            mySqlParameters[3].Value = strXiaoShouShouHouDanBianHao;
            mySqlParameters[4].Value = dtmRiQi;
            mySqlParameters[5].Value = decJinE;
            mySqlParameters[6].Value = strBeiZhu;
            mySqlParameters[7].Value = intLuRuYuanID;

            return myDALMethod.QueryDataTable("frmXiaoShouBaoXiu", mySqlParameters);
        }

public int frmXiaoShouBaoXiu_Insert_btnBaoCun_InsertXiaoShouBaoXiuDanMingXi(int intXiaoShouShouHouDanID, int intChanPinID, decimal decDanJia, int intShuLiang, int intXiaoShouDanMingXiID)
        {
            SqlParameter[] mySqlParameters ={
                                                new SqlParameter("@TYPE",SqlDbType.Char),
                                                new SqlParameter("@XiaoShouShouHouDanID",SqlDbType.Int),
                                                new SqlParameter("@ChanPinID",SqlDbType.Int),
                                                new SqlParameter("@DanJia",SqlDbType.Decimal),
                                                new SqlParameter("@ShuLiang",SqlDbType.Int),
                                                new SqlParameter("@XiaoShouDanMingXiID",SqlDbType.Int),
                                            };
            mySqlParameters[0].Value = "frmXiaoShouBaoXiu_Insert_btnBaoCun_InsertXiaoShouBaoXiuDanMingXi";
            mySqlParameters[1].Value = intXiaoShouShouHouDanID;
            mySqlParameters[2].Value = intChanPinID;
            mySqlParameters[3].Value = decDanJia;
            mySqlParameters[4].Value = intShuLiang;
            mySqlParameters[5].Value = intXiaoShouDanMingXiID;

            return myDALMethod.UpdateData("frmXiaoShouBaoXiu", mySqlParameters);
        }

第三步:界面层,保存按钮的单击事件

private void btnBaoCun_Click(object sender, EventArgs e)
        {
            if (intXiaoShouDanID == 0 || txtXiaoShouDanBianHao.Text == "")//判断是否已经选择了销售单
            {
                MessageBox.Show("请按绿色加号按钮选择销售单!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                return;
            }
            bool bolXuanZe = false;//创建一个bool值,用于判断有没有选择产品
            for (int i = 0; i < dgvChanPinMingXi.Rows.Count; i++)
            {
                if (Convert.ToBoolean(dgvChanPinMingXi.Rows[i].Cells["选择"].FormattedValue))//判断有没有选择产品
                {
                    bolXuanZe = true;
                    break;
                }
            }
            if (bolXuanZe == false)//如果没有选择产品,则提示,返回
            {
                MessageBox.Show("请打钩选择要保修的产品!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                return;
            }
            int intXiaoShouShouHouLeiXingID = 50;//获取销售售后类型ID,这里默认50是保修类型
            string strXiaoShouShouHouDanBianHao = DangRiBaoXiuZuiDaDanJuShu("BX");//获取保修单编号
            DateTime dtmRiQi = dtpBaoXiuRiQi.Value;//获取保修日期
            decimal decJinE = Convert.ToDecimal(txtBaoXiuFeiYong.Text);//获取保修总金额
            string strBeiZhu = txtBaoXiuNeiRong.Text;//获取备注
            int intXiaoShouShouHouDanID = Convert.ToInt32(myfrmXiaoShouBaoXiu.frmXiaoShouBaoXiu_Insert_btnBaoCun_InsertXiaoShouBaoXiuDan(intXiaoShouDanID, intXiaoShouShouHouLeiXingID, strXiaoShouShouHouDanBianHao, dtmRiQi, decJinE, strBeiZhu, Convert.ToInt32(index2.strYuanGongXinXi[0])).Rows[0][0]);//保存保修单,Convert.ToInt32(index2.strYuanGongXinXi[0])这是获取当前登录的员工ID,作为录入员
            if (intXiaoShouShouHouDanID > 0)//判断是否保存成功
            {
                int intXuanZeCiShu = 0;//创建一个int型变量,用于记录选中产品的行数
                int intChengGongCiShu = 0;//创建一个int型变量,用于记录成功保存的产品的行数
                for (int i = 0; i < dgvChanPinMingXi.Rows.Count; i++)//循环产品明细DGV
                {
                    if (Convert.ToBoolean(dgvChanPinMingXi.Rows[i].Cells["选择"].FormattedValue))//判断是不是已选
                    {
                        intXuanZeCiShu++;//选中产品的行数自加1
                        int intXiaoShouDanMingXiID = Convert.ToInt32(dgvChanPinMingXi.Rows[i].Cells["销售单明细ID"].Value);
                        int intChanPinID = Convert.ToInt32(dgvChanPinMingXi.Rows[i].Cells["产品ID"].Value);
                        decimal decDanJia = Convert.ToDecimal(dgvChanPinMingXi.Rows[i].Cells["保修单价"].Value);
                        int intShuLiang = Convert.ToInt32(dgvChanPinMingXi.Rows[i].Cells["保修数量"].Value);
                        if (myfrmXiaoShouBaoXiu.frmXiaoShouBaoXiu_Insert_btnBaoCun_InsertXiaoShouBaoXiuDanMingXi(intXiaoShouShouHouDanID, intChanPinID, decDanJia, intShuLiang, intXiaoShouDanMingXiID) > 0)
                        {
                            intChengGongCiShu++;//成功保存的产品的行数自加1
                        }
                    }
                }
                if (intChengGongCiShu == intXuanZeCiShu && intChengGongCiShu > 0)//判断是否全部保存成功
                {
                    if (MessageBox.Show("新增成功,销售保修单编号【" + strXiaoShouShouHouDanBianHao + "】\n是否继续新增?", "提示!", MessageBoxButtons.YesNo, MessageBoxIcon.Asterisk) == DialogResult.Yes)
                    {
                        dtpBaoXiuRiQi.Value = DateTime.Now;
                        txtKeHuMingCheng.Text = "";
                        txtBaoXiuNeiRong.Text = "";
                        txtBaoXiuFeiYong.Text = "";
                        txtXiaoShouDanBianHao.Text = "";
                        cboFuKuanZhuangTai.SelectedIndex = -1;
                        intXiaoShouDanID = 0;
                        dgvChanPinMingXi.DataSource = null;
                    }
                    else
                    {
                        this.Dispose();
                        this.Close();
                        myTabControlp.TabPages.Remove(myTabControlp.SelectedTab);//关闭当前选项卡
                    }
                }
                else
                {
                    MessageBox.Show("新增失败!", "提示!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            else
            {
                MessageBox.Show("新增失败!", "提示!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

private string DangRiBaoXiuZuiDaDanJuShu(string strQianZhui)
        {
            string strDanJuShu = (Convert.ToInt32(myfrmXiaoShouBaoXiu.frmXiaoShouBaoXiu_Insert_Load_ChaXunBaoXiuZuiDaDanHao().Rows[0][0])).ToString();//查询当日最大保修单据数
            if (strDanJuShu.Length == 1)//如果是一位数则,在前面加000
            {
                strDanJuShu = "000" + strDanJuShu;
            }
            if (strDanJuShu.Length == 2)
            {
                strDanJuShu = "00" + strDanJuShu;
            }
            if (strDanJuShu.Length == 3)
            {
                strDanJuShu = "0" + strDanJuShu;
            }
            string Nian = DateTime.Now.Year.ToString();//获取当前年份
            string Yue = DateTime.Now.Month.ToString();//获取当前月份
            Yue = (Yue.Length < 2) ? ("0" + Yue) : Yue;//如果是一位数,则在前面加0
            string Ri = DateTime.Now.Day.ToString();//获取当前天数
            Ri = (Ri.Length < 2) ? ("0" + Ri) : Ri;//如果是一位数,则在前面加0

            return strQianZhui + Nian + Yue + Ri + strDanJuShu;//返回拼接完成的保修单编号
        }

注:此文章只供学习参考,禁止用于商业用途。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值