2.2.4 废票
在售票过程中有一些票被打坏等情况,可以进行废票处理
2.2.4(图1)
从界面上可以看到我们这里用到的控件有
控件名称 | 说明 |
文字(Label) | 控件可以在工具箱直接拖动至窗体,拖至窗体后右击属性可以修改控件的样式和各种属性,还可以编辑事件。右击控件选择属性,在跳出框里面选择带有雷电的图标,在里面可以选择属性 |
下拉框(ComboBox) | |
文本(TextBox) | |
按钮(Button) | |
表格(DataGridView) | |
容器(Panel) | |
日期控件(DateTimePicker) |
功能实现:
第一步:数据库
1、表与关系
2.2.4(图2)
表1.站点表(StationList)
列名 | 数据类型 | 主键/外键 | 说明 |
StationID | int | 主键 | 站点ID |
StationNumber | char (100) |
| 站点编号 |
StationName | char (100) |
| 站点名称 |
StopNo | bit |
| 停用否 |
表2.车辆表(VehicleList)
列名 | 数据类型 | 主键/外键 | 说明 |
VehicleID | int | 主键 | 车辆ID |
VehicleNumber | char (100) | Yes | 车辆编号 |
VehicleBlockNumber | char (100) | Yes | 车牌号 |
VehicleStateID | int | 外键 | 车辆状态表.车辆状态ID |
MotorcadeID | int | 外键 | 车队表.车队ID |
VehicleClearID | int | 外键 | 车辆明细表.车辆明细ID |
VehicleTypeID | int | 外键 | 车型表.车型ID |
DriverID | int | 外键 | 司机表.司机ID |
DeputyDriverOneID | int | 外键 | 司机表.副司机1ID |
DeputyDriverTwoID | int | 外键 | 司机表.副司机2ID |
StationID | int | 外键 | 站点表.车站ID |
LineID | int | 外键 | 线路表.线路ID |
OpenVehicleTime | datetime |
| 发车时间 |
ASeatNumberID | int | 外键 | 座号表.座号ID |
FeeRateID | int | 外键 | 费用表.费用ID |
SeatNumber | char (100) |
| 座位数 |
AddSeatNumber | char (100) |
| 加座数 |
Remarks | char (100) |
| 备注 |
ClassesLongStopID | int | 外键 | 班次长停表.班次长停ID |
ClassesRepeatID | int | 外键 | 扣费表.扣费ID |
Classes | char (100) |
| 班次 |
OpenVehicleSiteID | int | 外键 | 站点表.发车站 ID |
EndVehicleSiteID | int | 外键 | 站点表.终点站ID |
DeductFeeNo | bit |
| 扣费否 |
MotorNumber | char (100) |
| 车队编号 |
VehicleAlterTypeCase | char (100) |
| 车辆改型情况 |
WhetherCheck | char (100) |
| 安检情况 |
SafeCheckNo | bit |
| 安检否 |
表3.座位表(ASeatNumberList)
列名 | 数据类型 | 主键/外键 | 说明 |
ASeatNumberID | int - Identity | 主键 | 座号ID |
ASeatNumber | char (10) |
| 座号 |
VehicleID | int | 外键 | 车辆表.车辆ID |
SeatStateID | int | 外键 | 座位状态表.座位状态ID |
UserNo | bit |
| 有用否 |
LinkNo | bit |
| 连接否 |
表4.票号表(TicketNumberList)
列名 | 数据类型 | 主键/外键 | 说明 |
TicketNumberID | int | 主键 | 票号ID |
TicketNumber | char (100) |
| 票号 |
ASeatNumberID | int | 外键 | 座位表.座号ID |
UserNo | bit |
| 有用否 |
表5:票据表 (BillList)
列名 | 数据类型 | 主键/外键 | 说明 |
BillID | int | 主键 | .票据ID |
TicketNumber | char(100) |
| 票号 |
GetOnStation | char(100) |
| 上车站 |
GetOffStation | char(100) |
| 下车站 |
BillTypeID | int | 外键 | 票据类型表.票据类型ID |
BillStatusID | int | 外键 | 票据状态表.票据状态ID |
SellTicKetTime | datetime |
| 买票时间 |
SellTicketSatffID | int | 外键 | 员工表.售票员ID |
ASeatNumberID | int | 外键 | 座位表.座位ID |
SellTicKetYuan | decimal(18, 3) |
| 买票金额 |
CheckTicketID | int | 外键 | 检票表.检票ID |
TicketNumberID | int | 外键 | 票号表.票号ID |
表6.员工表(dbo.StaffList)
列名 | 数据类型 | 主键/外键 | 说明 |
StaffID | int | 主键 | 员工ID |
StaffNumber | char (100) |
| 员工编号 |
StaffName | char (100) |
| 员工姓名 |
Sex | char (100) |
| 性别 |
IdentityCardNumber | char (100) |
| 身份证号 |
HomeLocation | char (100) |
| 家庭地址 |
Phone | char (100) |
| 电话 |
StaffTypeID | int | 外键 | 员工类型表.员工类型ID |
OrganizationID | int | 外键 | 机构表.机构ID |
StationID | int | 外键 | 站点表.站点ID |
Remarks | char (100) |
| 备注 |
LeaveOfficeNo | bit |
| 离职否 |
InvokingNo | bit |
| 调用否 |
Date | datetime |
| 日期 |
Photo | nvarchar (3000) |
| 相片 |
表7.站点表(StationList)
列名 | 数据类型 | 主键/外键 | 说明 |
StationID | int | 主键 | 站点ID |
StationNumber | char (100) |
| 站点编号 |
StationName | char (100) |
| 站点名称 |
StopNo | bit |
| 停用否 |
表8.票据类型表(BillTypeList)
列名 | 数据类型 | 主键/外键 | 说明 |
BillTypeID | int | 主键 | 票据类型ID |
BillTypeName | char (100) |
| 票据类型名称 |
TicketPrice | decimal (18, 3) |
| 票价 |
表9.废票表(AbolishTicketList)
列名 | 数据类型 | 主键/外键 | 说明 |
AbolishTicketID | int | 主键 | 废票ID |
AbolishTicketCause | char (100) |
| 废票原因 |
BillID | int | 外键 | 票据表.票据ID |
SatffID | int | 外键 | 员工表.员工ID |
AbandonTicketTime | datetime |
| 废票时间 |
1.dgv绑定票据信息
第一步:数据库的存储过程
IF @TYPE='frmAbolishTicket_SelectAbolishTicket'--dgv绑定票据信息
BEGIN
SELECT ASeatNumberList.ASeatNumberID, VehicleList.VehicleID, LTRIM(RTRIM(VehicleList.VehicleBlockNumber))AS VehicleBlockNumber, LTRIM(RTRIM(ASeatNumberList.ASeatNumber))AS ASeatNumber,
LTRIM(RTRIM(BillList.GetOffStation))AS GetOffStation, LTRIM(RTRIM(BillList.GetOnStation))AS GetOnStation, LTRIM(RTRIM(BillTypeList.BillTypeName))AS BillTypeName,
LTRIM(RTRIM(BillList.SellTicKetYuan))AS SellTicKetYuan, BillList.SellTicKetTime, LTRIM(RTRIM(StaffList.StaffName))AS StaffName, LTRIM(RTRIM(VehicleList.Classes))AS Classes, VehicleList.OpenVehicleTime,
StationList.StationID AS OpenVehicleSiteID, LTRIM(RTRIM(StationList.StationName)) AS OpenVehicleSite, StationList_1.StationID AS EndVehicleSiteID, LTRIM(RTRIM(StationList_1.StationName)) AS EndVehicleSite,
LTRIM(RTRIM(TicketNumberList.TicketNumber))AS TicketNumber, AbolishTicketList.BillID, StaffList_1.StaffID, LTRIM(RTRIM(StaffList_1.StaffName)) AS StaffNameOne, AbolishTicketList.AbandonTicketTime,
LTRIM(RTRIM(AbolishTicketList.AbolishTicketCause))AS AbolishTicketCause, TicketNumberList.TicketNumberID
FROM ASeatNumberList INNER JOIN
VehicleList ON ASeatNumberList.VehicleID = VehicleList.VehicleID INNER JOIN
BillList ON ASeatNumberList.ASeatNumberID = BillList.ASeatNumberID INNER JOIN
BillTypeList ON BillList.BillTypeID = BillTypeList.BillTypeID INNER JOIN
StaffList ON BillList.SellTicketSatffID = StaffList.StaffID INNER JOIN
StationList ON VehicleList.OpenVehicleSiteID = StationList.StationID INNER JOIN
StationList AS StationList_1 ON VehicleList.EndVehicleSiteID = StationList_1.StationID INNER JOIN
AbolishTicketList ON BillList.BillID = AbolishTicketList.BillID INNER JOIN
StaffList AS StaffList_1 ON AbolishTicketList.SatffID = StaffList_1.StaffID INNER JOIN
TicketNumberList ON BillList.TicketNumberID = TicketNumberList.TicketNumberID
第二步:逻辑层(BLL)代码
[OperationContract]
public DataSet frmAbolishTicket_SelectAbolishTicket()//dgv绑定票据信息
{
SqlParameter[] mySqlParameter = { new SqlParameter("@Type", SqlDbType.Char) };
mySqlParameter[0].Value = "frmAbolishTicket_SelectAbolishTicket";
DataTable myDataTable = myDALMethod.QueryDataTable("SellTicketManage_frmAbolishTicket", mySqlParameter);
DataSet myDataSet = new DataSet();
myDataSet.Tables.Add(myDataTable);
return myDataSet;
}
第三步:界面层(UIL)代码,在窗体的Load事件中绑定dgv的数据
private void frmAbolishTicket_Load(object sender, EventArgs e)
{
DataTable dtAbolishTicket = myfrmAbolishTicketClient.frmAbolishTicket_SelectAbolishTicket().Tables[0];//获取数据
dgvReturnATicketRecord.DataSource = dtAbolishTicket;//给dgv绑定数据
}
1.废票的实现
第一步:数据库的存储过程
@BillID INT=0,
@ASeatNumberID INT=0,
IF @TYPE='frmAbolishTicket_UpdateTicketStaue'--修改票据信息
BEGIN
Update BillList
set BillList.BillStatusID=5--修改票据状态
WHERE BillList.BillID=@BillID--获取一条数据
UPDATE ASeatNumberList
set ASeatNumberList.SeatStateID=3--修改座位状态
WHERE ASeatNumberList.ASeatNumberID=@ASeatNumberID
END
IF @TYPE='frmAbolishTicket_InsertAbolishTicket'--新增废票
BEGIN
INSERT INTO AbolishTicketList(AbolishTicketCause, BillID, SatffID, AbandonTicketTime)
VALUES (@AbolishTicketCause, @BillID, @SatffID, @AbandonTicketTime)
END
第二步:逻辑层(BLL)代码
[OperationContract]
public DataSet frmAbolishTicket_UpdateTicketStaue(int intBillID, int intASeatNumberID)//修改票据状态,修改座位状态
{
SqlParameter[] mySqlParameter = { new SqlParameter("@Type", SqlDbType.Char),
new SqlParameter("@BillID", SqlDbType.Int),
new SqlParameter("@ASeatNumberID", SqlDbType.Int)};
mySqlParameter[0].Value = "frmAbolishTicket_UpdateTicketStaue";
mySqlParameter[1].Value = intBillID;
mySqlParameter[2].Value = intASeatNumberID;
DataTable myDataTable = myDALMethod.QueryDataTable("SellTicketManage_frmAbolishTicket", mySqlParameter);
DataSet myDataSet = new DataSet();
myDataSet.Tables.Add(myDataTable);
return myDataSet;
}
[OperationContract]
public int frmAbolishTicket_InsertAbolishTicket(string strAbolishTicketCause, int BillID, int SatffID, DateTime dtAbandonTicketTime)//废票新增
{
SqlParameter[] mySqlParameter = { new SqlParameter("@Type", SqlDbType.Char),
new SqlParameter("@AbolishTicketCause", SqlDbType.Char),
new SqlParameter("@BillID", SqlDbType.Int),
new SqlParameter("@SatffID", SqlDbType.Int),
new SqlParameter("@AbandonTicketTime", SqlDbType.DateTime),};
mySqlParameter[0].Value = "frmAbolishTicket_InsertAbolishTicket";
mySqlParameter[1].Value = strAbolishTicketCause;
mySqlParameter[2].Value = BillID;
mySqlParameter[3].Value = SatffID;
mySqlParameter[4].Value = dtAbandonTicketTime;
return myDALMethod.UpdateData("SellTicketManage_frmAbolishTicket", mySqlParameter);
}
第三步:界面层(UIL)代码
private void btnAbolishTicket_Click(object sender, EventArgs e)//废票
{
if (Convert.ToInt32(cboTicketNumber.SelectedValue) > 0)
{
if (MessageBox.Show("确定该票已报废?", "系统提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Asterisk) == DialogResult.OK)//提示框,有确定和取消按钮
{
DataTable dtTicketNews = myfrmReturnATicketClient.frmReturnATicket_SelectTicketNews(PublicStaticObject.intTicketNumberID).Tables[0];//获取一行数据
string strAbolishTicketCause = txtAbolishTicketCause.Text.ToString().Trim();
int SatffID = PublicStaticObject.intSatffTwo;
int BillID = (int)dtTicketNews.Rows[0]["BillID"];
DateTime dtAbandonTicketTime = Convert.ToDateTime(txtAbolishTicketTime.Text);
int i = myfrmAbolishTicketClient.frmAbolishTicket_InsertAbolishTicket(strAbolishTicketCause, BillID, SatffID, dtAbandonTicketTime);
int BillIDOne = (int)dtTicketNews.Rows[0]["BillID"];
int ASeatNumberID = (int)dtTicketNews.Rows[0]["ASeatNumberID"];
if (i > 0)//判断i是否大于0
{
int intTicketNumberID = (int)dtTicketNews.Rows[0]["TicketNumberID"];
myfrmReturnATicketClient.frmReturnATicket_UpdateTicketStaue(BillID, ASeatNumberID, intTicketNumberID).Tables[0].ToString().Trim();
myfrmAbolishTicketClient.frmAbolishTicket_UpdateTicketStaue(BillIDOne, ASeatNumberID).Tables[0].ToString().Trim();//执行这个方法
// myfrmSellTicketClient.frmSellTicket_UpdateTicketUserNo(intTicketNumberID);
int intASeatNumberID = ASeatNumberID;//赋值,获取ID
//myfrmSellTicketClient.frmSellTicket_UpdateLineNo(intASeatNumberID);
string KnowName = "于" + dtAbandonTicketTime + "废一张班次为" + txtClasses.Text.ToString().Trim() + "票号为" + cboTicketNumber.Text.ToString().Trim() + "的票";//提示框
myfrmMainClient.frmMain_InsertKnow(KnowName);
MessageBox.Show("废票完成!");//提示框
frmAbolishTicket_Load(null, null);//执行load事件
txtAbolishTicketCause.Text = "";//文本的值为空
}
else
{
MessageBox.Show("废票失败!");
frmAbolishTicket_Load(null, null);
txtAbolishTicketCause.Text = "";
}
}
}
else
{
MessageBox.Show("请选择票号!");
}
}
3.下拉框的绑定请查看登陆界面的实现,查询的实现请查看售票管理(库存/取票),dgv的绑定请查看售票管理(退票)
仅供学习,禁止用于商业用途