智慧商贸系统

  • 1, 项目概要
  • 2, 设计与实现
    • 2.1 登录和注册
    • 2.2 期初数据录入
      • 2.2-1 功能实现
      • 2.2-2 相关业务表关系
      • 2.2-3 经典代码
    • 2.3 系统设置
      • 2.3-1 功能实现
      • 2.3-2 经典代码
    • 2.4 商品信息录入
      • 2.4-1 功能实现
      • 2.4-2 经典代码
    • 2.5 慧管客
      • 2.5-1 功能实现
      • 2.5-2 经典代码
  • 3,项目总结

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("仓库重复!", "系统提示", MessageBoxButton.OKCancel, MessageBoxImage.Error);}}}else{MessageBox.Show("仓库资料还没完整填完,请继续填写!", "系统提示", MessageBoxButton.OKCancel, MessageBoxImage.Error);}}catch (Exception ex){Console.WriteLine(ex);return;}}

(4)启用(单位表的功能):

        /// <summary>/// 启用按钮/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void QYunit_Click(object sender, RoutedEventArgs e){try{if (dgunit.SelectedItem != null){DataRowView drv = (DataRowView)dgunit.SelectedItem;int inunitID = Convert.ToInt32(drv.Row["unitID"]);int Icount = myClient.Stopunit(inunitID);if (Icount > 0){MessageBox.Show("启用成功!", "系统提示", MessageBoxButton.OK, MessageBoxImage.Information);//(4)重新绑定表格(刷新)GetData();}}else{MessageBox.Show("请选择要启动的行!", "系统提示", MessageBoxButton.OK, MessageBoxImage.Stop);}}catch (Exception){return;}}

2.4 商品信息录入

商品信息录入:录入商品时填写的基本信息有名称、单位、图片、零售价、批发价、最低售价、属性等(编号、名称、单位为必填项)

2.4-1 功能实现

(一) 商品管理页面:在[基础资料]模块下——商品列表。
新增商品:软件提供两种新增商品的方式,方式一:新增单个商品,方式二:批量导入商品。
修改商品:可以修改名称、单位、图片、零售价、批发价、最低售价、属性、商品状态等。
删除商品:删除时判断是否启用中,在进行删除。
导出:导出表数据到Excel表中。
导入:可以导入 Excel 表中的商品信息、这个功能也等于批量新增商品,。
商品分类:在商品分类区,可以点击树形筛选商品的功能

左侧是商品类别列表,可以分层次创建商品类别,右侧是与商品类别对应的商品列表。
新增单个商品:
1, 期初库存录入:录入各个仓库的期初库存量
2, 库存报警:当新增商品最高库存小于该商品的最低库存时,会出提示错误,并无法新增。
3, 仓库的选择:要先选择到门店,在选择显示出该门店下有的仓库。
4, 商品分类:新增时选择分类,新增完后就可以点击商品分类的树形,筛选出商品(新增了一台手机,分类选择电子产品,新增完后可以点击树形中的电子产品看到新增的手机)。

库存提示:最低库存是10台,当最高库存输入值小于最低库存,就会出现提示。

(二)新增华为手机成功后,可以点击树形的电子产品进行筛选。

(三)点击商品列表中的“编辑”按钮,
进入修改商品界面。在这个界面里可以修改商品的基本信息。

(四)点击商品列表中的“删除”按钮
可以删除选中的商品,启动中的商品是无法删除。在删除之前请仔细确认,一旦删除,信息 就不能恢复。

(五)批量导入商品:商品很多,可以下载导入商品的表格,在表格中录入期初的数量和单价。
1,下载模板(把模板下载到桌面,自定义编辑模板,输入自己想要的数据)

2,导入数据:完成模板下载,查看填写表格模板的注意事项,填写您的商品信息,保存表格(以基础版模板为例)

3,保存数据(多条数据新增)

新增商品后,同时要新增到商品分类下,在商品分类区可以通过点击父类进行筛选商品。商品分类的模块也需要新增分类,删除分类的功能。
(六) 商品分类:新增分类后,在[商品列表]的新增中也会跟着增加分类,删除和新增功能一致。
注意:新增分类时,要先选择父类,因为新增的分类就直接新增到选择的父类下面(选择到商品分类这个父类后,新增的分类是在商品父类下,若选择的是电子产品为父类,那么新增后的分类是在电子产品下)

