智慧商贸系统
1, 项目概要
(1)系统设置:主要包括仓库管理、属性设置、单位设置、门店设置的功能
(2)期初数据录入:主要包括期初查询、商品信息录入、期初应收欠款录入、期初应付欠款录入、期初账户余额录入的功能
(3)慧管客:主要包括客户管理、客户分类、供应商管理、供应商分类、客户关联供应商的功能。
2, 设计与实现
说明:把自己设计的模块分类进行截图展示、该模块用到的数据表和关系描述、界面层经 典代码截图描述。 经典代码定义:界面层控件的特殊使用、数据逻辑的特殊处理。
2.1 登录和注册
登录:主要包括数据验证,登录功能,注册账号的功能
(一):登录页面:通过项目文档要求知道登录页面的要求,运用了Grid布局完成(下图是开发工具中的页面布局)。
(二):注册页面:若没有账号,可以通过点击[注册账号]按钮跳转到注册页面。
进入软件注册页面,确认软件为智慧商贸进销存专业版,若不是请点击【重新选择】按钮,进行软件版本的选择,注册账号时,手机号要进行数据验证,完成验证后,软件注册成功。
使用软件前,需用一个未在智慧商贸进销存软件注册过的能正常使用的手机号,智慧商贸进销存的免费版、专业版、连锁版及服装版为独立的四套系统,不支持账号通用。
2.2 期初数据录入
期初数据录入:查询期初商品库存、期初应收欠款、期初应付欠款以及期初账户余额。
2.2-1 功能实现
(一):期初商品库存:查询每一个仓库中的商品库存,也通过商品名,商品编号,属性搜索查询出商品。
(二):期初应收欠款:查询出客户的期初应收欠款,也通过客户名称,客户编号搜索查询出客户的期初应收欠款。
(三):期初应付欠款:查询出供应商的期初应付欠款,也通过供应商名称,供应商编号搜索查询出供应商的期初应付欠款。
(四):期初应付欠款:查询结算账户,也通过账号名称搜索查询出结算账号的信息。
首次新增商品时,会有期初库存选项;
首次新增客户或供应商时,会有期初欠款选项;
首次新增结算账户时,会有期初账户余额选项;
期初数据即初始数据,期初数据录入越完整,后期在软件中查询数据也越精确。
(五):模糊查询(期初商品库存的模糊查询)
搜索文本框中输入一个“小”,就可以查询出商品带“小”的商品。同时仓库的选择也是可以筛选商品。
2.2-2 相关业务表关系
期初数据录入:
2.2-3 经典代码
(1)模糊筛选代码实现:
/// <summary>
/// 模糊筛选(商品编号,名称,规格,属性)
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void txtWarehouse_SelectionChanged(object sender, RoutedEventArgs e)
{
string select = "";
string strS = txtWarehouse.Text.Trim();
if (strS != "")
{
select += "commodityNumber like '%" + strS + "%'" +
" or commodityName like '%" + strS + "%'" +
" or specs like '%" + strS + "%'" +
" or attribute like '%" + strS + "%'" +
" or unitName like '%" + strS + "%'";
//根据条件筛选表格数据
}
DataTable dtselect = myClient.SelectTBOTPWarehouse().Tables[0];
DataView dv = new DataView(dtselect);
DataTable dt = new System.Data.DataTable();
if (select != "")
{
dv.RowFilter = select;
dt = dv.ToTable();
}
if (select == "")
{
dt = dv.ToTable();
}
dgWarehouse.ItemsSource = dt.DefaultView;
ConsumptionPager.ShowPages(dgWarehouse, dt);
}
(2)仓库的筛选代码:
/// <summary>
/// 仓库下拉框筛选数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ck_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
try
{
//期初仓库库存(获取方法,拿数据)
DataTable dtTBOTPWarehouse = myClient.SelectTBOTPWarehouse().Tables[0];
if (Convert.ToInt32(ck.SelectedValue) >0)
{
int WarehouseID = Convert.ToInt32(ck.SelectedValue);
DataTable dtEmployeeType = myClient.SelectTBOTPWarehouseMH(WarehouseID).Tables[0];
dgWarehouse.ItemsSource = dtEmployeeType.DefaultView;
}
else
{
dgWarehouse.ItemsSource = dtTBOTPWarehouse.DefaultView;
}
}
catch (Exception)
{
return;
}
}
2.3 系统设置
系统设置:先创建了门店才能创建仓库,在新增仓库时要先选择所属门店,新增商品时需要用到基础数据单位表
2.3-1 功能实现
(一)门店管理:在[系统管理]模块——门店管理
新增门店:增加门店信息,其他信息包括门店编号,联系人,联系人电话。
修改门店:修改门店信息,其他信息包括门店编号,联系人,联系人电话。
删除门店:删除门店信息,其他信息包括门店编号,联系人,联系人电话。
门店详情:查看门店信息,其他信息包括门店编号,联系人,联系人电话。
(二)仓库管理:在[系统管理]模块——仓库管理。仓库即商品存放的地方,期初商品录入前需添加仓库,新增仓库并完善仓库基本信息(名称、编号、联系人、电话等),有利于仓库快速搜索及管理。
新增仓库:新增仓库时,要选择所属门店,仓库的编号是自动生成。
修改仓库:修改仓库基本信息(名称、编号、联系人、电话等)
删除仓库:仓库被引用后,则无法删除,只可停用。当仓库商品存在待入库或待出库,需完成出入库后才能停用。
仓库详情:查询仓库基本信息(名称、编号、联系人、电话等)
(三)单位管理:在[系统管理]模块下——单位管理。新增商品时需要用到基础数据单位表。
新增单位:新增单位,单位可以选择有小数或非小数。
修改单位:修改是否能有小数、单位名。
删除单位:删除时,如单位启用中、被商品引用中是无法删除。
禁用/启用:禁用后,新增商品时就无法选择到已禁用的单位。
2.3-2 经典代码
(1)邮箱的验证如下:
/// <summary>
/// 验证邮箱
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void eMail_LostFocus(object sender, RoutedEventArgs e)
{
try
{
string strEmail = eMail.Text.Trim();
if (strEmail.Length > 0)
{
使用正则表达式判断是否匹配
if (!Regex.IsMatch(strEmail, @"^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$"))
{
MessageBox.Show("Email地址有误,请重新输入!", "系统提示", MessageBoxButton.OKCancel, MessageBoxImage.Error);
eMail.Text = string.Empty;
}
}
}
catch (Exception)
{
return;
}
}
(2)邮编的验证如下图:
/// <summary>
/// 验证邮编
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Postcode_LostFocus(object sender, RoutedEventArgs e)
{
string strPostcode = Postcode.Text.Trim();
if (strPostcode.Length > 0)
{
使用正则表达式判断是否匹配
if (!Regex.IsMatch(strPostcode, @"[1-9]\d{5}(?!\d)"))
{
MessageBox.Show("邮编有误,请重新输入!", "系统提示", MessageBoxButton.OKCancel, MessageBoxImage.Error);
Postcode.Text = string.Empty;
}
}
}
邮箱和邮编的验证主要通过LostFocus事件完成。
(3)新增仓库:
/// <summary>
/// 保存按钮
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnSave_Click(object sender, RoutedEventArgs e)
{
try
{
if (!string.IsNullOrEmpty(warehouseName.Text) && !string.IsNullOrEmpty(numbering.Text))
{
string strwarehouseName = warehouseName.Text.ToString();
string strnumbering = numbering.Text.ToString();
string strNotes = Notes.Text.ToString();
bool bldefaultWarehouse = (bool)defaultWarehouse.IsChecked;
string strContact = Contact.Text.ToString();
string strphoneNumber = phoneNumber.Text.ToString();
string streMail = eMail.Text.ToString();
string strPostcode = Postcode.Text.ToString();
string strstaffAddress = staffAddress.Text.ToString();
bool blWarehouseState = (bool)WarehouseState.IsChecked;
int intStoresID = Convert.ToInt32(cbo_StoresID.SelectedValue);
DataTable dataTable = myClient.InsertWarehouse(strwarehouseName, strnumbering, strNotes, bldefaultWarehouse, strContact, strphoneNumber, streMail, strPostcode, strstaffAddress, blWarehouseState, intStoresID).Tables[0];
if (dataTable.Rows.Count > 0)
{
//获取单元格(站点ID)
int intWarehouseID = Convert.ToInt32(dataTable.Rows[0][0].ToString());
int Icount = myClient.InsertTBOTPWarehouse(intWarehouseID);
if (Icount > 0)
{
MessageBoxResult dr = MessageBox.Show("新增仓库成功!", "系统提示", MessageBoxButton.OKCancel,
MessageBoxImage.Information); //弹出确定对话框
if (dr == MessageBoxResult.OK) //如果点了确定按钮
{
//关闭当前窗口
this.Close();
}
}
else if (Icount == -1)
{
MessageBox.Show("仓库重复!", "系统提示"