客运综合管理系统项目—售票管理(退票)
发布时间
阅读量:
阅读量
2.2.3 退票
售出的票在一定的时间内可以进行退票处理,超出了一定的时间,车票就不能再退,退票金额按离出车时间的不同而不同.

2.2.3(图1)
从界面上可以看到我们这里用到的控件有
| 控件名称 | 说明 |
|---|---|
| 文字(Label) | 控件可以在工具箱直接拖动至窗体,拖至窗体后右击属性可以修改控件的样式和各种属性,还可以编辑事件。右击控件选择属性,在跳出框里面选择带有雷电的图标,在里面可以选择属性 |
| 下拉框(ComboBox) | |
| 文本(TextBox) | |
| 按钮(Button) | |
| 表格(DataGridView) | |
| 容器(Panel) | |
| 日期控件(DateTimePicker) |
功能实现:
第一步:数据库
1、表与关系

2.2.3(图2)
表1.员工表(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) | 相片 |
表2.车辆类型表(VehicleTypeList)
| 列名 | 数据类型 | 主键/外键 | 说明 |
|---|---|---|---|
| VehicleTypeID | int | 主键 | 车辆类型ID |
| VehicleTypeName | char (100) | 车辆类型名称 |
表3.司机表(DriverList)
| 列名 | 数据类型 | 主键/外键 | 说明 |
|---|---|---|---|
| DriverID | int - Identity | 主键 | 司机ID |
| DriverNumber | char (100) | 司机编号 | |
| WorkValue | char (100) | 工价 | |
| DriveCardNumber | char (100) | 驾驶证号 | |
| GrantDriveVehicleTypeID | int | 外键 | 车型表.准驾车型ID |
| FollowEnterpriseQualificationCard | char (100) | 从业资格证 | |
| CardCheckDate | datetime | 证件验期 | |
| Remarks | char (100) | 备注 | |
| MountGuardCardValidityDate | datetime | 上岗证有效期 |
表4.站点表(StationList)
| 列名 | 数据类型 | 主键/外键 | 说明 |
|---|---|---|---|
| StationID | int | 主键 | 站点ID |
| StationNumber | char (100) | 站点编号 | |
| StationName | char (100) | 站点名称 | |
| StopNo | bit | 停用否 |
表5.车辆表(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 | 安检否 |
表6.出车表(OutVehicleList)
| 列名 | 数据类型 | 主键/外键 | 说明 |
|---|---|---|---|
| OutVehicleID | int | 主键 | 出车ID |
| VehicleStateID | int | 外键 | 车辆状态ID |
| OutVehicleTime | datetime | 出车时间 | |
| VehicleID | int | 外键 | 车辆ID |
| UserTo | int | 是否有用 |
表7.车辆状态表(VehicleStateList)
| 列名 | 数据类型 | 主键/外键 | 说明 |
|---|---|---|---|
| VehicleStateID | int | 主键 | 车辆状态ID |
| VehicleStateName | char (100) | 车辆状态名称 |
表8.线路表(LineList)
| 列名 | 数据类型 | 主键/外键 | 说明 |
|---|---|---|---|
| LineID | int - Identity | 主键 | 线路ID |
| LineName | char (100) | 线路名称 | |
| VehicleID | int | 外键 | 车辆表.车辆ID |
| Remarks | char (100) | 备注 | |
| StopNo | bit | 停用否 |
表9:票据表 (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 |
表10:退票表(ReturnATicketDetailedStatement)
| 列名 | 数据类型 | 主键/外键 | 说明 |
|---|---|---|---|
| ReturnATicketClearID | int | 主键 | 退票ID |
| ReturnATicketNumber | char(100) | 退票号 | |
| BillTypeID | char(100) | 外键 | 票据类型表.票据类型ID |
| StationAffairFee | decimal(18, 2) | 站务费 | |
| ReturnATicketTime | datetime | 废票时间 | |
| ProcedureFeeRate | decimal(18, 0) | 手续费率 | |
| ReturnSum | decimal(18, 2) | 退还金额 | |
| TimeDifference | char(100) | 时差 | |
| ReturnATicketOperatorID | int | 外键 | 员工表.退票操作员ID |
| BillID | int | 外键 | 票据表.票据ID |
表11.票据状态表(BillStatusList)
| 列名 | 数据类型 | 主键/外键 | 说明 |
|---|---|---|---|
| BillStatusID | int | 主键 | 票据状态ID |
| BillStatus | char (100) | 票据状态 |
表12.票据类型表(BillTypeList)
| 列名 | 数据类型 | 主键/外键 | 说明 |
|---|---|---|---|
| BillTypeID | int - Identity | 主键 | 票据类型ID |
| BillTypeName | char (100) | 票据类型名称 | |
| TicketPrice | decimal (18, 3) | 票价 |
表13.座位表(ASeatNumberList)
| 列名 | 数据类型 | 主键/外键 | 说明 |
|---|---|---|---|
| ASeatNumberID | int - Identity | 主键 | 座号ID |
| ASeatNumber | char (10) | 座号 | |
| VehicleID | int | 外键 | 车辆表.车辆ID |
| SeatStateID | int | 外键 | 座位状态表.座位状态ID |
| UserNo | bit | 有用否 | |
| LinkNo | bit | 连接否 |
表14.票号表(TicketNumberList)
| 列名 | 数据类型 | 主键/外键 | 说明 |
|---|---|---|---|
| TicketNumberID | int | 主键 | 票号ID |
| TicketNumber | char (100) | 票号 | |
| ASeatNumberID | int | 外键 | 座位表.座号ID |
| UserNo | bit | 有用否 |
表15.座位状态表(SeatStateList)
| 列名 | 数据类型 | 主键/外键 | 说明 |
|---|---|---|---|
| SeatStateID | int | 主键 | 座位状态ID |
| SeatState | char (100) | | 座位状态
||
1、根据下拉框的数据绑定票据信息

第一步:根据下拉框的数据绑定票据信息数据库的存储过程
IF @TYPE='frmReturnATicket_SelectTicketNews'--绑定票信息,车辆,座位,票据等信息
BEGIN
SELECT ASeatNumberList.ASeatNumberID, VehicleList.VehicleID, VehicleList.VehicleBlockNumber, ASeatNumberList.ASeatNumber, TicketNumberList.TicketNumber, BillList.GetOffStation,
BillList.GetOnStation, BillList.TicketNumber, BillTypeList.BillTypeName, BillList.SellTicKetYuan, BillList.SellTicKetTime, StaffList.StaffName, VehicleList.Classes,
StationList.StationID AS OpenVehicleSiteID, StationList.StationName AS OpenVehicleSite, StationList_1.StationID AS EndVehicleSiteID, StationList_1.StationName AS EndVehicleSite, BillList.BillID,
OutVehicleList.OutVehicleTime, TicketNumberList.TicketNumberID
FROM StationList INNER JOIN
ASeatNumberList INNER JOIN
TicketNumberList ON ASeatNumberList.ASeatNumberID = TicketNumberList.ASeatNumberID INNER JOIN
VehicleList ON ASeatNumberList.VehicleID = VehicleList.VehicleID ON StationList.StationID = VehicleList.OpenVehicleSiteID INNER JOIN
StationList AS StationList_1 ON VehicleList.EndVehicleSiteID = StationList_1.StationID INNER JOIN
OutVehicleList ON VehicleList.VehicleID = OutVehicleList.VehicleID INNER JOIN
BillTypeList INNER JOIN
BillList ON BillTypeList.BillTypeID = BillList.BillTypeID INNER JOIN
StaffList ON BillList.SellTicketSatffID = StaffList.StaffID ON TicketNumberList.TicketNumberID = BillList.TicketNumberID
WHERE TicketNumberList.TicketNumberID=@TicketNumberID and ASeatNumberList.SeatStateID = 2 and BillList.BillStatusID=3 AND OutVehicleList.UserTo=1--座位状态为订,车辆明细表有用否为是
END
第二步:根据下拉框的数据绑定票据信息逻辑层(BLL)代码
[OperationContract]
public DataSet frmReturnATicket_SelectTicketNews(int intTicketNumberID)//绑定票信息,车辆,座位,票据等信息
{
SqlParameter[]mySqlParameter = { new SqlParameter("@Type", SqlDbType.Char),
new SqlParameter("@TicketNumberID", SqlDbType.Int)};
mySqlParameter[0].Value = "frmReturnATicket_SelectTicketNews";
mySqlParameter[1].Value =intTicketNumberID;
DataTablemyDataTable = myDALMethod.QueryDataTable("SellTicketManage_frmReturnATicket",mySqlParameter);
DataSetmyDataSet = new DataSet();
myDataSet.Tables.Add(myDataTable);
returnmyDataSet;
}
第三步:根据下拉框的数据绑定票据信息界面层(UIL)代码,
private void cboTicketNumber_DropDownClosed(object sender, EventArgs e)//在下拉框选择数据后执行,绑定票信息,车辆,座位,票据等信息
{
try
{
PublicStaticObject.intTicketNumberID = Convert.ToInt32(cboTicketNumber.SelectedValue);//根据下拉框选择的值来获取票号ID
DataTable dtTicketNews = myfrmReturnATicketClient.frmReturnATicket_SelectTicketNews(PublicStaticObject.intTicketNumberID).Tables[0];//获取票据信息
//下面的是给文本框等绑定数据,即绑定票据信息
cboTicketNumber.Text = dtTicketNews.Rows[0]["TicketNumber"].ToString().Trim();
txtClasses.Text = dtTicketNews.Rows[0]["Classes"].ToString().Trim();
dtpOpenVehicleDate.Text = dtTicketNews.Rows[0]["OutVehicleTime"].ToString().Trim();
dtpOpenVehicleTime.Text = dtTicketNews.Rows[0]["OutVehicleTime"].ToString().Trim();
txtTicketType.Text = dtTicketNews.Rows[0]["BillTypeName"].ToString().Trim();
txtPrice.Text = dtTicketNews.Rows[0]["SellTicKetYuan"].ToString().Trim();
txtSeatNumber.Text = dtTicketNews.Rows[0]["ASeatNumber"].ToString().Trim();
txtStartSite.Text = dtTicketNews.Rows[0]["OpenVehicleSite"].ToString().Trim();//
txtGetOnStation.Text = dtTicketNews.Rows[0]["GetOnStation"].ToString().Trim();
txtArriveStation.Text = dtTicketNews.Rows[0]["GetOffStation"].ToString().Trim();
txtEndVehicleSite.Text = dtTicketNews.Rows[0]["EndVehicleSite"].ToString().Trim();
txtSellTicketDate.Text = dtTicketNews.Rows[0]["SellTicKetTime"].ToString().Trim();
}
catch
{ }
}
2、退票的实现

第一步:退票数据库的存储过程
IF @TYPE='frmReturnATicket_InsertRetureTicket'--新增退票信息
BEGIN
INSERT INTO ReturnATicketClearList(StationAffairFee, ReturnATicketTime, BillID, ProcedureFeeRate,
ReturnSum, TimeDifference, ReturnATicketOperatorID)
VALUES (@StationAffairFee, @ReturnATicketTime, @BillID, @ProcedureFeeRate,
@ReturnSum, @TimeDifference, @ReturnATicketOperatorID)
END
IF @TYPE='frmReturnATicket_UpdateTicketStaue'
BEGIN
Update BillList
set BillList.BillStatusID=4--修改座位状态
WHERE BillList.BillID=@BillID
UPDATE ASeatNumberList
set ASeatNumberList.SeatStateID=3--修改座位状态
WHERE ASeatNumberList.ASeatNumberID=@ASeatNumberID
UPDATE TicketNumberList
SET TicketNumberList.UserNo=1--修改票号的有用否
WHERE TicketNumberList.TicketNumberID=@TicketNumberID
END
第二步:
退票逻辑层(BLL)代码
[OperationContract]
public int frmReturnATicket_InsertRetureTicket(string strStationAffairFee,DateTime dtReturnATicketTime,int BillID,
string strProcedureFeeRate,decimal decReturnSum,string strTimeDifference,int intReturnATicketOperatorID)//退票
{
SqlParameter[] mySqlParameter = { new SqlParameter("@Type", SqlDbType.Char),
new SqlParameter("@StationAffairFee", SqlDbType.Char),
new SqlParameter("@ReturnATicketTime", SqlDbType.DateTime),
new SqlParameter("@BillID", SqlDbType.Int),
new SqlParameter("@ProcedureFeeRate", SqlDbType.Char),
new SqlParameter("@ReturnSum", SqlDbType.Char),
new SqlParameter("@TimeDifference", SqlDbType.Char),
new SqlParameter("@ReturnATicketOperatorID", SqlDbType.Int),};
mySqlParameter[0].Value = "frmReturnATicket_InsertRetureTicket";
mySqlParameter[1].Value = strStationAffairFee;
mySqlParameter[2].Value = dtReturnATicketTime;
mySqlParameter[3].Value = BillID;
mySqlParameter[4].Value = strProcedureFeeRate;
mySqlParameter[5].Value = decReturnSum;
mySqlParameter[6].Value = strTimeDifference;
mySqlParameter[7].Value = intReturnATicketOperatorID;
return myDALMethod.UpdateData("SellTicketManage_frmReturnATicket", mySqlParameter);
}
第三步:界面层(UIL)代码
private void btnReturnATicket_Click(object sender, EventArgs e)//退票
{
if (Convert.ToInt32(cboTicketNumber.SelectedValue) > 0)//判断下拉框获取的ID大于0
{
DataTable dtTicketNews = myfrmReturnATicketClient.frmReturnATicket_SelectTicketNews(PublicStaticObject.intTicketNumberID).Tables[0];
DateTime dtTime=Convert.ToDateTime(dtTicketNews.Rows[0]["OutVehicleTime"].ToString().Trim());
if (Convert.ToDateTime(dtTime) > Convert.ToDateTime(txtRetureTicket.Text))
{
if (MessageBox.Show("确定退票?", "系统提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Asterisk) == DialogResult.OK)
{
if (txtHandlingCharge.Text == "")
{
MessageBox.Show("手续费不能为空!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
return;
}
if (txtReturnSum.Text == "")
{
MessageBox.Show("退还金额不能为空!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
return;
}
if (txtStationAffairFee.Text == "")
{
MessageBox.Show("站务费不能为空!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
return;
}
if (txtTimeDifference.Text == "")
{
MessageBox.Show("时差不能为空!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
return;
}
string strStationAffairFee = txtStationAffairFee.Text.ToString().Trim();//获文本框的数据
string strProcedureFeeRate = txtStationAffairFee.Text.ToString().Trim();
string strTimeDifference = txtStationAffairFee.Text.ToString().Trim();
DateTime dtReturnATicketTime = Convert.ToDateTime(txtRetureTicket.Text);
decimal decReturnSum = Convert.ToDecimal(txtReturnSum.Text);
int BillID = (int)dtTicketNews.Rows[0]["BillID"];
int intReturnATicketOperatorID = PublicStaticObject.intSatffTwo;
int ASeatNumberID = (int)dtTicketNews.Rows[0]["ASeatNumberID"];
int i = myfrmReturnATicketClient.frmReturnATicket_InsertRetureTicket(strStationAffairFee, dtReturnATicketTime, BillID,
strProcedureFeeRate, decReturnSum, strTimeDifference, intReturnATicketOperatorID);
if (i > 0)
{
int intTicketNumberID = (int)dtTicketNews.Rows[0]["TicketNumberID"];
myfrmReturnATicketClient.frmReturnATicket_UpdateTicketStaue(BillID, ASeatNumberID, intTicketNumberID).Tables[0].ToString().Trim();//新增退票
string KnowName = "于" + dtReturnATicketTime + "出售一张班次为" + txtClasses.Text.ToString().Trim() + "票号为" + cboTicketNumber.Text.ToString().Trim() + "的票";//新增一条信息提示
myfrmMainClient.frmMain_InsertKnow(KnowName);
MessageBox.Show("退票成功!");//提示框
frmReturnATicket_Load(null, null);//再次执行load事件的代码
}
else
{
MessageBox.Show("退票失败!");
}
}
}
else
{
MessageBox.Show("退票时间已过,无法退票!");
}
}
else
{
MessageBox.Show("请选择票号!");
}
}
3、下拉框的绑定请阅览登陆界面的实现,查询的实现请阅览(库存/取票)
仅供学习,禁止用于商业用途
全部评论 (0)
还没有任何评论哟~