新增成功后:

在[商品列表]中的商品分类同时更新,在新增商品时也可以选择到新增的分类。

(七)导出:将列表中商品的信息导出到 Excel 表中。

导出的数据可以选择,可以全部都导出,也可以通过点击树形筛选后的数据进行导出。

2.4-2 经典代码

(1)树形数据生成:
1,构建实体

        /// <summary>/// 1、构建实体/// </summary>public class ProjectModule{public int ID { get; set; }public string menuName { get; set; }public string menucode { get; set; }public string menuicon { get; set; }public int ParentId { get; set; }public List<ProjectModule> Nodes { get; set; }public ProjectModule(){//创建当前节点this.Nodes = new List<ProjectModule>();//当前父级ID为零this.ParentId = 0;//主节点的父id默认为0}}

2,绑定数据

        /// <summary>/// 2、绑定数据/// </summary>/// <returns></returns>public List<ProjectModule> GetProject(){          //获取操作模块列表DataTable dt = myClient.TreeViewCommodity().Tables[0];List<ProjectModule> dplst = new List<ProjectModule>();           //循环差集生成菜单for (int i = 0; i < dt.Rows.Count; i++){ProjectModule addProjectModule = new ProjectModule();addProjectModule.ID = Convert.ToInt32(dt.Rows[i]["modularID"]);addProjectModule.menuName = dt.Rows[i]["name"].ToString().Trim();addProjectModule.menucode = dt.Rows[i]["code"].ToString().Trim();addProjectModule.menuicon=dt.Rows[i]["icon"].ToString().Trim();addProjectModule.ParentId = Convert.ToInt32(dt.Rows[i]["f_id"]);if (Convert.ToInt32(dt.Rows[i]["f_id"]) == 0 && dt.Rows[i]["icon"] == null){//一级addProjectModule.menuicon = "/Images/png-1692.ico";}else{//二级菜单addProjectModule.menuicon = "/Images/png-1674.ico";}//把实体添加到列表中dplst.Add(addProjectModule);}return dplst;}

3, 递归生成树形数据

        /// <summary>/// 3、递归生成树形数据/// </summary>/// <param name="modularID"></param>/// <param name="Nodes"></param>/// <returns></returns>public List<ProjectModule> GetTrees(int ID, List<ProjectModule> Nodes){//实例化一个主节点,并且进行linq条件查询,为tolist列表形式。List<ProjectModule> MainNodes = Nodes.Where(x => x.ParentId == ID).ToList<ProjectModule>();//实例化一个其他节点,并且进行linq条件查询,为tolist列表形式。List<ProjectModule> OtherNodes = Nodes.Where(x => x.ParentId != ID).ToList<ProjectModule>();foreach (ProjectModule pro in MainNodes){//GetTrees递归赋值pro.Nodes = GetTrees(pro.ID, OtherNodes);}//返回主节点,跳出递归return MainNodes;}

4,页面中的树形控件

 <TreeView Grid.Row="1" Grid.Column="1" x:Name="NavigationTree" BorderThickness="0"><TreeView.ItemTemplate><HierarchicalDataTemplate ItemsSource="{Binding Nodes}"><Grid Name="SelectionModule"  ><Grid.ColumnDefinitions><ColumnDefinition Width="1*"/><ColumnDefinition Width="4*"/></Grid.ColumnDefinitions><Image Width="10" Height="10"  Source="{Binding menuicon}"  ToolTip="{Binding menucode}" /><TextBlock   Grid.Column="1" FontSize="12"  Text="{Binding menuName}" Tag="{Binding ID}"  MouseLeftButtonDown="TextBlock_MouseLeftButtonDown"/></Grid></HierarchicalDataTemplate></TreeView.ItemTemplate></TreeView>

5,把数据绑定到页面的树形控件

        /// <summary>/// 页面加载/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void UserControl_Loaded(object sender, RoutedEventArgs e){this.NavigationTree.ItemsSource = GetTrees(0, GetProject());}

(2)点击树形控件中的分类筛选商品:

        /// <summary>/// 鼠标左键按下事件(Image,TextBlock)/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void TextBlock_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e){try{   //获取当前TextBlockTextBlock txtText = sender as TextBlock;strText = txtText.Text;if (strText!="商品分类"){int intmodularID = (int)txtText.Tag;DataTable dtCo = myClient.TVontrol(intmodularID).Tables[0];//把获取到的数据绑定到表格dgCommodity.ItemsSource = dtCo.DefaultView;ConsumptionPager.ShowPages(dgCommodity, dtCo);}else{GetData();}}catch (System.Exception){return;}}

(3)导入(多条数据新增):
1,下载模板

        /// <summary>/// 下载模板/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnDownload_Click(object sender, RoutedEventArgs e){try{              //(1)、获取项目中文件(c参数:1、起始字符位置(从零开始),2、子字符串中的字符数。)string strPath = System.Windows.Forms.Application.StartupPath.Substring(0, System.Windows.Forms.Application.StartupPath.LastIndexOf(@"\"));string strEndPath = System.IO.Path.GetDirectoryName(strPath) + @"\Excel\商品信息Excel文件.xls";//(2)打开文件选择框(自行选择文件存放目录)System.Windows.Forms.FolderBrowserDialog fbd = new System.Windows.Forms.FolderBrowserDialog();fbd.ShowDialog();//获取用户选定的路径var s = fbd.SelectedPath;if (fbd.SelectedPath != string.Empty){//(3)文件Copy(复制一份到指定文件夹)//将现有文件复制到新文件。 允许覆盖同名的文件。(参数:1、要复制的文件,2、目标文件的名称,不能是目录。3、如果可以覆盖目标文件,则为 true;否则为 false。)File.Copy(strEndPath, fbd.SelectedPath + "\\商品信息Excel文件.xls", true);//(4)文件下载成功MessageBox.Show("下载完毕!", "系统提示", MessageBoxButton.OK, MessageBoxImage.Information);}}catch (Exception ex){Console.WriteLine(ex);MessageBox.Show("找不到Excel文件", "系统提示:", MessageBoxButton.OK, MessageBoxImage.Error);}}

2,导入Excel

        /// <summary>/// 导入Excel/// </summary>/// <param name="sender"></param>private void btnImport_Click(object sender, RoutedEventArgs e){try{//(1)获取Excel文件数据OpenFileDialog openFileDialog = new OpenFileDialog();openFileDialog.Title = "选择数据源文件";//标题openFileDialog.Filter = "Excel文件|*.xls|所有文件|*.*";//文件类型openFileDialog.FileName = string.Empty;//文件完整路径openFileDialog.FilterIndex = 1;//文件索引openFileDialog.Multiselect = false;//不允许用户选择多个文件openFileDialog.RestoreDirectory = true;//不实现此属性。openFileDialog.DefaultExt = "xls";//指定用来筛选显示的文件列表的默认扩展名字符串。if (openFileDialog.ShowDialog() == false){return;}//文件对话框中选定的文件的完整路径string pPath = openFileDialog.FileName;//文件完整路径//(2)、通过路径获取到的数据(调用封装公共静态方法)DataTable dt = ImportToExcel.ChangeExcelToDateTable(pPath);if (dt.Rows.Count > 0){//(3)绑定表格DataGriddgCommodityExcel.ItemsSource = dt.DefaultView;MessageBox.Show("导入成功!", "系统提示", MessageBoxButton.OK, MessageBoxImage.Information);//(4)启用按钮btnSave.IsEnabled = true;btnSave.Opacity = 1;}else{MessageBox.Show("表格无数据!", "系统提示", MessageBoxButton.OK, MessageBoxImage.Stop);}}catch (Exception ex){Console.WriteLine(ex);MessageBox.Show("数据异常", "系统提示:", MessageBoxButton.OK, MessageBoxImage.Error);}}

3,保存数据

        /// <summary>/// 保存数据/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnSave_Click(object sender, RoutedEventArgs e){try{if (dgCommodityExcel.Items.Count>0){DataTable dt = (dgCommodityExcel.ItemsSource as DataView).ToTable();int intRepeat = 0, intFail = 0;#region 创建临时表DataTable获取准确的数据DataTable dtSaveData = new DataTable();dtSaveData.Columns.Add("WarehouseID", typeof(int));dtSaveData.Columns.Add("modularID", typeof(int));dtSaveData.Columns.Add("unitID", typeof(int));dtSaveData.Columns.Add("commodityNumber", typeof(string));dtSaveData.Columns.Add("commodityName", typeof(string));dtSaveData.Columns.Add("specs", typeof(string));dtSaveData.Columns.Add("RetailPrice", typeof(Decimal));dtSaveData.Columns.Add("WholesalePrice", typeof(Decimal));dtSaveData.Columns.Add("LowestPrice", typeof(Decimal));dtSaveData.Columns.Add("MinimumInventory", typeof(Decimal));dtSaveData.Columns.Add("MaximumInventory", typeof(Decimal));dtSaveData.Columns.Add("ThePurchasePrice", typeof(Decimal));dtSaveData.Columns.Add("commodityState", typeof(bool));dtSaveData.Columns.Add("TBOTPInventoryNumber", typeof(Decimal));dtSaveData.Columns.Add("TBOTPInventoryAmount", typeof(Decimal));dtSaveData.Columns.Add("TBOTPInventoryBeginning", typeof(Decimal));dtSaveData.Columns.Add("attribute", typeof(string));//(3)DataTable增加数据,先清空行的信息dtSaveData.Rows.Clear();//清空数据for (int i = 0; i < dt.Rows.Count; i++){string strwarehouseName = dt.Rows[i]["仓库"].ToString().Trim();DataTable WarehouseID = myBLL.SelectWarehouseName(strwarehouseName).Tables[0];string strmodularName = dt.Rows[i]["商品分类"].ToString().Trim();DataTable modularID = myBLL.SelectModularFid(strmodularName).Tables[0];string strunitName = dt.Rows[i]["单位"].ToString().Trim();DataTable unitID = myBLL.SelectunitName(strunitName).Tables[0];if (WarehouseID.Rows.Count>0){//添加数据行DataRow dr = dtSaveData.NewRow();//单元格复制dr[0] =Convert.ToInt32(WarehouseID.Rows[0]["WarehouseID"]);dr[1] =Convert.ToInt32(modularID.Rows[0]["modularID"]);dr[2] =Convert.ToInt32(unitID.Rows[0]["unitID"]);dr[3] = dt.Rows[i]["商品编号"].ToString();dr[4] = dt.Rows[i]["商品名称"].ToString();dr[5] = dt.Rows[i]["规格"].ToString();dr[6] = Convert.ToDecimal(dt.Rows[i]["零售价"]);dr[7] = Convert.ToDecimal(dt.Rows[i]["批发价"]);dr[8] = Convert.ToDecimal(dt.Rows[i]["零售价"]);dr[9] = Convert.ToDecimal(dt.Rows[i]["最低售价"]);dr[10] = Convert.ToDecimal(dt.Rows[i]["最低库存量"]);dr[11] = Convert.ToDecimal(dt.Rows[i]["最高库存量"]);dr[12] = Convert.ToDecimal(dt.Rows[i]["进货价"]);dr[13] = true;dr[14] = Convert.ToDecimal(dt.Rows[i]["期初总金额"]);dr[15] = Convert.ToDecimal(dt.Rows[i]["最低库存量"]);dr[16] = Convert.ToDecimal(dt.Rows[i]["最高库存量"]);dtSaveData.Rows.Add(dr);}else{intFail += intFail;}}#endregionfor (int i = 0; i < dtSaveData.Rows.Count; i++){int intWarehouseID = Convert.ToInt32(dtSaveData.Rows[i]["WarehouseID"]);int intunitID = Convert.ToInt32(dtSaveData.Rows[i]["unitID"]);string strcommodityNumber = dtSaveData.Rows[i]["commodityNumber"].ToString().Trim();string strcommodityName = dtSaveData.Rows[i]["commodityName"].ToString().Trim();string strspecs = dtSaveData.Rows[i]["specs"].ToString().Trim();decimal deRetailPrice= Convert.ToInt32(dtSaveData.Rows[i]["RetailPrice"]);decimal deWholesalePrice = Convert.ToInt32(dtSaveData.Rows[i]["WholesalePrice"]);decimal deLowestPrice = Convert.ToInt32(dtSaveData.Rows[i]["LowestPrice"]);decimal deMinimumInventory = Convert.ToInt32(dtSaveData.Rows[i]["MinimumInventory"]);decimal deMaximumInventory = Convert.ToInt32(dtSaveData.Rows[i]["MaximumInventory"]);decimal deThePurchasePrice = Convert.ToInt32(dtSaveData.Rows[i]["ThePurchasePrice"]);bool btcommodityState= (bool)dtSaveData.Rows[i]["commodityState"];decimal deTBOTPInventoryNumber = Convert.ToInt32(dtSaveData.Rows[i]["TBOTPInventoryNumber"]);decimal deTBOTPInventoryAmount = Convert.ToInt32(dtSaveData.Rows[i]["TBOTPInventoryAmount"]);decimal deTBOTPInventoryBeginning = Convert.ToInt32(dtSaveData.Rows[i]["TBOTPInventoryBeginning"]);string strattribute = dtSaveData.Rows[i]["attribute"].ToString().Trim();DataTable dataTable = myBLL.InsertcommodityName(intWarehouseID, intunitID, strcommodityNumber, strcommodityName, strspecs, deRetailPrice, deWholesalePrice, deLowestPrice,deMinimumInventory, deMaximumInventory, deThePurchasePrice, btcommodityState, deTBOTPInventoryNumber, deTBOTPInventoryAmount, deTBOTPInventoryBeginning, strattribute).Tables[0];if (dataTable.Rows.Count > 0){//获取单元格(站点ID)int intcommodityID = Convert.ToInt32(dataTable.Rows[0][0].ToString());int intfID = Convert.ToInt32(dtSaveData.Rows[i]["modularID"]);string modularName = dtSaveData.Rows[i]["commodityName"].ToString().Trim();int Icount = myBLL.InsertmodularName(intcommodityID, intfID, modularName);if (Icount == -1){//重复条数intRepeat = intRepeat + 1;//重复/错误                            }else if (Icount > 0){MessageBoxResult dr = MessageBox.Show("导入商品成功!", "系统提示", MessageBoxButton.OKCancel,MessageBoxImage.Information); //弹出确定对话框if (dr == MessageBoxResult.OK) //如果点了确定按钮{//关闭当前窗口                  this.Close();}}else{//失败条数intFail = intFail + 1;}}}}else{MessageBox.Show("表格数据为空!", "系统提示", MessageBoxButton.OK, MessageBoxImage.Stop);}}catch (Exception ex){Console.WriteLine(ex);MessageBox.Show("数据异常!", "系统提示", MessageBoxButton.OK, MessageBoxImage.Stop);return;}}

2.5 慧管客

客户管理:客户即消费者,新增客户时编辑联系人、电话、地址等信息,可以对客户进行分类管理,可以随时查询、联系客户,更好管理客户。
供应商管理:供应商是商品采购的提供者,新增供应商时编辑联系人、电话、地址等信息,还可以对供应商进行分类管理,可以随时查询、联系供应商,更好管理供应商。

2.5-1 功能实现

(一)客户管理:在[慧管客]模块——客户管理,进入客户管理界面如图(图1)所示:

图1

从图1中左侧是客户分类列表,可以分层次创建客户类别,右侧是与客户类别对应的客户列表,客户分类也可以通过在[慧管客]模块——客户分类中,进行新增,删除分类。
在这个客户管理界面中可以进行增加客户、修改客户、删除客户、导出客户、导入客户、关联供应商的操作。
(1) 点击客户管理界面上的“新增客户”按钮,进入新增客户界面:选择客户分类,输入客户基本信息。
(2) 点击客户管理界面上的“编辑”按钮,进入修改客户页面:进入修改客户界面。在这个界面里可以修改客户的基本信息,如果客户已发生过业务,则不能修改 客户编号,否则可以修改客户编号。
(3) 点击客户管理界面上的“删除”按钮,可以删除选中的客户,已发生业务的客户不能删除。在删除之前请仔细确认,一旦删除,信息就不能恢复
(4) 点击客户管理界面上的“导出”按钮,可将客户列表中的信息导出到 Excel 表中。
(5) 点击客户管理界面上的“导入”按钮, 可以导入 Excel 表中的客户信息,导入的客户信息必须与 Excel 模板的格式一致,否则不能
(6) 点击客户管理界面上的“关联供应商”按钮,当您的客户与您的供应商为同一人,可以通过关联方式抵消彼此欠款。
(二)供应商管理:在[慧管客]模块——供应商管理,进入供应商管理界面如图(图2)所示:

图2

从图2中的左侧是供应商分类列表,可以分层次创建供应商类别,右侧是与供应商类别对应的供应商列表,供应商分类也可以通过在[慧管客]模块——供应商分类中,进行新增,删除分类。
在这个供应商管理界面中可以进行增加供应商、修改供应商、删除供应商、导出供应商、导入供应商的操作。
(1) 点击供应商管理界面上的“新增供应商”按钮,进入新增供应商界面:选择供应商分类,输入供应商基本信息。
(2) 点击供应商管理界面上的“编辑”按钮,进入修改供应商页面:进入修改供应商界面。在这个界面里可以修改供应商的基本信息,如果供应商已发生过业务,则不能修改供应商编号,否则可以修改供应商编号。
(3) 点击供应商管理界面上的“删除”按钮,可以删除选中的供应商,已发生业务的供应商不能删除。在删除之前请仔细确认,一旦删除,信息就不能恢复
(4) 点击供应商管理界面上的“导出”按钮,可将供应商列表中的信息导出到 Excel 表中。
(5) 点击供应商管理界面上的“导入”按钮, 可以导入 Excel 表中的供应商信息,导入的供应商信息必须与 Excel 模板的格式一致,否则不能
(三)关联供应商:选择要关联的供应商,点击【关联供应商】,将客户与供应商关联。关联后在客户列表或供应商可看到链接标志[关联供应商]

图3

(注意:这是选择到还没有关联供应商的客户,如选择到的客户已经关联了,再点击【关联供应商】按钮,就是显示关联供应商信息和关联前后的收欠款信息。)
(1) 开始关联:点击图3中的【关联供应商】按钮,开始关联供应商:

图4

从图2可以知道只有两个供应商,供应商GYS001已经和客户KH003关联,所以在选择关联供应商这个数据表是没有供应商GYS001选择,所以选择关联供应商只有供应商GYS002选择。
(2)关联成功:选择供应商GYS002关联,从图中可以知道供应商GYS002期初应付1000.00,我选择的是客户KH002来进行和供应商GYS002关联,客户KH002期初欠款为2000.00,所以关联成功后客户KH002的欠款应为1000.00。

图5

(3)这时候在选择到客户KH002,在点击【关联供应商】按钮就可以查看相关信息:

图6

2.5-2 经典代码

(1)、判断客户是否关联供应商,通过客户表的供应商ID是否为空来判断:

        /// <summary>/// 判断客户是否关联供应商/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void GYClien_Click(object sender, RoutedEventArgs e){try{if (dgClient.SelectedItem != null){DataRowView dvv = (DataRowView)dgClient.SelectedItem;string intvendorID = Convert.ToString(dvv.Row["vendorID"]);if (intvendorID == ""){WD_GYVendor wD_GYVendor = new WD_GYVendor(dvv);wD_GYVendor.ShowDialog();GetData();}else{WD_GLxianqing wD_GLxianqing = new WD_GLxianqing(dvv);wD_GLxianqing.ShowDialog();GetData();}}else{MessageBox.Show("请选择要关联的客户!", "系统提示", MessageBoxButton.OKCancel, MessageBoxImage.Information);}}catch (Exception){return;}}

intvendorID="“时,页面跳转WD_GYVendor(选择关联供应商页面),不等于”"就进入WD_GLxianqing(关联后的信息详情)
(2)、关联供应商

        /// <summary>/// 关联/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnSave_Click(object sender, RoutedEventArgs e){try{if (dgVendor.SelectedItem != null){DataRowView drg = (DataRowView)dgVendor.SelectedItem;int intclientID = Convert.ToInt32(DRV.Row["clientID"]);int intvendorID= Convert.ToInt32(drg.Row["vendorID"]);decimal deReceivablesBebt= Convert.ToDecimal(DRV.Row["ReceivablesBebt"]);decimal deTBOTPReceivablesBebt= Convert.ToDecimal(drg.Row["TBOTPReceivablesBebt"]);decimal deAfterOffsetting =  deReceivablesBebt- deTBOTPReceivablesBebt;int intCount = myClient.UpdateVendorID(intvendorID, deAfterOffsetting, intclientID);if (intCount > 0){int intclient = intclientID;decimal derelevancy = deAfterOffsetting;int intvendor = intvendorID;int IntCount = myClient.Updatevendors(intclient, derelevancy, intvendor);if (IntCount>0){MessageBoxResult dr = MessageBox.Show("关联供应商成功!", "系统提示", MessageBoxButton.OKCancel,MessageBoxImage.Information); //弹出确定对话框if (dr == MessageBoxResult.OK) //如果点了确定按钮{//关闭当前窗口                  this.Close();}}}}else{MessageBox.Show("请选择要关联的供应商!", "系统提示", MessageBoxButton.OK, MessageBoxImage.Information);}}catch (Exception ex){MessageBox.Show(ex.ToString(), "系统提示", MessageBoxButton.OKCancel,MessageBoxImage.Error);}}

(3)删除客户:

        /// <summary>/// 删除按钮/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void DeleteClient_Click(object sender, RoutedEventArgs e){try{//1、判断是否选中行if (dgClient.SelectedItem != null){MessageBoxResult mbr = MessageBox.Show("是否要删除当前数据,一旦删除将不能回复!", "系统提示", MessageBoxButton.OKCancel, MessageBoxImage.Error);if (mbr == MessageBoxResult.OK){DataRowView drv = (DataRowView)dgClient.SelectedItem;string blcommodityState = (string)drv.Row["commodityState"];int intclientID = Convert.ToInt32(drv.Row["clientID"]);if (blcommodityState == "禁用"){int Icount = myClient.DeleteClient(intclientID);//4、结果提示if (Icount > 0){MessageBox.Show("删除成功!", "系统提示", MessageBoxButton.OKCancel, MessageBoxImage.Error);//刷新表格数据GetData();this.NavigationTree.ItemsSource = GetTrees(0, GetProject());}else{MessageBox.Show("该客户已和供应商关联,无法删除!", "系统提示", MessageBoxButton.OKCancel, MessageBoxImage.Error);}}else{MessageBox.Show("客户使用中无法删除!", "系统提示", MessageBoxButton.OKCancel, MessageBoxImage.Error);}}}else{MessageBox.Show("请选择要删除的行!", "系统提示", MessageBoxButton.OKCancel, MessageBoxImage.Error);}}catch (Exception ex){MessageBox.Show(ex.ToString(), "系统提示", MessageBoxButton.OKCancel, MessageBoxImage.Error);}}

3,项目总结

在做这次项目时,刚开始做项目时逻辑和思维都是不成熟的,导致在做项目的一些简单的功能要做上几天,搭建页面时的一些方法也时不时要去翻阅文档查看,一些想要实现的功能特别难实现,数据库的搭建到页面的搭建因为不熟练,导致这些这么简单的前期工作都花费了不少的时间去做,但是做到后面碰到了很多次壁,修修改改了很多字段,方法后,发现只要看到项目要求的页面和功能,都能轻松写出。这次的项目完成度是不满意的,下次的项目我会更加的用心去做。在这次的项目吸取了很多的经验,总结了自己做项目时的许多不足方面,让我得到了一定的成长。

《智慧商贸系统 》项目研发总结相关推荐

  1. 《帝友货代系统》项目研发总结

    1.项目概要 系统主要功能模块有: 后台篇: (1)借贷管理篇:主要包括借款管理.收款管理.借贷设置的功能 (2)资金管理篇:主要包括资金管理.费用管理的功能 (3)认证管理篇:主要包括实名认证.学历 ...

  2. 《用友ERP房地产系统项目总结——客户管理》

    < .NET MVC用友ERP房地产系统项目总结--客户管理> 完成功能模块:首页,客户登记,新增业务列表等 一. 业务流程 二.技术点总结(事务流程.数据库): (1)事务流程:客户登记 ...

  3. 企业级FBA货代系统演示 FBA退货换标操作

    FBA英文全名为:Fulfillment by Amazon,是亚马逊提供的代发货业务出租,主要包括网店+卖流量+分仓租赁+代包装代发货+代收款这几类. 亚马逊目前主要是三块主营业务:Media(即自 ...

  4. eCargo国际货代系统之公路运输管理系统

    由于公路运输网一般比铁路.水路网的密度要大十几倍,分布面也广,因此公路运输车辆可以"无处不到.无时不有".公路运输就成为了最为方便和应用最为广泛的运输方式. 3TI Solutio ...

  5. Shopee代贴单对商家有什么好处?星卓越货代系统告诉你

    有一些新手商家在一开始做东南亚跨境电商的时候,都知道要选择一个好的货代服务系统,但实际上并没有多少商家真正了解货代服务系统是做什么的,也不了解货代里的代贴单和代打包是什么,又为什么需要代贴单和代打包, ...

  6. 选对Shopee货代对店铺影响有多大?星卓越货代系统为您分析

    做东南亚跨境电商,大部分的商家会选择做Shopee无货源模式,无货源模式中一个重要的环节就是物流运输,货物销往国外,就会需要商家先将货物送往Shopee平台转运仓,再从转运仓运至国外,那这个过程就会需 ...

  7. 东南亚跨境一件代发好用的Shopee货代系统—星卓越

    做跨境电商,需要将货物运往国外,随着做跨境电商的人越来越多,也越来越多的人需要货代这个服务.货代顾名思义就是货运代理,能够帮助商家发货,为商家节省成本和时间,省去繁琐的打包运货的过程,全面的货代服务商 ...

  8. 星卓越货代系统,东南亚跨境电商必备的物流服务系统

    之前的文章中有讲到,如今东南亚市场发展迅速,商家投身这片蓝海市场在Shopee和Lazada平台开店运营,但其中有一个难题,就是物流问题,长此以往会对商家店铺发展造成巨大的影响,而市场上许多物流公司或 ...

  9. 东南亚跨境智能仓储一体化的货代系统“星卓越”

    东南亚跨境电商的商家一定都会需要货代服务,货代服务能够更好的帮助商家解决发货物流问题,节省时间,降低出错率,提高商家运营店铺的效率,在之前的文章中也有提到过星卓越这款专注东南亚跨境电商的货代物流服务系 ...

  10. 三易通进销存系统 项目研发总结

    1.项目概要 系统主要功能模块有: (1)系统设置:主要包括商品修改.供货商设置.客户设置.vip设置.权限维护管理的功能 (2)进货管理:主要包括采购进货.采购退货.采购入库.横纵向尺码输入进货商品 ...

最新文章

  1. LeetCode 771. Jewels and Stones--Java和Python解法--简单
  2. 手机游戏深化、改革。
  3. Oracle如何监控表的DML次数
  4. 使用 ADS 渲染 SAP Adobe Form 的性能分析
  5. 一步步编写操作系统 28 cpu乱序执行
  6. 前端如何快速上手 Web 3D 游戏的开发
  7. html骨架标签 0907
  8. easymock+junit+spring学习·
  9. 智能直播审核方案:视频云智能业务截帧策略
  10. c语言函数调用用法大全,C语言函数
  11. 在ftp服务器上搜索文件名,ftp服务器上搜索文件
  12. 学好python浪漫表白,表白代码
  13. jsmind 线条_jsMind思维导图模式数据展示
  14. 鼠标键盘与计算机无法连接,蓝牙鼠标/键盘同时提示已配对 但是永远无法连接上...
  15. 网易云歌单信息爬取及数据分析(1)爬虫部分
  16. golang:%v,%+v,%#v的区别
  17. css 特效实现方法
  18. 关于手机店、电脑城,存在的物联卡的情况说明
  19. 记一次微信分享的坑,ios和安卓分享打开的url不一样
  20. 自动化测试-数据驱动

热门文章

  1. 数据传输完整性_制造系统数据完整性的特殊性(二)
  2. rlwrap工具安装
  3. 浅谈pnpm (软链接 与 硬链接)
  4. 润乾报表学习:报表在页面的样式等的调整
  5. Github使用手册
  6. MacBook 风扇控制软件 Macs Fan Control
  7. C++ 组合数 mCn
  8. Redis之下,大兵SDS的复仇之旅 !
  9. canvas 边界模糊_解决canvas画图模糊的问题
  10. SOAP-ERROR: Parsing WSDL: failed to load external entity怎么办?